SQLSERVER2005遷移到新的服務器上(在新的服務器上恢復)
當原先服務器出現故障,已經無法啟動。需要將整個SQLSERVER系統緊急遷移到一台備用服務器上,那么這個遷移步驟怎樣做呢?
在說之前復習一下各個系統數據庫的主要作用,以便大家更清楚恢復這些系統數據庫的好處
master:記錄SQLSERVER系統的所有系統級信息
model:在SQLSERVER實例上為所有數據庫創建的模版
msdb:SQLSERVER代理用來安排警報和作業以及記錄操作員信息的數據庫,msdb數據庫還包含歷史記錄表,錯誤頁suspect_page 以及備份和還原歷史記錄表
resource:包含SQLSERVER附帶的所有系統對象副本的只讀數據庫,resource數據庫是不能備份的,而且在SSMS里是看不見的
tempdb:用於保存臨時或中間結果集的工作空間。每次啟動SQLSERVER實例時SQLSERVER都會根據model數據庫為藍本重新創建此數據庫。
服務器實例關閉時,將永久刪除tempdb數據庫中的所有數據
---------------------------------------------------------華麗的分割線-----------------------------------------------------------------------
好了,現在進入正題:
先說一下具體環境:
操作系統Windows2003企業版SP2;
備用服務器名字叫:SQL2005PC;
SQLSERVER是默認實例;
數據庫:SQL2005企業版
備用服務器和原服務器不同名,SQLSERVER安裝的路徑也不一樣。(備用服務器安裝路徑為c:\Program Files\Microsoft SQL Server\
MSSQL.4\MSSQL)
現在手頭有最新的master,msdb,model數據庫備份,以及其他所有用戶數據庫備份
將系統數據庫恢復,以還原所有數據庫系統信息(用戶,密碼,任務等) ,然后才能恢復用戶數據庫
在這種情況下,恢復系統數據庫需要修改系統數據庫路徑,還要修改SQLSERVER記錄下自己的服務器名字
友情提示:
注意:命令行下運行的指令是大小寫敏感的!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
------------------------------------------------------------------華麗的分割線----------------------------------------------------------------
正式開始拉!!不好意思讓大家久等了
1、確認備用服務器的SQL版本和原服務器一致
1 SELECT @@VERSION
返回的號碼必須跟原先服務器返回的號碼完全一樣
2、確保你備用服務器的SQLSERVER在啟動的時候沒有程序連接進來,不然的話等一下連接數據庫的時候就會報錯
以下是錯誤消息:
消息 18461,級別 14,狀態 1,服務器 XXX,第 1 行
用戶 'XXX\Administrator' 登錄失敗。原因: 服務器處於單用戶模式。目前只有一位管理員能夠連接
要解決這個問題,你需要在打開SSMS的時候使用下面的sql語句看一下有哪些程序連接進來
1 SELECT * FROM sys.sysprocesses WHERE spid>50
下圖是本人之前因為沒有停止SSRS導致連接不上SQLSERVER,后來關掉SSRS就行了
3、在備用服務器的命令行窗口,用指令以單用戶模式啟動SQL服務
--net start MSSQLSERVER /m
4、在命令行窗口,用sqlcmd這個命令行工具連接SQL
sqlcmd /E /S sql2005pc
5、首先恢復master數據庫
(1)在sqlcmd下
1 RESTORE DATABASE master FROM DISK='c:\lab\master.bak'
SQL服務自動停止
(2)由於恢復的master數據庫里記載其他數據庫的路徑和現在的路徑不一致,這時候重新啟動SQLSERVER會失敗,必須用跟蹤標志3608來啟動
1 net start MSSQLSERVER /f /m /T3608
(3)用sqlcmd連接修改其他數據庫的文件路徑到現有的正確路徑
1 sqlcmd /E /S sql2005pc
用下面的語句修改各個系統數據庫的文件路徑
1 --resource數據庫 2 ALTER DATABASE mssqlsystemresource MODIFY FILE(NAME=DATA,FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\mssqlsystemresource.mdf') 3 GO 4 5 ALTER DATABASE mssqlsystemresource MODIFY FILE(NAME=LOG,FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\mssqlsystemresource.ldf') 6 GO
1 --msdb數據庫 2 ALTER DATABASE msdb MODIFY FILE(NAME=MSDBData,FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\msdbdata.mdf') 3 GO 4 5 ALTER DATABASE msdb MODIFY FILE(NAME=MSDBLog,FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\msdblog.ldf') 6 GO
1 --model數據庫 2 ALTER DATABASE model MODIFY FILE(NAME=modeldev,FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\model.mdf') 3 GO 4 5 ALTER DATABASE model MODIFY FILE(NAME=modellog,FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\modellog.ldf') 6 GO
1 --tempdb數據庫 2 ALTER DATABASE tempdb MODIFY FILE(NAME=tempdev,FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\tempdb.mdf') 3 GO 4 5 ALTER DATABASE tempdb MODIFY FILE(NAME=templog,FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\templog.ldf') 6 GO
(4)退出sqlcmd
exit
(5)關閉SQLSERVER
1 net stop MSSQLSERVER
(6)用正常模式啟動SQLSERVER
1 net start MSSQLSERVER
6、除了master數據庫之外其他系統數據庫都是備用服務器的,要用生產服務器上的備份來替換他們
1 --恢復msdb數據庫 2 --關閉SQL Agent 用restore命令恢復msdb 3 RESTORE DATABASE msdb FROM DISK='c:\lab\msdb.bak' 4 WITH move 'MSDBData' TO 'C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\msdbdata.mdf', 5 MOVE 'MSDBLog' TO 'C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\msdblog.ldf' ,REPLACE
1 --恢復model數據庫 2 RESTORE DATABASE model FROM DISK='c:\lab\model.bak' 3 WITH move 'modeldev' TO 'C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\model.mdf', 4 MOVE 'modellog' TO 'C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\modellog.ldf' ,REPLACE
為什麽resource數據庫跟tempdb數據庫不用還原呢?前面已經說過
resource:包含SQLSERVER附帶的所有系統對象副本的只讀數據庫,resource數據庫是不能備份的,而且在SSMS里是看不見的
tempdb:用於保存臨時或中間結果集的工作空間。每次啟動SQLSERVER實例時SQLSERVER都會根據model數據庫為藍本重新創建此數據庫。
服務器實例關閉時,將永久刪除tempdb數據庫中的所有數據
7、修改服務器名稱
(1)運行下面的語句你發現返回的是生產服務器名字,因為master數據庫從那台機器來的
1 SELECT @@SERVERNAME
(2)運行下面語句修改服務器名
1 EXEC sys.sp_dropserver @server = '原先服務器名' 2 GO 3 EXEC sys.sp_addserver @server = 'SQL2005PC' 4 GO
(3)重啟SQLSERVER服務,再運行下面的語句就可以返回現在的服務器名字
1 SELECT @@SERVERNAME 2 GO
最后依次將用戶數據庫恢復就可以了
為了確保安全起見,最好將生產服務器上的所有系統數據庫的恢復模式設置為:完整恢復!!!!!
大功告成了,可以下班了 o(∩_∩)o 哈哈