SQL
データベースの復帰
まず、バックアップファイルに含まれているファイルのリストを確認します。ファイル名はフルパスで指定します。通常ならばバックアップとリストアは同じSQLサーバの同じデータベースに対して行うので障害になることはありませんが、他のマシンでバックアップファイルからデータベースを復元するときは注意が必要です。バックアップファイルに含まれる実ファイル名が、復帰しようとしているデータベースの実ファイル名と一致していないときは、後述のmoveを使用します。
use DatabaseName
go
restore filelistonly from disk = 'BackupFileName'
exec sp_helpfile
次にsp_whoを実行して、復帰しようとしているデータベースにログインしているユーザーがいないことを確認します。
use master
go
exec sp_who
sp_whoの結果にはspidが含まれているので、もしデータベースにログインしているユーザーがいたら、そのプロセスを削除します。
kill spid
データベースを復帰します。この操作はmasterデータベースで行う必要があります。また、トランザクション下では行えません。
use master
go
restore database DatabaseName from disk = 'BackupFileName'
バックアップファイルに含まれる実ファイル名とデータベースの実ファイル名が一致していない場合は、moveを使用してどのファイルを復帰するのか指定します。通常プライマリとログの2つを指定します。サンプルコードのLogicalNameはバックアップファイルに含まれている論理ファイル名、PhysicalNameはデータベースで使用している実ファイル名です。
restore database DatabaseName from disk = 'BackupFileName'
with move 'LogicalName' to 'PhysicalName', move 'LogicalName' to 'PhysicalName'
続けてトランザクション・ログを復帰するときはnorecoveryとrecoveryを使い分けます。norecoveryは復帰後にコミットされていないトランザクションをそのままにしておくことを指示し、recoveryは復帰後にコミットされていないトランザクションをロールバックさせることを指示します。デフォルトはrecoveryです。ここでは最後にrecoveryを指定してコミットされていないトランザクションをロールバックするように指示していますが、最後のトランザクション・ログを復帰するときにnorecoveryを指定しないようにしても良いです。
restore database DatabaseName from disk = 'BackupFileName' with norecovery
restore log DatabaseName from disk = 'TransactionLogFileName' with norecovery
restore log DatabaseName from disk = 'TransactionLogFileName' with norecovery
restore log DatabaseName from disk = 'TransactionLogFileName' with norecovery
...
restore database with recovery