移動使用者資料庫

在 SQL Server 中,您可以在 ALTER DATABASE 陳述式的 FILENAME 子句中指定新的檔案位置,以便將使用者資料庫的資料、記錄和全文檢索目錄檔案移到新位置。這種方法適用於在相同的 SQL Server 執行個體內移動資料庫檔案。若要將資料庫移到 SQL Server 的另一個執行個體或移到其他伺服器,請使用備份和還原卸離和附加作業

[!附註]

SQL Server Database Engine 的某些功能會變更 Database Engine 將資訊儲存在資料庫檔案中的方式,這些功能受限為特定版本的 SQL Server。包含這些功能的資料庫無法移至不支援它們的 SQL Server 版本。您可以使用 sys.dm_db_persisted_sku_features 動態管理檢視來列出目前資料庫中啟用的所有版本特有功能。

本主題中的程序需要資料庫檔案的邏輯名稱。若要取得該名稱,請查詢 sys.master_files 目錄檢視中的 name 資料行。

[!附註]

將資料庫移動到其他伺服器執行個體,以提供一致的經驗給使用者和應用程式時,您可能必須為資料庫重新建立部分或全部的中繼資料。如需詳細資訊,請參閱<在另一個伺服器執行個體上提供可用的資料庫時,管理中繼資料>。

計畫的重新放置程序

若要依照計畫的重新放置來移動資料或記錄檔,請遵循下列步驟:

  1. 執行下列陳述式。

    ALTER DATABASE database_name SET OFFLINE
    
  2. 將一或多個檔案移到新位置。

  3. 對於移動的每個檔案,執行下列陳述式。

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name, FILENAME = 'new_path\os_file_name' )
    
  4. 執行下列陳述式。

    ALTER DATABASE database_name SET ONLINE
    
  5. 執行下列查詢以驗證檔案變更。

    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

排程的磁碟維謢重新放置

若要在排程的磁碟維護程序中重新放置檔案,請遵循下列步驟:

  1. 對於要移動的每個檔案執行下列陳述式。

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )
    
  2. 停止 SQL Server 的執行個體或關閉系統以執行維護。如需詳細資訊,請參閱<停止服務>。

  3. 將一或多個檔案移到新位置。

  4. 重新啟動 SQL Server 的執行個體或伺服器。如需詳細資訊,請參閱<啟動和重新啟動服務>。

  5. 執行下列查詢以驗證檔案變更。

    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

失敗復原程序

如果因為硬體失敗必須移動檔案,請遵循下列步驟將檔案重新放置到新位置。

重要注意事項重要事項

如果無法啟動資料庫,也就是資料庫在質疑模式下或在無法復原的狀態下,只有 sysadmin 固定角色的成員可以移動檔案。

  1. 如果 SQL Server 的執行個體已經啟動,請將它停止。

  2. 在命令提示字元下輸入下列其中一個命令,以僅限 master 的復原模式啟動 SQL Server 的執行個體。

    • 如果是預設 (MSSQLSERVER) 執行個體,請執行下列命令。

      NET START MSSQLSERVER /f /T3608
      
    • 如果是具名執行個體,請執行下列命令。

      NET START MSSQL$instancename /f /T3608
      

    如需詳細資訊,請參閱<如何:啟動 SQL Server 的執行個體 (net 命令)>。

  3. 對於要移動的每個檔案,使用 sqlcmd 命令或 SQL Server Management Studio 來執行下列陳述式。

    ALTER DATABASE database_name MODIFY FILE( NAME = logical_name , FILENAME = 'new_path\os_file_name' )
    

    如需有關如何使用 sqlcmd 公用程式的詳細資訊,請參閱<使用 sqlcmd 公用程式>。

  4. 結束 sqlcmd 公用程式或 SQL Server Management Studio。

  5. 停止 SQL Server 的執行個體。

  6. 將一或多個檔案移到新位置。

  7. 啟動 SQL Server 執行個體。例如,請執行:NET START MSSQLSERVER。

  8. 執行下列查詢以驗證檔案變更。

    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

移動全文檢索目錄

若要移動全文檢索目錄,請使用下列步驟。請注意當您指定新目錄的位置時,只需指定 new_path,而不需指定 new_path/os_file_name。

  1. 執行下列陳述式。

    ALTER DATABASE database_name SET OFFLINE
    
  2. 將全文檢索目錄移動到新位置。

  3. 執行下列陳述式,其中 logical_name 是 sys.database_files 中的 name 資料行值,而 new_path 則是目錄的新位置。

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path')
    
  4. 執行下列陳述式。

    ALTER DATABASE database_name SET ONLINE
    

您也可以使用 CREATE DATABASE 陳述式的 FOR ATTACH 子句來移動全文檢索目錄。下列範例會在 AdventureWorks 資料庫中建立全文檢索目錄。為了將全文檢索目錄移動到新位置,將會卸離 AdventureWorks 資料庫,並將全文檢索目錄實體移動到新位置。接著指定全文檢索目錄的新位置以附加資料庫。

USE AdventureWorks;
CREATE FULLTEXT CATALOG AdvWksFtCat AS DEFAULT;
GO
USE master;
GO
--Detach the AdventureWorks database.
sp_detach_db AdventureWorks;
GO
--Physically move the full-text catalog to the new location.
--Attach the AdventureWorks database and specify the new location of the full-text catalog.
CREATE DATABASE AdventureWorks ON 
    (FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\AdventureWorks_Data.mdf'), 
    (FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\AdventureWorks_log.ldf'),
    (FILENAME = 'c:\myFTCatalogs\AdvWksFtCat')
FOR ATTACH;
GO

範例

下列範例會以計畫的重新放置,將 AdventureWorks 記錄檔移到新位置。

USE master;
GO
-- Return the logical file name.
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'AdventureWorks')
    AND type_desc = N'LOG';
GO
ALTER DATABASE AdventureWorks SET OFFLINE;
GO
-- Physically move the file to a new location.
-- In the following statement, modify the path specified in FILENAME to
-- the new location of the file on your server.
ALTER DATABASE AdventureWorks 
    MODIFY FILE ( NAME = AdventureWorks_Log, 
                  FILENAME = 'C:\NewLoc\AdventureWorks_Log.ldf');
GO
ALTER DATABASE AdventureWorks SET ONLINE;
GO
--Verify the new location.
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'AdventureWorks')
    AND type_desc = N'LOG';