1.问题描述SQLServer的master数据库无法像其他用户或系统数据库一样恢复,因为SQLServer在没有活动的master数据库的情况下无法执行。虽然很少需要恢复SQLServer主数据库,但如果需要,DBA必须为这种情况做好准备。本文介绍您可能需要还原master数据库的情况以及如何正确完成这些步骤。二、解决方案1、SQLServer主数据库什么时候必须恢复?情况一:主库损坏。如果主库损坏,最佳做法通常是从备份中恢复。master中的数据是比较静态的,所以大多数情况下,丢掉几个小时的历史也无可厚非。情况二:恢复master的其他原因可能是恢复丢失的登录名并且由于某种原因无法重置密码。如果需要恢复master存储库以恢复用户数据或对象,那么这将是一个将它们从master移出并移入用户数据库的机会。2.恢复SQLServermaster数据库的两种方法恢复master数据库有两种方法。第一个只能用于在正在运行的SQLServer上恢复主数据库。如果问题是主数据库损坏,并且这种损坏会阻止SQLServer启动,则必须使用第二种方法。如果SQLServer正在运行,您可以选择使用第二种方法。先决条件:恢复最基本的先决条件是要有一个主备份副本。如果没有,先让我们把master库backupdatabasemaster压缩备份到disk='c:\master.bak';方法一:SQLSERVER实例可以正常启动将SQLServer实例置于单用户模式,使用传统的数据库恢复命令,服务器需要以单用户模式启动,否则会出现类似Msg3108,Level16的错误,State1,Line2要恢复主数据库,服务器必须运行在单用户模式下。有关以单用户模式启动的信息,请参阅联机丛书中的“如何:启动SQLServer实例(sqlservr.exe)”。消息3013,级别16,状态1,第2行RESTOREDATABASE异常终止。要以单用户模式启动SQLServer,我们使用“SQLServer配置管理器”添加适当的启动参数-m。为此,打开SQLServer配置管理器,选择SQLServer服务,然后选择适当的SQLServer实例,右键单击它并选择启动参数。作为启动参数,我们指定“-m”,这意味着该服务将以单用户模式启动。单击添加,然后单击应用,将出现以下消息。修改服务参数需要重启SQLSERVER服务才能生效。在单用户模式下使用SSMS恢复主数据库为了避免多次连接,我们将打开“SQLServerManagementStudio”但不连接到服务器。换句话说,我们将关闭“连接到服务器”窗口,同时关闭“对象资源管理器”。然后我们将单击“新建查询”。在这个新的查询窗口中,我们将连接到数据库。至此连接成功。这意味着我们设法避免了与服务器的多个连接,并为我们的查询窗口保留了一个连接。我们现在可以在查询窗口中执行我们的T-SQL恢复命令并恢复主数据库。仅当没有其他连接到服务器时,才以单用户模式连接到SQLServer。因此,请确保所有可以连接到SQLServer的服务(例如SQLServerAgent)都已停止。此外,对于来自SSMS的连接,必须消除来自SSMS的所有其他连接。关闭对象资源管理器并通过仅打开一个查询窗口进行连接可能是一种解决方案。在此之后,您可以删除启动参数并以多用户模式重新启动SQLServer。方法二:SQLSERVER实例无法启动如果服务无法启动,如何执行恢复命令?这是一个棘手的问题。我也不希望我的任何读者遇到这种情况,但如果确实发生了,这些是完成恢复要遵循的步骤。Step1找到另一个与SQLServer主版本相同的SQLServer实例。如果没有其他可用的,则可能需要快速安装SQLSERVER实例。Step2将主数据库备份还原到正在运行的SQLServer实例,就好像它是普通用户数据库一样。需要一个备用名称,例如master_recovery。从磁盘还原数据库master_recovery='c:\master.bak'将'master'移动到'C:\ProgramFiles\MicrosoftSQLServer\MSSQL13.MSSQLSERVER\MSSQL\DATA\master_recovery.mdf',将'mastlog'移动到'C:\ProgramFiles\MicrosoftSQLServer\MSSQL13.MSSQLSERVER\MSSQL\DATA\mastlog_recovery.ldf';step3现在数据库已经在线,第3步是将数据库与工作实例分离。USE[master]GOEXECmaster.dbo.sp_detach_db@dbname=N'master_recovery'GOstep4此时,2个数据库文件不再附加到SQLServer的工作实例。第4步是将2个文件移动到具有master问题的实例的服务器。step5接下来,对于第5步,必须告知遇到问题的SQLServer实例使用这些新文件而不是失败的文件。这可以通过更改SQLServer启动参数以指向这些新文件或通过将master.mdf和mastlog.ldf重命名为新名称并重命名_recovery文件以匹配默认文件名来完成。无论哪种方式,下一次服务启动都将使用新文件而不是坏文件。下面的演示是通过修改启动参数指向_recovery文件而不是默认文件。然后重新启动服务(因为它正在运行)。现在该服务正在使用恢复的主数据库而不是发生故障的主数据库。最后一步是在此主副本上运行DBCCCHECKDB。如果它显示损坏,请及时返回,直到找到正确的副本。CheckDB不能在前面的步骤中运行,因为主数据库作为用户数据库检查时会产生误报。3、SQLServer主数据库恢复时会丢失哪些数据?只是通过恢复较旧的主实例或从另一个实例获取副本来及时返回,在此切换中可能会丢失哪些数据?主库的数据大部分是静态的,但几天后回溯,还是有几样东西要查。在备份和恢复之间是否添加或删除了任何登录信息?这些将需要重新创建或删除。有人在那个窗口期间更改了密码吗?如果是这样,他们的旧密码将再次有效。是否更改了任何服务器角色分配?这些将被恢复。如果在时间窗口内添加了任何数据库,它们将不会被旧的主数据库识别。数据库文件本身并没有被删除,所以只附加了数据库。如果在此窗口期间删除了任何数据库,它们将显示为可以再次删除的可疑数据库。将恢复在sp_configure中更改的任何设置。
