用于恢复 MS SQL Server 2008 的 4 个系统数据库的命令行脚本

用于恢复 MS SQL Server 2008 的 4 个系统数据库的命令行脚本

有人可以给我一些关于如何恢复 SQL Server 2008 的 4 个系统数据库(master、msdb、model、tempdb)的建议吗?

我已经自己做了一些测试(恢复主数据库),结果使用以下命令行脚本:

::set variables
set dbname=master
set dbdirectory=C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA
title Restoring %dbname% database
net stop mssqlserver
cd C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn
sqlservr -m
sqlcmd -Slocalhost -E -Q "restore database master from disk='c:\master.bak' WITH REPLACE" 
net start mssqlserver
pause

执行命令后sqlservr -m(用于以单用户模式启动服务器实例,这仅在恢复 MASTER 数据库时才需要),脚本停止。因此,为了执行最后 2 个命令,我需要将脚本分成 2 个较小的脚本,然后一个接一个地运行它们。

有人知道如何将它们合并为一个可以完全不间断运行的单一脚本吗?

我还想使用类似这样的命令行脚本恢复其他 3 个系统数据库。有人能告诉我该怎么做吗?我已经注意到恢复 temdb 并不容易,但一定有办法……

期待您的建议!

答案1

正如评论中所提到的 - 您没有备份/恢复 TEMPDB。

要使脚本在sqlservr -m命令之后继续运行,您需要将命令“置于后台”。为此,请使用start它前面的命令。例如:

start sqlservr -m

应该可以工作。但之后,您需要等待 SQL Server 实际启动,然后才能发出任何命令。在 Windows 2003 上,您可以sleep.exe 从 Windows 2003 资源工具包中获取此信息。在 Windows 2008 上,您可以使用命令timeout.exe。您需要对几次启动进行计时,以了解在尝试恢复之前需要等待多长时间(并增加一点时间,以防万一……)

至于恢复 msdb 和 model,它应该是 2 个更简单的 sqlcmd 恢复,就像您对 master 所做的那样。您还需要确保在重新启动服务之前停止 SQL Server 实例。

最终脚本看起来将会像这样:

::set variables
set dbdirectory=C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA
title Restoring system databases
net stop mssqlserver
cd C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn
start sqlservr -m
timeout /t 60
sqlcmd -Slocalhost -E -Q "restore database master from disk='c:\master.bak' WITH REPLACE" 
sqlcmd -Slocalhost -E -Q "restore database msdb from disk='c:\msdb.bak' WITH REPLACE" 
sqlcmd -Slocalhost -E -Q "restore database model from disk='c:\model.bak' WITH REPLACE" 
taskkill /im sqlservr.exe
net start mssqlserver
pause

一定要看看这个technet 文章也一样。

注意:我没有测试过这个,我假设你的sqlcmd陈述是正确的......

答案2

除了使用“taskkill /im sqlservr.exe”来停止 SQL Server 引擎之外,更简洁的方法如下:

sqlcmd -Slocalhost -E -Q "shutdown"

“shutdown” 是一个 T-SQL 命令,可以通过任何类型的连接向 SQL 引擎发出,因此即使“net stop mssqlserver”不起作用(例如在单用户模式下),它也能正常工作。它也可以从管理员连接中完成。(我还没有尝试过,但它甚至可能在存储过程中起作用。4 月 1 日非常有趣!)

相关内容