移動系統數據庫在下列狀況下可能頗有用:sql
故障恢復。例如,數據庫處於可疑模式下或因硬件故障而關閉。數據庫
計劃的重定位。服務器
爲預約的磁盤維護操做而進行的重定位。ide
下列過程適用於在同一 SQL Server 實例內移動數據庫文件。若要將數據庫移動另外一個 SQL Server 實例中或另外一臺服務器上,請使用備份和還原或分離和附加操做。工具
本主題中的過程須要數據庫文件的邏輯名稱。若要獲取該名稱,請在 sys.master_files 目錄視圖中查詢名稱列。測試
預先安排的重定位與預約的磁盤維護過程日誌
若要將移動系統數據庫數據或日誌文件的操做做爲預先安排的重定位或預約的維護操做的一部分,請執行下列步驟。此過程適用於除 master 和 Resource 數據庫之外的全部系統數據庫。server
對於要移動的每一個文件,請運行如下語句。ci
ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )cmd
中止 SQL Server 實例或關閉系統以執行維護。有關詳細信息,請參閱中止服務。
將文件移動到新位置。
從新啓動 SQL Server 實例或服務器。有關詳細信息,請參閱啓動和從新啓動服務。
經過運行如下查詢來驗證文件更改。
[sql] view plaincopyprint?
SELECT name ,
physical_name AS CurrentLocation ,
state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'<database_name>') ;
若是移動了 msdb 數據庫併爲數據庫郵件配置了 SQL Server 實例,則請完成下列附加步驟。
經過運行如下查詢,驗證是否已爲 msdb 數據庫啓用 Service Broker。
[sql] view plaincopyprint?
SELECT is_broker_enabled
FROM sys.databases
WHERE name = N'msdb' ;
有關啓用 Service Broker 的詳細信息,請參閱 ALTER DATABASE (Transact-SQL)。
經過發送測試郵件驗證數據庫郵件是否正常運行。有關詳細信息,請參閱對數據庫郵件進行故障排除。
故障恢復過程
若是因爲硬件故障而必須移動文件,則請執行下列步驟,將文件從新定位到一個新位置。此過程適用於除 master 和 Resource 數據庫之外的全部系統數據庫。
重要提示
若是數據庫沒法啓動,即處於可疑模式下或處於未恢復狀態,則只有 sysadmin 固定角色的成員才能夠移動該文件。
若是啓動了 SQL Server 實例,則將其中止。
經過在命令提示符下輸入下列命令之一,在僅 master 恢復模式下啓動 SQL Server 實例。在這些命令中指定的參數區分大小寫。若是未按所示方式指定參數,則命令會失敗。
對於默認的 (MSSQLSERVER) 實例,請運行如下命令:
NET START MSSQLSERVER /f /T3608
對於命名實例,請運行如下命令:
NET START MSSQL$instancename /f /T3608
有關詳細信息,請參閱如何啓動 SQL Server 實例(net 命令)。
對於要移動的每一個文件,請使用 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 實例。例如,運行 NET STOP MSSQLSERVER。
將文件移動到新位置。
從新啓動 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>');
移動 master 數據庫
若要移動 master 數據庫,請按下列步驟進行操做。
在「開始」菜單中,依次指向「全部程序」、Microsoft SQL Server 和「配置工具」,再單擊 SQL Server 配置管理器。
在「SQL Server 服務」節點中,右鍵單擊 SQL Server 實例(如 SQL Server (MSSQLSERVER)),並選擇「屬性」。
在「SQL Server (實例名) 屬性」對話框中,單擊「高級」選項卡。
編輯「引導參數」值以指向 master 數據庫數據和日誌文件的計劃位置,而後單擊「肯定」。能夠選擇移動錯誤日誌文件。
數據文件的參數值必須跟在 -d 參數的後面,日誌文件的參數值必須跟在 -l 參數的後面。下面的示例顯示 master 數據和日誌文件默認位置的參數值。
-dC:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\
master.mdf;-eC:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\
LOG\ERRORLOG;-lC:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\
DATA\mastlog.ldf
若是 master 數據和日誌文件預先安排的重定位是 E:\SQLData,則參數值將更改成:
-dE:\SQLData\master.mdf;-eC:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\LOG\ERRORLOG;-lE:\SQLData\mastlog.ldf
經過右鍵單擊實例名稱並選擇「中止」,中止 SQL Server 實例。
將 master.mdf 和 mastlog.ldf 文件移動到新位置。
從新啓動 SQL Server 實例。
經過運行如下查詢,驗證 master 數據庫的文件更改。
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID('master');
GO
移動 Resource 數據庫
Resource 數據庫的位置爲 <drive>:\Program Files\Microsoft SQL Server\MSSQL10_50.<instance_name>\MSSQL\Binn\。沒法移動該數據庫。
示例
A. 移動 tempdb 數據庫
下面的示例將 tempdb 數據和日誌文件移動到一個新位置,做爲預先安排的重定位的一部分。
注意
因爲每次啓動 SQL Server 實例時都將從新建立 tempdb,因此沒必要實際移動數據和日誌文件。在步驟 3 中從新啓動服務時,將在新位置中建立這些文件。在從新啓動服務以前,tempdb 將繼續使用現有位置中的數據和日誌文件。
肯定 tempdb 數據庫的邏輯文件名稱以及在磁盤上的當前位置。
SELECT name, physical_name AS CurrentLocation
FROM sys.master_files
WHERE database_id = DB_ID(N'tempdb');
GO
使用 ALTER DATABASE 更改每一個文件的位置。
USE master;
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, FILENAME = 'E:\SQLData\tempdb.mdf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, FILENAME = 'F:\SQLLog\templog.ldf');
GO
中止再從新啓動 SQL Server 的實例。
驗證文件更改。
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'tempdb');
將 tempdb.mdf 和 templog.ldf 文件從其原始位置刪除。
在 SQL Server 中,經過在 ALTER DATABASE 語句的 FILENAME 子句中指定新的文件位置,能夠將用戶數據庫中的數據、日誌和全文目錄文件移動到新位置。此方法適用於在同一 SQL Server 實例中移動數據庫文件。若要將數據庫移動到另外一個 SQL Server 實例或另外一臺服務器上,請使用備份和還原或分離和附加操做。
注意
SQL Server 數據庫引擎的某些功能改變了數據庫引擎在數據庫文件中存儲信息的方式。這些功能僅限於特定的 SQL Server 版本。不能將包含這些功能的數據庫移到不支持這些功能的 SQL Server 版本。使用 sys.dm_db_persisted_sku_features 動態管理視圖可列出當前數據庫中啓用的全部特定於版本的功能。
本主題中的過程須要數據庫文件的邏輯名稱。若要獲取該名稱,請在 sys.master_files 目錄視圖中查詢名稱列。
注意
將數據庫移動到另外一個服務器實例上時,若要爲用戶和應用程序提供一致的體驗,您可能須要爲數據庫從新建立部分或所有元數據。有關詳細信息,請參閱當數據庫在其餘服務器實例上可用時管理元數據。
計劃的重定位過程
若要將移動數據或日誌文件做爲計劃的重定位的一部分,請執行下列步驟:
運行如下語句。
[sql] view plaincopyprint?
ALTER DATABASE database_name SET OFFLINE ;
將文件移動到新位置。
對於已移動的每一個文件,請運行如下語句。
[sql] view plaincopyprint?
ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name, FILENAME = 'new_path\os_file_name' ) ;
運行如下語句。
[sql] view plaincopyprint?
ALTER DATABASE database_name SET ONLINE ;
經過運行如下查詢來驗證文件更改。
[sql] view plaincopyprint?
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] view plaincopyprint?
SELECT name ,
physical_name AS CurrentLocation ,
state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'<database_name>') ;
故障恢復過程
若是因爲硬件故障而必須移動文件,則請執行下列步驟,將文件從新定位到一個新位置。
重要提示
若是數據庫沒法啓動,即處於可疑模式下或處於未恢復狀態,則只有 sysadmin 固定角色的成員才能夠移動該文件。
若是啓動了 SQL Server 實例,則將其中止。
經過在命令提示符下輸入下列命令之一,在僅 master 恢復模式下啓動 SQL Server 實例。
對於默認的 (MSSQLSERVER) 實例,請運行如下命令。
[sql] view plaincopyprint?
NET START MSSQLSERVER /f /T3608
對於命名實例,請運行如下命令。
NET START MSSQL$instancename /f /T3608
有關詳細信息,請參閱如何啓動 SQL Server 實例(net 命令)。
對於要移動的每一個文件,請使用 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>');
移動全文目錄
若要移動全文目錄,請執行下列步驟。請注意,指定新的目錄位置時,只指定 new_path,而不是指定 new_path/os_file_name。
運行如下語句。
ALTER DATABASE database_name SET OFFLINE
將全文目錄移動到新位置。
運行下列語句,其中:logical_name 是 sys.database_files 中 name 列的值,new_path 是目錄的新位置。
ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path');
運行如下語句。
ALTER DATABASE database_name SET ONLINE;
另外,也可使用 CREATE DATABASE 語句的 FOR ATTACH 子句移動全文目錄。下面的示例在 AdventureWorks2008R2 數據庫中建立一個全文目錄。若要將全文目錄移動到新位置,請分離 AdventureWorks2008R2 數據庫,並將全文目錄從物理意義上移動到新位置。而後附加數據庫,並指定全文目錄的新位置。
[sql] view plaincopyprint?
USE AdventureWorks2008R2 ;
CREATE FULLTEXT CATALOG AdvWksFtCat AS DEFAULT ;
GO
USE master ;
GO
--Detach the AdventureWorks2008R2 database.
sp_detach_db AdventureWorks2008R2 ;
GO
--Physically move the full-text catalog to the new location.
--Attach the AdventureWorks2008R2 database and specify the new location of the full-text catalog.
CREATE DATABASE AdventureWorks2008R2 ON
(FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\AdventureWorks2008R2_Data.mdf'),
(FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\AdventureWorks2008R2_log.ldf'),
(FILENAME = 'c:\myFTCatalogs\AdvWksFtCat') FOR ATTACH ;
GO
示例
下面的示例將 AdventureWorks2008R2 日誌文件移動到一個新位置,做爲計劃的重定位的一部分。
[sql] view plaincopyprint?
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' ;