有人可以给我一些关于如何恢复 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 日非常有趣!)