程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 重建SQL Server的master數據庫(一)

重建SQL Server的master數據庫(一)

編輯:關於SqlServer

問題

最近我面臨著一種情況,隨著我們的SQL Server群集的發展,我不得不重建master數據庫上的一個節點,之所以這樣做是因為服務器的排序規則要求其中的一個數據庫依賴於服務器上的主機。當排序規則改變的時候,不會對當前的數據庫實例造成任何問題,所以我可以放心的改變這些實例的服務器排序規則。操作的過程非常的簡單,一切准備就緒後,出現錯誤的機會就會非常低,但是你仍然需要在快速重建之前做好其它的准備,做出這樣的准備非常關鍵,因為一旦你重建了master數據庫,你將會發現一個問題,不再涉及到登錄!呀!是的,重建就相當於從DVD中重新獲取了一個新的master數據庫。所以,你如何准備重建一個master數據庫,而且接下來你又如何做?希望如下的內容對你有所啟發。

解決方案

以上所述,下面的步驟就為你演示如何為重建的master數據庫做准備。在每一個步驟裡我都會向你呈現出腳本,然後運行它們,它們主要就是用來將收集的數據在你恢復好master數據庫後快速的重建。

在以後的話題中我們將會闡述實時的數據重建過程,在此我們主要是把重點放在手頭上准備好的數據重建方面。

准備工作

首先最主要的就是在master數據庫已經重建後,把手頭上准備好的數據應用到master數據庫中,如果沒有這些數據,你將不得不去做些許多手工性的操作,才可以再次讓你的服務器運行正常。所以,在每一個步驟裡,我們將看到你所需要的數據,以及在重建之前您如何在你的服務器上運行這些腳本。

在運行之前,我們可以選擇(按Ctrl - T ),把這些數據的查詢結果輸出到文本文件,這樣您可以輕松地保存輸出結果。

任務 步驟
腳本 "使所有的用戶數據庫分離" 在重建master數據庫前,您需要分離出實例中的所有的用戶數據庫,腳本提供的執行如下:
--代碼開始

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
腳本 "附加上所有的用戶數據庫" 在重建master數據庫後,您需要附加上所有先前你分離的用戶數據庫, 您還需要注意,當你附加數據庫時,“dbo”的前綴名將隨著默認的登錄腳本執行。因此,你需要的不僅僅是附加過程的腳本,而且也意味著所有權發生了變化。附加上所有的用戶數據庫代碼如下,保存結果為1.sql
--代碼開始

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

--代碼結束
腳本 "所有的登錄" master數據庫是合乎邏輯的存放SQL實例的所有的系統對象。(物理存放地址是在資源數據庫在SQL 2005中。)當master數據庫重建所做的任何更改和數據存放,因為安裝而丟失。這些項目將會在重建後被替換。最主要的就是這些項目類型實例的登錄。以下腳本將為您恢復您的所有登錄後的重建進程: http://support.microsoft.com/kb/918992包含腳本建立兩個存儲過程: sp_hexadecimal和sp_help_revlogin 。能過下載腳本,在master數據庫中運行並且創建存儲過程,然後運行下面的腳本,采用這些存儲過程的腳本登錄對應的每個數據庫, SQL實例:--代碼開始 EXEC dbo.sp_help_revlogin   --代碼結束確保更改輸出的查詢為文字或者文件,以便您可以在重建後運行此腳本。 這個操作過程,我們把此文件命名為2.sql.
腳本 "DBO 混淆的用戶數據庫" 把下面的這些重建"dbo"的混淆腳本為3.sql
--代碼開始

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

--代碼結束
腳本 "所有的 Securables" 任何的安全授予等級是必要的,因為這些信息也存儲在master數據庫中。數據庫securables將保留在數據庫本身。我發現代碼這裡找到,是由Pedro Lopes編寫及完善這一任務的。我的建議是限制的結果只針對系統的數據庫,用戶數據庫用它們完整的securables權限再次附加。 保存此輸出的腳本文件為4.sql 。
腳本 "在master和msdb數據庫的Custom對象 " 經常,我們的數據庫管理員發現我們創建的對象,如sp_hexadecimal 和sp_help_revlogin 存儲過程,可是我們已經在系統數據庫中已經很早就創建了,當然,如果你想重新創建這些對象,你需要在重建後,遵循為每個對象提供相同的過程。
腳本 "其它的對象" 對於每一個下面這樣的類型您需要在重建後重新創建的master數據庫(System Objects, SQL Agent Jobs, Operators)都需要執行下面的步驟:

在對象的資源管理器中選取一個對象

右擊並且選取腳本進行創建

選擇文件

注意在重建後文件名恢復過程

如果沒有上述的操作准備後,如果對master數據庫進行重建,你就需要通過大量的手工操作讓您的服務器的用戶處在等待狀態,雖然這是一項把數據取出來放在一起的應用,但這些步驟也可以在容災恢復中加以應用,這樣您手頭上那些數據就可以通過恢復master數據庫就可以了。

總結

l 在這一點上你准備重建master數據庫。這一系列的下一個話題將要概括的引導您通過恢復數據庫和對象後重建的過程。

l sp_MSforeachdb可以徹底解釋這一話題。

l 需要有關的系統數據庫審查這一話題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved