为Linux和Windows上的SQL Server重建系统数据库

292 阅读8分钟

本文探讨了重建系统数据库的过程--Linux和Windows上的SQL Server的主数据库、MSDB和模型。

简介

有时,你无法启动一个SQL Server实例,因为一个系统数据库(或其中一些)被损坏了。在这种情况下,有必要重建系统数据库。重建操作重置了系统数据库,并允许实例在没有任何错误的情况下上线。然而,由于你必须重置数据库中的所有数据,你必须首先确保有系统数据库备份。

如果你在没有做任何备份的情况下重建你的系统数据库,你会失去你的登录和工作。而且,如果你在重启实例后试图打开一个有数据库的实例,数据库将不可见,而SQL实例看起来就像一个新安装的实例。

在Windows和Linux的SQL实例中,系统重建数据库的过程是不同的。让我们在这篇文章中探讨一下解决方案。

在Linux和Windows上的SQL Server中重建系统数据库前需要遵循的最佳实践

在我们进行重建系统数据库之前,这里有几个考虑因素,你应该考虑在没有任何问题的情况下恢复实例。

  • 定期对系统数据库(Master, Model, and MSDB)进行全面备份。如果这些数据库被破坏了,你就不能进行数据库备份。因此,在事件发生前一定要做好预防措施。
  • 存储系统配置,如产品级别,版本,版本,整理。你可能需要在重建系统数据库后重新应用服务包或CU。

下面的T-SQL脚本使用SERVERPROPERTY()函数来捕获实例细节。你可以在Windows和Linux SQL Server上运行该脚本。

选择

SERVERPROPERTY('ProductVersion') AS ProductVersion,

SERVERPROPERTY('ProductLevel') AS ProductLevel,

SERVERPROPERTY('Edition') as Edition,

SERVERPROPERTY('ResourceVersion') AS ResourceVersion,

SERVERPROPERTY('ResourceLastUpdateDateTime') AS ResourceLastUpdateDateTime

SERVERPROPERTY('Collation') AS Collation

  • 你应该为系统数据库存储数据库文件的当前位置,重建数据库过程将这些数据库配置到原始位置。如果你在安装SQL Server后移动了系统数据库,你必须在重建后移动这些文件。

SELECT name, physical_name AS current_file_location

FROM sys.master_files

  • SQL Server从本地服务器上存在的模板文件中重新创建系统数据库。模板脚本的位置是C:\Program Files\Microsoft SQL Server\MSSQL<13>, <14>, <15> .MSSQLSERVER\MSSQL\Binn\Templates。

注意:在模板文件的位置上,按照SQL Server的版本使用正确的文件夹编号。

  • SQL Server 2016。MSSQL13
  • SQL Server 2017:MSSQL14
  • SQL Server 2019: MSSQL15

例如,在我的案例中,文件位于以下目录中。

Templates

如果这些文件不在目录中,你可以使用修复实例功能或从安装介质中手动复制这些文件。

注意:重建过程不允许指定重建哪个系统数据库,它将所有系统数据库重建到默认状态。

在我的演示实例中,我有以下用户数据库、登录和SQL代理工作。

View logins and agent jobs

按照下面的步骤,在Windows SQL Server实例中重建系统数据库。

  • 如果你在C:\Program Files\Microsoft SQL Server\MSSQL<13>, <14>, <15> .MSSQLSERVER\MSSQL\Binn\Templates目录下有系统数据库模板脚本,你可以从Setup bootstrap文件夹启动setup.exe。

在我的演示实例中,setup.exe存在于C:\Program Files\Microsoft SQL Server\150\Setup Bootstrap\SQL2019。

在Windows SQL Server中重建系统数据库的命令如下。

Setup /Q /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName /SQLSYSADMINACCOUNTS=accounts [ /SAPWD= StrongPassword ] 。

让我们在执行前了解一下这些参数和它们的值。

  • **/Q或/QUIET。**这个参数是为了在没有任何用户界面的情况下运行设置。不要使用这个参数来查看正在进行的重建工作。
  • /ACTION=REBUILDDATABASE: 它指定了SQL Server设置来重新创建系统数据库。
  • /INSTANCENAME=InstanceName。 如果你有一个默认的实例,输入MSSQLSERVER。否则,输入SQL实例的名称。
  • /SQLSYSADMINACCOUNTS=accounts。 指定需要在SYSADMIN固定服务器角色中添加的Windows组或个人账户。如果你需要多个账户,用一个空格隔开。
  • **[/SAPWD=StrongPassword]。**如果你使用一个混合认证的SQL实例,指定SA账户的复杂密码。
  • [/SQLCOLLATION=CollationName]。 如果你想改变服务器的排序,你可以使用这个参数并传递新的排序值。然而,这个参数不需要与现有的整理方式一起使用。

为了给我的演示重建系统数据库,我使用了以下脚本。

> Setup.exe /ACTION=REBUILDDATABASE /INSTANCENAME=MSSQLSERVER /SQLSYSADMINACCOUNTS=Administrator /SAPWD= Hello@123!

