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

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

原创 eternity 2022-08-17
1273

本文探讨了在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

例如,在我的例子中,文件位于以下目录中。
微信图片_20220817074715.png

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

注意:重建过程不允许指定要重建的系统数据库,它会将所有系统数据库重建为其默认状态。

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

微信图片_20220817074755.png

在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日志文件。
微信图片_20220817075117.png

Summary.txt显示重建数据库已成功完成。
微信图片_20220817075215.png

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

重建后任务

实例在线;但是,它类似于新的SQL Server安装。您没有用户数据库、登录、角色、代理作业等。

因此,您需要执行以下重建后任务。

还原主数据库

要恢复主数据库,请执行以下步骤。

  • 停止SQL Server服务:您需要停止所有SQL服务,包括代理、浏览器、报告和集成。您可以使用SQL Server配置管理或命令提示符命令–

  • net停止mssqlserver。
    微信图片_20220817075345.png

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

mssqlserver/m“SQLCMD”的净启动

微信图片_20220817075432.png

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

微信图片_20220817075531.png

微信图片_20220817075546.png

恢复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服务是在线的。

微信图片_20220817075724.png

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

sudo systemctl stop mssql-server.service

要在Linux上的SQL Server中重建系统数据库,我们需要使用force setup参数运行sqlservr。

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

微信图片_20220817075849.png

微信图片_20220817075905.png

它使用模板恢复系统数据库,并显示消息恢复完成。按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

微信图片_20220817080002.png

现在,您可以启动SQL Server、验证SQL实例并执行重建后步骤。
微信图片_20220817080039.png
注意:在没有SQL Server实例的任何其他选项之前,不要重建系统数据库。

结论

本文探讨了在Linux上为Windows SQL Server和SQL Server重建系统数据库。作为提醒,您应该始终定期进行系统数据库和配置备份,以在发生任何意外问题时进行恢复。

查看更多

ApexSQL Complete是一个SQL代码完整工.具,包括代码段、SQL自.动替换、选项卡导航、保存的查询等功能,适用于SSM和Visual Studio。

作者相关

微信图片_20220817080303.png

你好我是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/

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

评论