在本文中,我们将讨论系统数据库的损坏问题,系统数据库的损坏味着一个或多个系统数据库已经损坏。系统数据库(如主数据库)中的损坏是一个大问题,因为SQL Server将会停止运行。让我们看看如何解决这个问题。
关于系统数据库
系统数据库是SQL Server内部使用的数据库,是其运行所必需的。
有五个系统数据库:
-
主数据库:存储SQL Server实例的系统级信息。
-
msdb数据库:它由SQL Server代理用于调度作业。
-
模型数据库:它用作创建新数据库的模板。
-
资源数据库:它存储与每个数据库的sys模式相关联的内部系统对象。
-
Tempdb数据库:它用作存储临时对象或中间结果集的空间。
在SQL Server Management Studio(SSMS)中,在对象浏览器的系统数据库文件夹下,可以找到五个系统数据库中的四个。

特别是,主数据库被视为“SQL Server引擎的核心”,因为它包含进程、锁、远程访问等信息。它还包含有关其他用户数据库的信息。如果此数据库已损坏,SQL将不会启动。
SQL Server引擎不再启动
我们经常注意到,仅仅因为数据库引擎没有启动,系统数据库就被损坏了。查看SQL Server错误日志时,会出现以下错误:
Error: 17113, Severity: 16, State: 1.
Error 2 (The system cannot find the file specified.) occurred while opening file
'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\master.mdf' to obtain configuration information at startup.
错误可能是由无效的启动选项引起的。验证您的启动选项,并在必要时更正或删除它们。
该消息表示主机。无法访问mdf文件。
在这种情况下,我们需要重建系统数据库。
重建系统数据库
注意:以下过程将重建master、model、msdb和tempdb系统数据库。我们无法指定要重建的系统数据库。重建操作将删除并重新创建系统数据库。因此,系统数据库中所做的更改将丢失,我们需要备份来恢复。
在开始这个过程之前,我们需要检查一些事情。
重建过程使用系统数据库模板文件。因此,请转到Binn\Templates文件夹并确保这些文件存在。

接下来,找到setup.exe文件。

现在,我们需要更改安装文件所在文件夹的实际路径。
为此,请打开命令提示符并键入:
Cd C:\Program Files\Microsoft SQL Server\150\Setup Bootstrap\SQL2019

现在,我们将执行设置带有一些参数的.exe文件。
以下是一些参数:
-
/QUIET —执行静默安装
-
/ACTION—设置要重建数据库的值
-
/INSTANCENAME—实例的名称
-
/SQLSYSADMINACCOUNTS—帐户的名称(帐户必须在SQL Server中具有管理员权限)
-
/SAPWD—为SA登录提供新密码(如果SA帐户被禁用并使用强密码设置,则启用SA帐户)
-
/SQLCollation—为SQL Server提供新的排序规则名称(可选)
现在键入以下命令:
Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=<XYZ> /SQLSYSADMINACCOUNTS=BUILTIN\Administrators /SAPWD=<PWD>
记住用实例名替换字符串,用密码替换字符串。
按ENTER键执行设置。
如果没有出现错误消息,则该过程成功。您已恢复实例,SQL Server将再次正常运行。
恢复主数据库和msdb数据库的备份
现在,我们的SQL Server再次运行。但是,请记住,重建操作后,对系统数据库所做的更改将丢失。
为了使系统恢复到原来的状态,我们需要恢复主数据库和msdb数据库的备份。

s参数表示实例的名称。
使用-m参数,SQL Server将仅在应用程序为SQLCMD时接受连接。
现在SQL server处于单用户模式,我们可以恢复主系统数据库。
使用sqlcmd命令,我们可以从命令行执行T-SQL命令。
在-S参数之后,写出正确的实例名。

现在我们可以恢复主数据库。为此,键入以下命令:

恢复过程完成后,SQL Server实例将关闭。
最后,像往常一样启动SQL server实例,然后恢复msdb数据库。
总结
使用上述过程,我们可以解决由于系统数据库损坏而出现的大多数问题。然而,也有一些特殊情况。例如,模型数据库可能已损坏。创建新数据库时,模型数据库将用作模板。
由于每次SQL Server启动时都会创建tempdb数据库,并且tempdb的创建需要模型数据库,因此如果模型数据库损坏,SQL Server将不会启动。在这种情况下,我们可以尝试使用跟踪标志T3608和T3609启动SQL Server,然后通过T-SQL从备份中恢复模型数据库。
[阅读更多:How to Fix Recovery Pending State in SQL Server Database and Resolving SQL Database Stuck “In Recovery” Mode(如何修复SQL Server数据库中的恢复挂起状态并解决SQL数据库卡在“恢复”模式下的问题)]
原文标题:Rebuild System Databases in SQL Server
原文作者: Priyanka Chauhan
原文链接:https://dzone.com/articles/rebuild-system-databases-in-sql-server