重建过程完成后返回到命令提示符,没有任何信息。你可以导航到setup bootstrap文件夹,检查Summary.txt日志文件。

Rebuild system databases

Summary.txt已经显示重建数据库已经成功完成。

View rebuild progress in summary.txt file

连接到SQL实例并验证数据库的连接性。实例已经启动,然而,我们在列表中没有任何用户数据库。

Connect to SQL Server and validate

重建后的任务

实例是在线的;然而,它类似于一个新的SQL Server安装。你没有用户数据库、登录、角色、代理工作等。

因此,你需要做以下重建后的任务。

恢复主数据库

要恢复主数据库,请遵循下面提到的步骤。

  • 停止SQL Server服务。你需要停止所有的SQL服务,包括代理、浏览器、报告、集成。你可以使用SQL Server配置管理或命令提示符命令 -
  • net stop mssqlserver。

Stop SQL Server

  • 以单用户模式启动SQL Server,参数为-m。它只允许一个管理员连接。因此,我们允许SQLCMD连接到SQL实例。

net start mssqlserver /m "SQLCMD"

Start SQL Server in single-user mode

  • 使用CMD连接SQL Server,用下面的脚本恢复主数据库的备份。它使用 REPLACE 关键字来替换现有的主数据库和备份。

RESTORE DATABASE master FROM DISK ="C:\Program Files\Microsoft SQL

Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\master.bak" WITH REPLACE

Restore master database

View user databases

恢复MSDB系统数据库

现在,你可以恢复MSDB数据库中的SQL Server代理工作、DB邮件、备份和恢复历史。

使用 [master]

ALTER DATABASE [msdb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE

RESTORE DATABASE [msdb] FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\msdb.bak' WITH

文件 = 1, nounload, replace, stats = 5

ALTER DATABASE [msdb] SET MULTI_USER

GO

注意: 如果你修改了SQL Server的排序,不要恢复系统数据库。否则,它将用以前的排序方式取代新的排序方式。

  • 如果你在早期为系统数据库设置了不同的路径,你可能要把它们移到新的驱动器上。
  • 如果你重建你的系统数据库,验证是必不可少的,它可以确保你在重建后不会有任何问题。

重建系统数据库 Linux上的SQL Server

SQL Server在Linux ( RedHat, Ubuntu, SUSE, and macOS )上也可以使用。像Windows一样,你可能最终会遇到一个问题,即由于主数据库的损坏,SQL服务不在线。在这种情况下,你必须在Linux上的SQL Server中重建系统数据库。

然而,在Linux上重建SQL Server的系统数据库的步骤与Windows不同。最初的要求或预防措施在Windows和Linux SQL Server中都是一样的。你应该配置定期的系统数据库备份,以便在需要重建系统数据库时恢复它们。

如下图所示,在我的演示环境中,SQL服务是在线的。

Check SQL Services in Linux

在终端中使用以下语句停止SQL服务。

sudo systemctl stop mssql-server.service

要重建Linux上SQL Server的系统数据库,我们需要运行带有强制设置参数的sqlservr。

sudo -u mssql /opt/mssql/bin/sqlservr*-force-setup*

Uses force setup parameter for rebuild in SQL Server on Linux

Rebuild progress

它用模板恢复系统数据库,并显示信息--恢复完成。按CTRL+C来关闭SQL Server。在Windows SQL Server中,我们在重建语句中指定SA密码,但SQL Server Linux使用mssql-conf工具来设置下面的SA密码。 始终为SA账户指定一个强密码。

sudo /opt/mssql/bin/mssql-conf set-sa-password

Use mssql-conf utility for SA password in SQL Server on Linux

现在,你可以启动SQL Server,验证SQL实例并执行重建后的步骤。

Connect to SQL Server on Linux

**注意:**不要重建系统数据库,直到你对SQL Server实例没有任何其他选择。

总结

这篇文章探讨了Windows SQL Server和Linux上的SQL Server重建系统数据库的问题。作为提醒,你应该始终定期进行系统数据库和配置备份,以便在出现任何意外问题时进行恢复。

Rajendra Gupta

你好!我是Rajendra Gupta,数据库专家和架构师,帮助企业快速有效地实施Microsoft SQL Server、Azure、Couchbase、AWS解决方案,修复相关问题,并以超过14年的经验进行性能调试。

我是《DP-300 Administering Relational Database on Microsoft Azure》一书的作者。我在MSSQLTips、SQLShack、Quest、CodingSight和SeveralNines上发表了650多篇技术文章。

我是最大的关于单一主题的免费在线文章集之一的创建者,他的50篇关于SQL ServerAlways On Availability Groups的系列文章。

基于我对SQL Server社区的贡献,我在2019年、2020年和2021年连续被评为SQLShack著名的年度最佳作者(排名第二),并在2020年获得MSSQLTIPS的冠军奖。

个人博客
www.dbblogger.comI

我一直对新的挑战感兴趣,所以如果你需要咨询帮助,请联系我:rajendra.gupta16@gmail.com

查看Rajendra Gupta发表的所有文章

Rajendra Gupta