web-dev-qa-db-ja.com

完全バックアップのみからデータベースを特定の時点に復元します

リカバリモードをFULLに設定したデータベースがあります。これは開発データベースであり、19日と27日の2つの完全バックアップ、つまり最新のものがあります。

開発者の1人が26日にいくつかの変更を行ったので、それらの変更をロールバックして、25の状態でデータベースを復元したいと考えています。

restore database MyDb from disk = 'I:\MSSQL\DATA\MyDb_20160127.bak'
with recovery, stopat = '2016-01-25 10:38:15.280',
move 'MyDb' to  'I:\MSSQL\DATA\MyDb.mdf',
move 'MyDb_log' to 'I:\MSSQL\DATA\MyDb.ldf'

STOPAT句は、このバックアップセットを復元するには早すぎる時点を指定しています。別の停止ポイントを選択するか、RESTORE DATABASE WITH RECOVERYを使用して現在のポイントで回復します。

SQL Server 2005を使用しています

5
Shantanu Gupta

いいえ、STOPATで使用する期間をカバーするトランザクションログを取得している必要があります。これは、データベース全体のバックアップからのみ行うことはできません。これは1回限りのコピーであり、さまざまな種類のバックアップ(完全、ログ、差分)があるのはそのためです。

完全バックアップの間にトランザクションログのバックアップを作成した場合は、その情報で質問を更新してください。特定の時点に復元するための手順を示します。しかし、これらのチュートリアルは簡単に見つけることができるので、ログのバックアップを取っていないので、ここで質問しているのではないかと思います。それが事実である場合、あなたは一種の行き詰まりです-あなたはある種の ログ読み取りユーティリティ を使用して現在のトランザクションログからその情報を取得することができるかもしれませんが、私は自信がありませんそこでの成功について-そして、少なくともその製品には「ある時点への復元」と呼ばれる機能がないようです-それはあなたがテーブルの復元や切り捨ての取り消しのような特定の情報を回復することを可能にします。ですから、最終的な結果を得るには、かなり手作業の「トランザクションAの取り消し、トランザクションBの取り消し、トランザクションCの取り消しなど」になると思います。おそらく、_fn_dblog_の出力から自分で実行するよりも作業量が少ないでしょう。

この投稿はかなりタイムリーです:

そして、これらも役に立つかもしれません:

nowできないことを実証するために、ログバックアップを取り、ある時点に復元しようとしますprior最後の完全バックアップに。まず、このスクリプトを実行します。

_USE master;
GO
CREATE DATABASE splunk;
GO
ALTER DATABASE splunk SET RECOVERY FULL;
GO
USE splunk;
GO
SELECT GETDATE(); -- use this in STOPAT
GO
WAITFOR DELAY '00:00:10';
GO
BACKUP DATABASE splunk TO DISK = 'c:\temp\sp_full.bak' WITH INIT;
GO
WAITFOR DELAY '00:00:10';
GO
_

上記はあなたが持っているものをシミュレートしています:完全バックアップ、取られたafter復元したい時間、そしてそれだけです。

次に、ログ末尾のバックアップを取ります。

_BACKUP LOG splunk TO DISK = 'c:\temp\sp_tail.trn' WITH INIT, NO_TRUNCATE;
GO
_

それでは、回復プロセスを開始しましょう。最初に、norecoveryでフルバックアップを復元します。

_USE master;
GO  
RESTORE DATABASE splunk FROM DISK = 'c:\temp\sp_full.bak' WITH REPLACE, NORECOVERY;
GO
_

次に、STOPATパラメータをGETDATE()に対して上記で出力されたものに設定して、ログ末尾のバックアップを復元してみます。

_RESTORE LOG splunk FROM DISK = 'c:\temp\sp_tail.trn' 
  WITH NORECOVERY, STOPAT = '<paste GETDATE() output from above>';
_

次のエラーメッセージが表示されます。

メッセージ4335、レベル16、状態1
指定されたSTOPAT時間は早すぎます。データベースのすべてまたは一部は、その時点を超えてすでにロールフォワードされています。
メッセージ3013、レベル16、状態1
RESTORE LOGが異常終了しています。

特定の時点に復元するには、完全バックアップの後で(last完全バックアップの後である必要はありませんが、有効であり、復元)、および復元したい時点の後(ただし次へデータベースの完全バックアップの前)。

これが、通常フルバックアップを毎晩または毎週、トランザクションログのバックアップを15分ごとまたは1時間ごとに行う理由です(ビジネスニーズ、RTO/RPOに応じて、そこに差分/ファイルグループバックアップが含まれることもあります)。完全復旧モデルでは、1週間に1回完全バックアップを取りたいというユースケースはありません。これは、難しい方法を学ぶには非常に費用のかかるレッスンになる可能性がありますが、2度はあなたには起こらないと思います。

この投稿には、バックアップに関する有用なポイント、それらを採用する理由、ログバックアップの有用性などが含まれている可能性があります。ブックマークを付けて、現在の問題を解決したら完全に読むことを強くお勧めします。

14
Aaron Bertrand

完全復旧モデルの場合は、ログバックアップをどこかに配置する必要があります。PaulBrewerの "RestoreScriptGenie"などのクールなスクリプトを使用することをお勧めします。これは次の場所にあります http:// www.sqlservercentral.com/articles/Restore/95839/

異なるデータベース名などを使用して、特定の時点に回復するスクリプトを生成します。

私もあなたと同じような問題を持つ人を見つけました。彼はそれほど完璧ではない解決策を見つけましたが、おそらくそれはあなたの状況で少し役立つかもしれません:

バックアップなしでデータベースを特定の時点に復元できますか?

0