前提条件
本番機でオンラインバックアップを取得しており、そのバックアップファイルがある
本番機の *.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’