重建SQL Server的master数据库(一)
2008-09-27 10:05:26 来源:WEB开发网问题
最近我面临着一种情况,随着我们的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'')BEGINSELECT ''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'')BEGINSELECT ''EXEC sp_attach_db ''''?'''','''''' + RTRIM(filename) + '''''',''FROM [?]..sysfilesWHERE fileid = (SELECT MIN(fileid) FROM [?]..sysfiles)UNION ALLSELECT '''''''' + RTRIM(filename) + ''''''''FROM [?]..sysfilesWHERE fileid > (SELECT MIN(fileid) FROM [?]..sysfiles) ANDfileid < (SELECT MAX(fileid) FROM [?]..sysfiles)UNION ALLSELECT '''''''' + RTRIM(filename) + ''''''''FROM [?]..sysfilesWHERE 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 需要有关的系统数据库审查这一话题。
更多精彩
赞助商链接