在本文中,我们将讨论系统数据库损坏。这意味着一个或多个系统数据库已损坏。系统数据库(例如主数据库)中的损坏是一个大问题,因为 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.无效的启动选项可能会导致错误。验证您的启动选项,并在必要时更正或删除它们。
该消息表明 master.mdf 文件不可访问。
在这种情况下,我们需要重建系统数据库。
重建系统数据库
注意: 以下过程将重建 master、model、msdb 和 tempdb 系统数据库。我们无法指定要重建的系统数据库。重建操作删除并重新创建系统数据库。因此,对系统数据库所做的更改将会丢失,我们需要备份来恢复。
在开始这个过程之前,我们需要检查一些事情。
重建过程使用系统数据库模板文件。因此,请转到\Binn\Templates文件夹并确保这些文件存在。

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

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

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

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

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

还原过程完成后,SQL Server 实例将关闭。
最后,像往常一样启动 SQL Server 实例,然后恢复 msdb 数据库。
结论
使用上述过程,我们可以解决由于系统数据库损坏而出现的大部分问题。 但是,也有一些特殊情况。例如,模型数据库可能已损坏。模型数据库用作创建新数据库时的模板。
由于每次SQL Server启动都会创建tempdb数据库,而tempdb的创建需要model数据库,所以如果model数据库损坏,SQL Server将无法启动。在这种情况下,我们可以尝试使用跟踪标志 -T3608 和 -T3609 启动 SQL Server,然后通过 T-SQL 从备份中恢复模型数据库。
文章来源:https://dzone.com/articles/rebuild-system-databases-in-sql-server




