因應叢集擴充需變更伺服器定序,必須重建 master 資料庫。重建相當於從安裝媒體重新部署系統資料庫,所有登入、作業、連結伺服器等中繼資料將遺失。本文詳細說明重建前的完整準備工作,包含分離資料庫、產生還原腳本,確保重建後能快速恢復原狀。
重建前必須分離所有使用者資料庫,保護資料檔案 (.mdf/.ldf) 不受影響。
DECLARE @Command_Detach VARCHAR(1000)
SELECT @Command_Detach = '
IF N''[?]'' NOT IN(''model'',''master'',''msdb'',''tempdb'')
BEGIN
SELECT ''EXEC usp_KillDBConnections ''''?'''''
EXEC sp_detach_db ''''?'''',''''true''''
END'
EXEC sp_MSforeachdb @Command_Detach
輸出結果存為 0.sql,重建前執行。
重建後需重新附加資料庫。注意附加後擁有者可能變為 dbo,需同步處理擁有權變更。
DECLARE @Command_Attach VARCHAR(1000)
SELECT @Command_Attach = '
IF N''[?]'' NOT IN(''model'',''master'',''msdb'',''tempdb'')
BEGIN
SELECT ''EXEC sp_attach_db ''''?'''',''
'''''' + RTRIM(filename) + '''''',''
FROM [?]..sysfiles
WHERE fileid = (SELECT MIN(fileid) FROM [?]..sysfiles)
UNION ALL
SELECT '''''''' + RTRIM(filename) + ''''''''
FROM [?]..sysfiles
WHERE fileid > (SELECT MIN(fileid) FROM [?]..sysfiles) AND
fileid < (SELECT MAX(fileid) FROM [?]..sysfiles)
UNION ALL
SELECT '''''''' + RTRIM(filename) + ''''''''
FROM [?]..sysfiles
WHERE fileid = (SELECT MAX(fileid) FROM [?]..sysfiles)
END'
EXEC sp_msforeachdb @Command_Attach
輸出結果存為 1.sql,重建後執行。
登入資訊儲存於 master,重建後遺失。使用 Microsoft 官方腳本 sp_help_revlogin (KB918992) 產生重建登入的 T-SQL。
sp_hexadecimal、sp_help_revlogin 兩個預存程序EXEC dbo.sp_help_revlogin附加資料庫後,dbo 對應的登入可能不正確,需產生 sp_changedbowner 腳本修正。
DECLARE @Command_dbo VARCHAR(1000)
SELECT @Command_dbo = '
use [?]
DECLARE @Owners TABLE (dbid int, dbname varchar(100), loginname varchar(100))
INSERT INTO @Owners (dbid, dbname, loginname)
SELECT DB_ID(), DB_NAME(), SL.[name]
FROM sysusers SU LEFT JOIN master..syslogins SL ON SU.sid = SL.sid
WHERE SU.[name] = ''dbo''
SELECT ''EXEC [?].dbo.sp_changedbowner N'''''' + loginname + '''''', '' + ''false''
FROM @Owners WHERE dbid = DB_ID()'
EXEC sys.sp_MSforeachdb @Command_dbo
輸出結果存為 3.sql,重建後執行。
系統資料庫 (master、msdb、model) 的權限設定重建後遺失。使用 Pedro Lopes 提供的腳本產生權限重建 T-SQL,僅針對系統資料庫 (使用者資料庫隨附加自動保留)。
輸出結果存為 4.sql,重建後執行。
如自建的預存程序、函數 (sp_hexadecimal、sp_help_revlogin 等),重建後需重新建立。使用 SSMS 物件總管 → 右鍵 → Script Object As → CREATE To → File,逐一存檔。
同樣使用 SSMS 產生 CREATE 腳本存檔,重建後依序執行。
完成上述 7 項準備,即擁有重建 master 後全量恢復執行個體所需的所有腳本。這套流程不僅適用於定序變更,也是災難恢復 (DR) 的標準作業程序。下一篇將實際演示重建執行與恢復流程。