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'

続けてトランザクション・ログを復帰するときはnorecoveryrecoveryを使い分けます。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