主数据库已损坏,实例无法启动-我有什么选择?


11

救命!我的主数据库已损坏,我什至无法使SQL实例联机!我有什么选择来备份服务器?

我确实有master的备份,但是MSDN页面“还原master数据库”要求我以单用户模式启动实例,而我做不到!

(注意:我没有针对SQL版本指定这个问题,以便成为更广泛应用的参考。关于DBA.SE也有一些类似的问题,但是没有涉及服务器无法启动的问题。)


(当然欢迎提出评论或其他答案,但我想这样做是为了提供一个全面的答案,包括一些我在网上其他地方找不到的方面。)
BradC

Answers:


12

这是我要调查的一些途径。不要做所有这些事情(其中一些是实现同一目的的不同技术),但是值得考虑:

1.直接检查SQL错误日志

直接浏览到包含SQL错误日志的文件夹,然后将最新日志加载ERRORLOG到记事本中,以获取有关SQL实例为何不启动的更多详细信息。也许您会发现问题根本不在master数据库上。

2.尝试以单用户模式启动实例

这是SQL Server启动选项完整列表,包括-m(单用户模式)和-f(最低配置模式)。如果存在问题,则其他选项可让您指定master数据库的路径。

如果您能够启动实例,请按照您链接的MSDN文章中的步骤还原主数据库,或者执行Thomas LaRock的详细操作

如果另一个应用程序总是先抓住单个用户连接,请首先禁用SQL Agent,以使其无法启动。其次,请参见有关使用-m"Application Name"参数指定应用程序名称的问题。

3.还原master到另一个实例并复制其文件

我仅发现了另一种提及该未记录技术的信息,但在上个周末我成功地使用了它,因此值得一试。

如果您无法以单用户模式启动实例,但是又有另一个SQL实例运行完全相同的发行版和build,请尝试将最后一个已知的良好的master数据库备份从死服务器还原到另一个实例:

  • 当然,请使用其他名称还原(master_please_god_let_this_work),WITH MOVE这样就不会master在您的优质服务器上覆盖
  • 恢复WITH NORECOVERY。不确定是否需要这样做,但让我感觉更好,因为我知道其他服务器不会更改已还原的主服务器中的任何内容
  • 将其设置为离线: ALTER DATABASE [master_please_god_let_this_work] SET OFFLINE
  • 将还原的MDF和LDF文件从正常服务器复制到无效服务器
  • 根据需要重命名master.mdfmastlog.ldf文件,以用已还原的版本替换错误的主文件
  • 双手合十并启动实例
  • 可选:在已恢复的服务器上进行主数据库的全新还原。不确定这样做是否必要,因为我们非常小心不要更改master

4.重建系统数据库

如果您没有其他实例运行相同版本,或者您不习惯使用#3中列出的无证程序,或者没有备份master为什么没有备份?),您可以从原始安装磁盘重建SQL系统数据库

Setup.exe /ACTION=REBUILDDATABASE /...

完成此操作后,您可以按照先前链接的步骤master从上次正常备份中还原。您还需要还原的最新备份,msdb以保留所有作业,作业计划和作业历史记录。

5.将所有USER数据库还原到新的(或现有的)SQL实例

如果您有另一个现有实例正在运行(适当的SQL版本,足够的磁盘空间),则在进行上述其他故障排除步骤时,我可能会从最新备份开始数据库还原,以防万一我需要它们。

如果新的(或重新安装的)实例可以访问同一磁盘,则将它们简单地附加为新数据库的速度会更快:

CREATE DATABASE foo 
ON (FILENAME = 'D:\data\foo.mdf'),
   (FILENAME = 'D:\data\foo_log.ldf')
FOR ATTACH;

6.重新做任何更改 master

一旦成功还原master(通过上述任何一种技术),就需要调查可能丢失的任何更改(如果这些更改是在刚还原的备份之后进行的):

  • 安全变更
  • 新数据库(文件仍将保留在磁盘上,只需附加它们)
  • 服务器范围的设置

找不到这些方法的神奇方法,如果有这些更改,则必须回到自己公司的文档记录中进行这些更改。


1
好贴。+1。我进行了一次测试,破坏了我的主服务器,将备份还原到另一台服务器上,然后将文件复制到旧服务器上。它没有问题。顺便说一句,主机损坏时出现错误3411。
Racer SQL

太好了,谢谢您验证该技术。就我而言,我从未遇到实际错误,但是我的主数据库需要花费数小时才能恢复,远远超出了任何可能的群集服务超时设置。
BradC

1
@RafaelPiccinelli主服务器保留有关服务器上所有内容(安全性,其他数据库等)的“元数据”,因此这很有意义。参见我的第5点和第6点。您将必须重新连接这些数据库,并重新设置所有已有的安全性。顺便说一句,希望您能在实验室环境中完成所有这些工作!!
BradC

是的,这就是测试的原因。我收到一个错误,但可能是我的存储空间中有权限。再次,不错的帖子。我只会删除这最后一条评论哈哈。
Racer SQL

2

我只是想添加一个可能遇到的问题和解决方案-在累积更新(SQL2016 CU12)失败以及事件查看器和错误日志中的消息中出现了类似的情况,其中说“无法恢复主数据库。SQLServer是无法运行。请从完整备份还原master,对其进行修复或重建。”但是,我最终发现,如果仅重新运行CU可执行文件,它将检测到升级状态为“未完全安装”,并允许我简单地运行再次更新,此后它成功完成,并且master数据库和所有其他数据库都正常打开。


很好的补充;感谢您加入。
BradC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.