暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【译】在 SQL Server 中重建系统数据库

原创 李华 2022-06-29
616

原文链接:https://dzone.com/articles/rebuild-system-databases-in-sql-server
作者:Priyanka Chauhan

在本文中,我们将讨论系统数据库损坏。这意味着一个或多个系统数据库已损坏,系统数据库(例如主数据库)中的损坏是一个大问题,因为 SQL Server 将停止。让我们看看如何解决这个问题。

关于系统数据库

系统数据库是 SQL Server 内部使用的数据库,是其运行所必需的。

有五个系统数据库:

  • 主数据库:存储 SQL Server 实例的系统级信息。
  • msdb 数据库:SQL Server 代理使用它来调度作业。
  • 模型数据库:用作创建新数据库的模板。
  • 资源数据库:它存储与每个数据库的 sys 模式相关联的内部系统对象。
  • Tempdb数据库:用作存储临时对象或中间结果集的空间。

在 SQL Server Management Studio (SSMS) 中,在对象资源管理器的系统数据库文件夹下,您可以找到五个系统数据库中的四个。

企业微信截图_20220629152313.png
特别是,主数据库被认为是“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 文件夹并确保这些文件存在。

1.png

接下来,找到 setup.exe 文件。
3.png
现在,我们需要更改安装文件所在文件夹的实际路径。

为此,请打开命令提示符并键入:
Cd C:\Program Files\Microsoft SQL Server\150\Setup Bootstrap\SQL2019
4.png
现在,我们将执行带有一些参数的 setup.exe 文件。

这些是一些参数:

/QUIET — 执行静默安装
/ACTION — 将值设置为 RebuildDatabase
/INSTANCENAME — 实例的名称
/SQLSYSADMINACCOUNTS — 帐户的名称(帐户必须在 SQL Server 中具有管理员权限)
/SAPWD — 为 SA 登录提供新密码(如果 SA 帐户被禁用并使用强密码设置,则启用它)
/SQLCollat​​ion — 为 SQL Server 提供新的排序规则名称(可选)
现在输入以下命令:

Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=<XYZ> /SQLSYSADMINACCOUNTS=BUILTIN\Administrators /SAPWD=<PWD>

请记住将 字符串替换为实例名称,将 字符串替换为密码。

按 ENTER 执行设置。

如果没有错误消息出现,则该过程成功。您已恢复您的实例,SQL Server 将再次运行。

恢复 Master 和 msdb 数据库的备份
现在我们的 SQL Server 再次运行。但是,请记住,在重建操作之后,对系统数据库所做的更改将会丢失。

为了让系统恢复原状,我们需要恢复 master 和 msdb 数据库的备份。

为此,请以单用户模式启动 SQL Server。

打开命令行提示符,然后使用以下参数启动 SQL Server:
5.png
-s 参数表示实例的名称。

使用 -m 参数,如果应用程序是 SQLCMD,SQL Server 将只接受连接。

现在 SQL Server 处于单用户模式,我们可以恢复主系统数据库。

使用 sqlcmd 命令,我们可以从命令行执行 T-SQL 命令。

在 -S 参数之后,写入正确的实例名称。

6.png
现在我们可以恢复主数据库了。为此,请键入以下命令:
7.png
还原过程完成后,SQL Server 实例将关闭。

最后,像往常一样启动 SQL Server 实例,然后恢复 msdb 数据库。

结论
使用上述过程,我们可以解决由于系统数据库损坏而出现的大部分问题。但是,也有一些特殊情况。例如,模型数据库可能已损坏。模型数据库用作创建新数据库时的模板。

由于每次SQL Server启动都会创建tempdb数据库,而tempdb的创建需要model数据库,如果model数据库损坏,SQL Server将无法启动。在这种情况下,我们可以尝试使用跟踪标志 -T3608 和 -T3609 启动 SQL Server,然后通过 T-SQL 从备份中恢复模型数据库。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论