分享方式:


移動使用者資料庫

適用於:SQL Server

在 SQL Server 中,您可在 ALTER DATABASE 陳述式的 FILENAME 子句中指定新的檔案位置,從而將使用者資料庫的資料、記錄和全文檢索目錄檔案移至新位置。 此方法適用於在相同執行個體 SQL Server 內移動資料庫檔案。 若要將資料庫移至另一個 SQL Server 執行個體或另一部伺服器,請使用 [備份與還原] 或 [中斷連結和連結作業]

注意

本文涵蓋移動使用者資料庫檔案。 如需移動系統資料庫檔案,請參閱<移動系統資料庫>。

考量

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

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

本文中的程式需要資料庫檔案的邏輯名稱。 若要取得名稱,請在 sys.master_files 目錄檢視中查詢名稱資料行。

全文檢索目錄會整合到資料庫中,而不是存放在檔案系統中。 當您移動資料庫時,全文檢索目錄會自動移動。

注意

確認用於設定 Windows 服務帳戶與權限的服務帳戶具有檔案系統中新檔案位置的權限。 如需詳細資訊,請參閱<設定資料庫引擎對檔案系統的存取權限>。

計劃內重新放置程序

若要在計劃內重新放置程序中移動資料或記錄檔,請遵循下列步驟:

  1. 若要移動每個檔案,請執行下列陳述式。

    ALTER DATABASE database_name
        MODIFY FILE (NAME = logical_name, FILENAME = 'new_path\os_file_name');
    
  2. 執行下列陳述式,使資料庫離線。

    ALTER DATABASE database_name
        SET OFFLINE;
    

    此動作需要資料庫的獨佔存取權。 如果資料庫的另一個連線已開啟,則會封鎖 ALTER DATABASE 陳述式,直至所有連線關閉。 若要覆寫此行為,請使用 WITH <termination> 子句。 例如,若要自動復原並中斷資料庫的所有其他連線,請使用:

    ALTER DATABASE database_name
         SET OFFLINE
         WITH ROLLBACK IMMEDIATE;
    
  3. 將一個或多個檔案移至新位置。

  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 的執行個體或關閉系統即可執行維護。 如需詳細資訊,請參閱啟動、停止、暫停、繼續和重新啟動 SQL Server 服務

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

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

  5. 執行下列查詢來確認檔案變更。

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

失敗復原程序

如果由於硬體故障而必須移動檔案,請使用下列步驟,將檔案重新放置到新位置。

重要

如果無法啟動資料庫,且資料庫處於可疑模式或未復原狀態,則只有系統管理員固定角色的成員才能移動檔案。

  1. 如果 SQL Server 執行個體已啟動,則停止該執行個體。

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

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

範例

做為計劃內重新放置的一部分,下列範例會將 AdventureWorks2022 記錄檔移至新位置。

  1. 確認您在 master 資料庫的內容中。

    USE master;
    GO
    
  2. 傳回邏輯檔案名稱。

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'AdventureWorks2022')
          AND type_desc = N'LOG';
    GO
    
  3. 將資料庫設定為離線。

    ALTER DATABASE AdventureWorks2022
        SET OFFLINE;
    GO
    
  4. 將檔案實際移至新位置。 在下列語句中,將 FILENAME 中指定的路徑修改到伺服器上檔案的新位置。

    ALTER DATABASE AdventureWorks2022
        MODIFY FILE (NAME = AdventureWorks2022_Log, FILENAME = 'C:\NewLoc\AdventureWorks2022_Log.ldf');
    GO
    
    ALTER DATABASE AdventureWorks2022
        SET ONLINE;
    GO
    
  5. 確認新位置。

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'AdventureWorks2022')
          AND type_desc = N'LOG';