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

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

我已经使用以下commad脚本脚本自己(在恢复master数据库时)自己做了一些testing:

::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并不是那么容易,但必须有一种方法…

期待您的咨询!

正如在评论中提到的 – 你不要备份/恢复TEMPDB。

要在sqlservr -m命令之后继续执行脚本,需要“背景”命令。 为此,请使用前面的start命令。 就像是:

 start sqlservr -m 

应该pipe用。 但是,之后,您将需要等待SQL Server实际启动,然后再发出任何命令。 在Windows 2003上,您可以从Windows 2003 Resource Kit中获取sleep.exe来执行此操作。 在Windows 2008上,您可以使用timeout.exe命令。 在尝试恢复之前,您需要让一些初创公司了解需要等待多长时间的想法(并增加一点时间,以防万一)

至于恢复msdb和模型虽然,它应该是2更简单的sqlcmd恢复,就像你有一个主人。 在重新启动服务之前,还需要确保停止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文章以及。

注意:我没有testing这个,我假设你的sqlcmd语句在这里是正确的…

而不是“taskkill / im sqlservr.exe”来停止SQL Server引擎,更简洁的方法如下:

 sqlcmd -Slocalhost -E -Q "shutdown" 

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