本文探讨了重建系统数据库的过程--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
例如,在我的案例中,文件位于以下目录中。
如果这些文件不在目录中,你可以使用修复实例功能或从安装介质中手动复制这些文件。
注意:重建过程不允许指定重建哪个系统数据库,它将所有系统数据库重建到默认状态。
在我的演示实例中,我有以下用户数据库、登录和SQL代理工作。
按照下面的步骤,在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日志文件。
Summary.txt已经显示重建数据库已经成功完成。
连接到SQL实例并验证数据库的连接性。实例已经启动,然而,我们在列表中没有任何用户数据库。
重建后的任务
实例是在线的;然而,它类似于一个新的SQL Server安装。你没有用户数据库、登录、角色、代理工作等。
因此,你需要做以下重建后的任务。
恢复主数据库
要恢复主数据库,请遵循下面提到的步骤。
- 停止SQL Server服务。你需要停止所有的SQL服务,包括代理、浏览器、报告、集成。你可以使用SQL Server配置管理或命令提示符命令 -
- net stop mssqlserver。
- 以单用户模式启动SQL Server,参数为-m。它只允许一个管理员连接。因此,我们允许SQLCMD连接到SQL实例。
net start 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系统数据库
现在,你可以恢复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服务是在线的。
在终端中使用以下语句停止SQL服务。
sudo systemctl stop mssql-server.service
要重建Linux上SQL Server的系统数据库,我们需要运行带有强制设置参数的sqlservr。
sudo -u mssql /opt/mssql/bin/sqlservr*-force-setup*
它用模板恢复系统数据库,并显示信息--恢复完成。按CTRL+C来关闭SQL Server。在Windows SQL Server中,我们在重建语句中指定SA密码,但SQL Server Linux使用mssql-conf工具来设置下面的SA密码。 始终为SA账户指定一个强密码。
sudo /opt/mssql/bin/mssql-conf set-sa-password
现在,你可以启动SQL Server,验证SQL实例并执行重建后的步骤。
**注意:**不要重建系统数据库,直到你对SQL Server实例没有任何其他选择。
总结
这篇文章探讨了Windows SQL Server和Linux上的SQL Server重建系统数据库的问题。作为提醒,你应该始终定期进行系统数据库和配置备份,以便在出现任何意外问题时进行恢复。
你好!我是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