移動使用者資料庫
適用於:SQL Server
在 SQL Server 中,您可在 ALTER DATABASE 陳述式的 FILENAME 子句中指定新的檔案位置,以將使用者資料庫的資料、日誌和全文檢索目錄檔案移至新位置。 此方法適用於在相同執行個體 SQL Server 內移動資料庫檔案。 若要將資料庫移至另一個 SQL Server 執行個體或另一部伺服器,請使用 [備份與還原] 或 [中斷連結和連結作業]。
注意
本文涵蓋移動使用者資料庫檔案。 如需移動系統資料庫檔案,請參閱移動系統資料庫。
考量
將資料庫移至另一個伺服器執行個體時,為了提供使用者和應用程式的一致體驗,您可能必須為資料庫重新建立部分或所有中繼資料。 如需詳細資訊,請參閱在另一個伺服器執行個體上提供可用的資料庫時管理中繼資料 (SQL Server)。
SQL Server 資料庫引擎的某些功能可變更資料庫引擎將資訊存放在資料庫檔案的方式。 這些功能限於特定版本的 SQL Server。 包含這些功能的資料庫無法移至不支援這些功能的 SQL Server 版本。 使用 sys.dm_db_persisted_sku_features
動態管理檢視,來列出目前資料庫中啟用的所有版本特定功能。
本文中的程式需要資料庫檔案的邏輯名稱。 若要取得名稱,請在 sys.master_files 目錄檢視中查詢名稱資料行。
自 SQL Server 2008 R2 (10.50.x) 開始,全文檢索目錄會整合到資料庫中,而不是存放在檔案系統中。 當您移動資料庫時,全文檢索目錄現在會自動移動。
注意
請確定 SQL Server Database Services 服務的服務帳戶具有檔案系統中新檔案位置的權限。 如需詳細資訊,請參閱設定資料庫引擎對檔案系統的存取權限。
計劃內重新放置程序
若要在計劃內重新放置程序中移動資料或記錄檔,請遵循下列步驟:
若要移動每個檔案,請執行下列陳述式。
ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name, FILENAME = 'new_path\os_file_name' );
執行下列陳述式,使資料庫離線。
ALTER DATABASE database_name SET OFFLINE;
此動作需要資料庫的獨佔存取權。 如果資料庫的另一個連線已開啟,則會封鎖 ALTER DATABASE 陳述式,直至所有連線關閉。 若要覆寫此行為,請使用
WITH <termination>
子句。 例如,若要自動回復並中斷資料庫的所有其他連線,請使用:ALTER DATABASE database_name SET OFFLINE WITH ROLLBACK IMMEDIATE;
將一個或多個檔案移至新位置。
執行下列陳述式。
ALTER DATABASE database_name SET ONLINE;
執行下列查詢來確認檔案變更。
SELECT name, physical_name AS CurrentLocation, state_desc FROM sys.master_files WHERE database_id = DB_ID(N'<database_name>');
排程磁碟維護重新放置
若要在排程磁碟維護程序中重新放置檔案,請遵循下列步驟:
若要移動每個檔案,請執行下列陳述式。
ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' );
停止 SQL Server 的執行個體,或關閉系統以執行維護。 如需詳細資訊,請參閱 启动、停止、暂停、继续、重启 SQL Server 服务。
將一個或多個檔案移至新位置。
重新啟動 SQL Server 或伺服器的執行個體。 如需詳細資訊,請參閱啟動、停止、暫停、繼續、重啟 SQL Server Browser 服務
執行下列查詢來確認檔案變更。
SELECT name, physical_name AS CurrentLocation, state_desc FROM sys.master_files WHERE database_id = DB_ID(N'<database_name>');
失敗復原程序
如果由於硬體故障而必須移動檔案,請使用下列步驟,將檔案重新放置到新位置。
重要
如果無法啟動資料庫,且資料庫處於可疑模式或未復原狀態,則只有系統管理員固定角色的成員才能移動檔案。
如果 SQL Server 執行個體已啟動,請停止。
在命令提示字元中輸入下列其中一個命令,以僅限主要執行個體修復模式啟動 SQL Server 的執行個體。
針對預設的 (MSSQLSERVER) 執行個體,執行下列命令。
NET START MSSQLSERVER /f /T3608
如果是具名執行個體,請執行下列命令。
NET START MSSQL$instancename /f /T3608
如需詳細資訊,請參閱 启动、停止、暂停、继续、重启 SQL Server 服务。
若要移動每個檔案,請使用 sqlcmd 命令或 SQL Server Management Studio 來執行下列陳述式。
ALTER DATABASE database_name MODIFY FILE( NAME = logical_name , FILENAME = 'new_path\os_file_name' );
如需如何使用 sqlcmd 公用程式的詳細資訊,請參閱使用 sqlcmd 公用程式。
離開 sqlcmd 公用程式或 SQL Server Management Studio。
停止 SQL Server 的執行個體。
將一個或多個檔案移至新位置。
啟動 SQL Server 的執行個體。 例如,執行:
NET START MSSQLSERVER
。執行下列查詢來確認檔案變更。
SELECT name, physical_name AS CurrentLocation, state_desc FROM sys.master_files WHERE database_id = DB_ID(N'<database_name>');
範例
做為計劃內重新放置的一部分,下列範例會將 AdventureWorks2022
記錄檔移至新位置。
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'AdventureWorks2022')
AND type_desc = N'LOG';
GO
ALTER DATABASE AdventureWorks2022 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 AdventureWorks2022
MODIFY FILE ( NAME = AdventureWorks2022_Log,
FILENAME = 'C:\NewLoc\AdventureWorks2022_Log.ldf');
GO
ALTER DATABASE AdventureWorks2022 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'AdventureWorks2022')
AND type_desc = N'LOG';
另請參閱
意見反映
https://aka.ms/ContentUserFeedback。
即將推出:我們會在 2024 年淘汰 GitHub 問題,並以全新的意見反應系統取代並作為內容意見反應的渠道。 如需更多資訊,請參閱:提交及檢視以下的意見反映: