本文探讨了在Linux和Windows上为SQL Server重建系统数据库(Master、MSDB和Model)的过程。
介绍
有时,您无法启动SQL Server实例,因为系统数据库(或其中一些数据库)已损坏。在这种情况下,需要重建系统数据库。重建操作重置系统数据库,并允许实例在没有任何错误的情况下联机。但是,由于必须重置数据库中的所有数据,因此必须首先确保有系统数据库备份。
如果在不制作任何备份副本的情况下重建系统数据库,您将丢失登录和作业。如果在重新启动实例后尝试打开具有数据库的实例,则数据库将不可见,并且SQL实例看起来像是新安装的实例。
Windows和Linux SQL实例中的系统重建数据库过程不同。让我们在本文中探讨解决方案。
在Linux和Windows上的SQL Server中重建系统数据库之前应遵循的最佳做法
在我们继续重建系统数据库之前,您应该考虑以下几点,以便无任何问题地恢复实例。
-
对系统数据库(主数据库、模型数据库和MSDB)进行定期完整备份。如果这些数据库已损坏,则无法进行数据库备份。因此,在发生事故之前,务必采取预防措施。
-
存储系统配置,如产品级别、版本、版本、排序规则。重建系统数据库后,可能需要重新应用Service Pack或CU。
下面的T-SQL脚本使用SERVERPROPERTY()函数捕获实例细节。您可以在Windows和Linux SQL Server上运行该脚本。
SELECT
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>。MSSQL Server\MSSQL\Binn\Templates。
注意:根据SQL Server版本为模板文件位置使用正确的文件夹编号。
-
SQL Server 2016:MSSQL 13
-
SQL Server 2017:MSSQL 14
-
SQL Server 2019:MSSQL 15
例如,在我的例子中,文件位于以下目录中。

如果这些文件不在目录中,您可以使用修复实例功能或从安装介质手动复制这些文件。
注意:重建过程不允许指定要重建的系统数据库,它会将所有系统数据库重建为其默认状态。
在我的演示实例中,我有以下用户数据库、登录和SQL代理作业。

在Windows SQL Server上重建系统数据库的步骤
按照以下步骤在Windows SQL Server实例中重建系统数据库。
- 如果在C:\Program Files\Microsoft SQL Server\MSSQL<13>、<14>、<15>.MSSQLSERVER\MSSQL\Binn\Templates目录中有可用的系统数据库模板脚本,则可以启动安装程序。exe从安装引导文件夹中删除。
在我的演示实例中,设置。exe出现在C:\Program Files\Microsoft SQL Server\150\Setup Bootstrap\SQL2019中。
在Windows SQL Server中重建系统数据库的命令如下所示。
Setup/Q/ACTION=REBUILDDATABASE/INSTANCENAME=INSTANCENAME/sqlsysadmincounts=accounts[/SAPWD=strong密码]
让我们在执行之前了解参数及其值。
-
/Q或/安静:此参数用于在没有任何用户界面的情况下运行设置。请勿使用此参数查看正在进行的重建。
-
/ACTION=REBUILDDATABASE:它指定重新创建系统数据库的SQL Server设置。
-
/INSTANCENAME=INSTANCENAME:如果有默认实例,请输入MSSQLSERVER。否则,请输入SQL实例名称。
-
/sqlsysadmincounts=accounts:指定需要添加到SYSADMIN固定服务器角色中的Windows组或单个帐户。如果需要多个帐户,请用空格分隔。
-
[/SAPWD=StrongPassword]:如果使用混合身份验证SQL实例,请为SA帐户指定复杂密码。
-
[/SQLCOLLATION=CollationName]:如果要更改服务器排序规则,可以使用此参数并传递新的排序规则值。但是,与现有排序规则一起使用时不需要此参数。
为了为我的演示重建系统数据库,我使用了以下脚本。
Setup.exe/ACTION=REBUILDDATABASE/INSTANCENAME=MSSQLSERVER/sqlsysadmincounts=Administrator/SAPWD=Hello@123!
重建过程完成并返回命令提示符,无需任何消息。您可以导航到setup bootstrap文件夹并检查Summary.txt日志文件。

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

连接到SQL实例并验证数据库连接。实例已启动,但是,列表中没有任何用户数据库。

