移動使用者資料庫

在 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>');
    

範例

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

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'AdventureWorks2008R2')
    AND type_desc = N'LOG';
GO
ALTER DATABASE AdventureWorks2008R2 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 AdventureWorks2008R2 
    MODIFY FILE ( NAME = AdventureWorks2008R2_Log, 
                  FILENAME = 'C:\NewLoc\AdventureWorks2008R2_Log.ldf');
GO
ALTER DATABASE AdventureWorks2008R2 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'AdventureWorks2008R2')
    AND type_desc = N'LOG';