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

Bra*_*adC 13 sql-server corruption master-system-database

帮助!我的主数据库损坏了,我什至无法使 SQL 实例联机!我有哪些选项可以让我的服务器备份?

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

(注意:我不指定 SQL 版本的这个问题,以便作为更广泛适用的参考。在 DBA.SE 上有一些类似的问题,但没有涉及服务器无法启动的问题。)

Bra*_*adC 14

以下是我要调查的一些途径。不要全部这些(其中一些是实现相同目的的不同技术),但值得考虑:

1.直接查看SQL错误日志

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

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

这是SQL server 启动选项完整列表,包括-m(单用户模式)和-f(最小配置模式)。其他选项允许您指定 master 数据库的路径(如果这是问题的话)。

如果您能够启动该实例,请按照您链接的 MSDN 文章中的步骤来恢复主数据库,或Thomas LaRock 的详细演练

如果另一个应用程序总是先于您获取单用户连接,请首先禁用 SQL 代理,使其不会启动。其次,请参阅此问题上使用-m"Application Name"参数指定应用程序名称的想法

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

我只发现了其他提到的这种未记录的技术,但我在上周末成功地使用了它,所以它可能值得一试。

如果您无法在单用户模式下启动该实例,您有另一个运行完全相同 release 和 build 的SQL 实例,请尝试将最后一个已知良好的主数据库备份从您的死服务器恢复到另一个实例:

  • 恢复为不同的名称,当然 ( 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 进行全新的恢复。不确定这是否必要,因为我们非常小心地不更改master.

4. 重建系统数据库

如果您没有运行相同版本的另一个实例,或者您对使用 #3 中列出的未记录过程感到不舒服,或者您没有备份master为什么没有备份??),您可以从原始安装盘重建 SQL 系统数据库

Setup.exe /ACTION=REBUILDDATABASE /...
Run Code Online (Sandbox Code Playgroud)

完成后,您可以按照之前链接的步骤master从上次好的备份中恢复。您还需要恢复最近的备份msdb以保留所有作业、作业计划和作业历史记录。

5. 将所有 USER 数据库恢复到一个新的(或现有的)SQL 实例

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

如果您的新(或重新安装)实例可以访问同一个磁盘,那么将它们作为新数据库简单地附加会快得多:

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

6. 重新做任何更改 master

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

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

没有什么神奇的方法可以找到这些,如果您有此类更改,您必须返回自己公司的文档记录。