重建后任务
实例在线;但是,它类似于新的SQL Server安装。您没有用户数据库、登录、角色、代理作业等。
因此,您需要执行以下重建后任务。
还原主数据库
要恢复主数据库,请执行以下步骤。
-
停止SQL Server服务:您需要停止所有SQL服务,包括代理、浏览器、报告和集成。您可以使用SQL Server配置管理或命令提示符命令–
-
net停止mssqlserver。

-
使用参数-m以单用户模式启动SQL Server。它只允许单个管理员连接。因此,我们允许SQLCMD连接到SQL实例。
mssqlserver/m“SQLCMD”的净启动

- 使用CMD连接SQL Server,并使用以下脚本还原主数据库备份。它使用REPLACE关键字将现有主数据库替换为备份。
RESTORE DATABASE master FROM DISK ="C:\Program Files\Microsoft SQL
Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\master.bak" WITH REPLACE


恢复MSDB系统数据库
现在,您可以为SQL Server代理作业、数据库邮件、备份和恢复历史恢复MSDB数据库。
USE [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
FILE = 1, NOUNLOAD, REPLACE, STATS = 5
ALTER DATABASE [msdb] SET MULTI_USER
GO
注意:如果修改了SQL Server排序规则,请不要还原系统数据库。否则,它将用以前的排序规则替换新排序规则。
-
如果之前系统数据库有不同的路径,则可能需要将它们移动到新驱动器。
-
如果重建系统数据库,验证是必不可少的,它可以确保重建后没有任何问题。
在Linux上重建SQL Server系统数据库
SQL Server也可以在Linux(RedHat、Ubuntu、SUSE和macOS)上运行。与Windows一样,由于主数据库损坏,最终可能会出现SQL服务无法联机的问题。在这种情况下,您必须在Linux上的SQL Server中重建系统数据库。
但是,在Linux上为SQL Server重建系统数据库的步骤与Windows不同。在Windows和Linux SQL Server中,初始要求或注意事项保持不变。您应该配置常规系统数据库备份,以在需要重建系统数据库时还原它们。
如下所示,在我的演示环境中,SQL服务是在线的。

在终端中使用以下语句停止SQL服务:
sudo systemctl stop mssql-server.service
要在Linux上的SQL Server中重建系统数据库,我们需要使用force setup参数运行sqlservr。
sudo -u mssql /opt/mssql/bin/sqlservr –force-setup


它使用模板恢复系统数据库,并显示消息恢复完成。按CTRL+C关闭SQL Server。我们在Windows SQL Server中的rebuild语句期间指定SA密码,但SQL Server Linux使用mssql conf实用程序设置下面的SA密码。始终为SA帐户指定强密码。
sudo /opt/mssql/bin/mssql-conf set-sa-password

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

注意:在没有SQL Server实例的任何其他选项之前,不要重建系统数据库。
结论
本文探讨了在Linux上为Windows SQL Server和SQL Server重建系统数据库。作为提醒,您应该始终定期进行系统数据库和配置备份,以在发生任何意外问题时进行恢复。
查看更多
ApexSQL Complete是一个SQL代码完整工.具,包括代码段、SQL自.动替换、选项卡导航、保存的查询等功能,适用于SSM和Visual Studio。
作者相关

你好我是Rajendra Gupta,数据库专家和架构师,拥有超过14年的经验,帮助企业快速高效地实施Microsoft SQL Server、Azure、Couchbase、AWS解决方案,修复相关问题,并进行性能调整。
我是《DP-300在Microsoft Azure上管理关系数据库》一书的作者。我发表了超过650篇关于MSSQLStips、SQLShack、Quest、CodingSight和多个链接的技术文章。
我是关于一个主题的最大免费在线文章集之一的创作者,他在SQL Server上的50篇系列文章总是关于可用性组。
基于我对SQL Server社区的贡献,我在2019年、2020年和2021连续获得SQLShack年度最佳作者奖(第二名),并在2020年获得MSSQLSTIPS冠军奖。
个人博客:https://www.dbblogger.com
我总是对新的挑战感兴趣,所以如果您需要咨询帮助,请联系我:rajendra.gupta16@gmail.com。
原文标题:Rebuild system databases for SQL Server on Linux and Windows
原文作者:Rajendra Gupta
原文链接:https://www.sqlshack.com/rebuild-system-databases-for-sql-server-on-linux-and-windows/




