前提条件

本番機でオンラインバックアップを取得しており、そのバックアップファイルがある
本番機の *.ldf を取得できる
予備機に SQL Server2000 がインストールされており、サービスパック、HotFixが本番機と同様に適用されている
*.ldfのPATHは C:\SQL_DATA
*.mdfのPATHは F:\SQL_DATA
オンライン・フルバックアップがC:\SQL_BK\FULL にある
オンライン・トランザクションログバックアップがC:\SQL_BK\TRAN にある

工程1 クラッシュした本番機から、トランザクションログファイル(*.ldf)の取得

クラッシュした本番機のHDDを他サーバに接続する等して、本番機の*.ldfファイルを取得する。

※本番機の*.ldf ファイルの有無で、リカバリポイントが決まる。

*.ldfが有る -> 障害発生時点までリカバリ可能。

*.ldfが無い -> 障害発生時点までのリカバリ不可、巻き戻りが発生する。

工程2 オンラインバックアップファイルの確認

オンラインバックアップファイルが存在する事、およびファイルシステム上の更新日時を確認する
userdb1.BAK
userdb2.BAK
userdb3.BAK
master_full.BAK
model.BAK▲
msdb.BAK▲

▲印はシステムデータベースに付き、復旧出来なくても影響が軽微(ジョブが消えてしまう程度)なので無くても構わない

トランザクションログのオンラインバックアップファイルが存在する事、およびファイルシステム上の更新日時を確認する
userdb1_transaction.BAK
userdb2_transaction.BAK
userdb3_transaction.BAK

工程3 既存のデータベースファイルの移動

MSSQLSERVERサービスを停止し、データベースファイル達を、任意のディレクトリに移動する。

mkdir "C:\SQL_DATA\old"
mkdir F:\SQL_DATA\old
move C:\SQL_DATA\*.ldf "C:\SQL_DATA\old"
move F:\SQL_DATA\*.mdf F:\SQL_DATA\old

工程4 masterの再構築

シングルユーザモードで起動する
"C:\Program Files\Microsoft SQL Server\MSSQL\Binn\sqlservr.exe" -m -c
masterを再構築する
restore database master from disk= 'C:\SQL_BK\FULL\master_full.BAK'
go

工程5 クラッシュ時点までのトランザクションログのバックアップを取得する

本番機の最新の*.ldfを、本番機と同一パス(C:\SQL_DATA\)にコピー※する

※リストアに失敗したらデータが消えてしまうので、必ず移動ではなくコピーにする

予備機のMSSQLSERVERサービスを起動する
Enterprize Managerにて’sa’ユーザで接続し、各データベースの灰色のアイコン(未確認)があるか確認する
最新トランザクションログをバックアップ

※2回やっちゃ駄目。やったら工程4からやりなおし

backup log [userdb1] to disk='C:\SQL_BK\TRAN\userdb1_last_tran.bak' with no_truncate
go
backup log [userdb2] to disk='C:\SQL_BK\TRAN\userdb2_last_tran.bak' with no_truncate
go
backup log [userdb3] to disk='C:\SQL_BK\TRAN\userdb3_last_tran.bak' with no_truncate
go

工程6 システムデータベース(modelとmsdb)のりストア

restore database [model] from disk='C:\SQL_BK\FULL\model.BAK' with file = 1, recovery, replace
go
restore database [msdb] from disk='C:\SQL_BK\FULL\msdb.BAK' with file = 1, recovery, replace
go

工程7 フルバックアップをリストア

restore database [userdb1] from disk='C:\SQL_BK\FULL\userdb1.BAK' with file = 1, norecovery, replace
go
restore database [userdb2] from disk='C:\SQL_BK\FULL\userdb2.BAK' with file = 1, norecovery, replace
go
restore database [userdb3] from disk='C:\SQL_BK\FULL\userdb3.BAK' with file = 1, norecovery, replace
go

工程8 トランザクションログの復旧

前回のフルバックアップ取得時点から、1度でもトランザクションログバックアップを行っていた場合に必要
declare @i int
set @i = 1
while @i <= 3
begin
restore log [userdb1] from disk='C:\SQL_BK\TRAN\userdb1_transaction.BAK'
with file = @i, norecovery, replace
restore log [userdb2] from disk='C:\SQL_BK\TRAN\userdb2_transaction.BAK'
with file = @i, norecovery, replace
restore log [userdb3] from disk='C:\SQL_BK\TRAN\userdb3_transaction.BAK'
with file = @i, norecovery, replace
set @i = @i + 1
end

以下のようなエラーが表示されても無視する
デバイス 'C:\SQL_BK\TRAN\userdb1_transaction.BAK' にファイル ID 7 が見つかりません。
サーバー : メッセージ 3013、レベル 16、状態 1、行 21
RESTORE LOG が異常終了しました。

工程9 最後のトランザクション(工程5で取得)を復旧

restore log [userdb1] from disk='C:\SQL_BK\TRAN\userdb1_last_tran.bak' with norecovery
restore log [userdb2] from disk='C:\SQL_BK\TRAN\userdb2_last_tran.bak' with norecovery
restore log [userdb3] from disk='C:\SQL_BK\TRAN\userdb3_last_tran.bak' with norecovery, stopat='2009-06-10 10:00:00'
go

工程10 データベースを有効化

restore database [userdb1] with recovery
restore database [userdb2] with recovery
restore database [userdb3] with recovery
go

工程11 復旧後処理

SQL認証のGIDを確認する

use [userdb1]

go

select m.sid as master_sid ,a.sid as account_sid ,m.name as master_name ,a.name as accouunt_name

from master.dbo.sysusers as m

right outer join sysusers as a on a.name = m.name

where m.sid is not null

GO

本番機のNT認証を削除する

exec sp_revokelogin ‘本番機\Administrator’

GO

各データベース認証を削除する

use [userdb1]

exec sp_revokedbaccess ‘user_a’

exec sp_revokedbaccess ‘user_b’

exec sp_revokedbaccess ‘Administrator’

use [userdb2]

exec sp_revokedbaccess ‘user_a’

exec sp_revokedbaccess ‘user_b’

exec sp_revokedbaccess ‘Administrator’

use [userdb3]

exec sp_revokedbaccess ‘user_a’

exec sp_revokedbaccess ‘user_b’

exec sp_revokedbaccess ‘Administrator’

use [master]

exec sp_revokedbaccess ‘user_a’

exec sp_revokedbaccess ‘user_b’

exec sp_revokedbaccess ‘Administrator’

use [model]

exec sp_revokedbaccess ‘user_a’

exec sp_revokedbaccess ‘user_b’

exec sp_revokedbaccess ‘Administrator’

use [msdb]

exec sp_revokedbaccess ‘user_a’

exec sp_revokedbaccess ‘user_b’

exec sp_revokedbaccess ‘Administrator’

予備機のNT認証を登録する