web-dev-qa-db-ja.com

MS SQL Server2008の4つのシステムデータベースを復元するためのコマンドラインスクリプト

誰かがSQLServer 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の復元はそれほど簡単ではないことにすでに気づきましたが、方法が必要です...

あなたのアドバイスを楽しみにしています!

3
ciscokid

コメントで述べたように、TEMPDBをバックアップ/復元しません。

sqlservr -mコマンドの後でスクリプトを続行するには、コマンドを「バックグラウンド」にする必要があります。これを行うには、その前にあるstartコマンドを使用します。何かのようなもの:

start sqlservr -m

動作するはずです。ただし、その後は、SQL Serverが実際に起動するのを待ってから、コマンドを発行する必要があります。 Windows 2003では、これを行うためにWindows2003リソースキットからsleep.exeを取得できます。 Windows 2008では、timeout.exeコマンドを使用できます。復元を試みる前に正確にどれくらい待つかを知るために、いくつかのスタートアップの時間を計る必要があります(そして念のために少し時間を追加してください...)

ただし、msdbとモデルの復元に関しては、masterの場合と同じように、さらに2つの単純なsqlcmd復元である必要があります。また、サービスを再起動する前に、SQLServerインスタンスを停止していることを確認する必要があります。

最終的なスクリプトは次のようになります。

::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

こちらもぜひチェックしてください technetarticle も。

注:これはテストしていません。ここではsqlcmdステートメントが正しいと想定しています...

1
MattB

「taskkill/imsqlservr.exe」を使用してSQLServerエンジンを停止するのではなく、よりクリーンな方法は次のとおりです。

sqlcmd -Slocalhost -E -Q "shutdown"

「シャットダウン」は、あらゆる種類の接続を介してSQLエンジンに発行できるT-SQLコマンドであるため、シングルユーザーモードなど、「netstopmssqlserver」が機能しない場合でも機能します。管理者接続からも実行できます。 (試したことはありませんが、ストアドプロシージャでも機能する可能性があります。4月1日はとても楽しいです!)

1
David Lathrop