web-dev-qa-db-ja.com

バックアップからのデータの部分的な復元は可能ですか?

申し訳ありませんが、正しい用語を使用していなかった場合、私はDBAではありませんが、今は私がすべてです。

状況は先週で、データベースサーバーの動作に問題がありました(約6年前)。ホスティング会社は新しいサーバーを構築し、現在のすべてのデータを、正常に稼働している新しいサーバーに移動しました。

ただし、どういうわけか、新しいサーバーには36時間分のデータがありません。ホスティング会社は、とりわけこのデータを含むバックアップを提供してくれました。

一部のテーブルには自動生成キー(タイプinteger)があるため、日付範囲からデータセットのみをライブデータベースに復元する方法はありますか?データの整合性がすべて失われるため、私は明らかにカットアンドペーストすることはできません。

考え?

Windows ServerおよびMicrosoft SQL Server 2008。

2
Matt

直接ではありませんが、ここに回避策があります

SQL Serverで個々のテーブルまたは行の部分的な復元を行う方法は、バックアップを別のデータベース名に復元し、特定の欠落データを復元されたデータベースから本番データベースに手動で移動することです。

これには、環境に応じていくつかの手順が含まれます。元のデータベースの名前がDB1の場合、次のようなことができます。

RESTORE FILELISTONLY
FROM DISK = 'PATH\To\FullBackup.bak';

これにより、次のステップに挿入する論理ファイル名と物理ファイル名が得られます。

RESTORE DATABASE DB1_RESTORE
FROM DISK = 'PATH\To\Full_Backup.bak'
WITH MOVE 'Data' TO 'PATH\To\DataFiles\DB1_Restore_01.mdf',
     MOVE 'Log' TO 'PATH\To\LogFiles\DB1_Log_Restore_01.ldf', NORecovery;

特定の環境に合わせて調整する必要がありますが、基本的に2つの重要な点を覚えておく必要があります。

  1. データベース自体の名前を、実際のDBではないことを認識できる名前に変更します
  2. 各ファイルの名前を新しい名前に変更して、既存のDBファイルを上書きしないようにします。

差分バックアップファイルがある場合は、

RESTORE DATABASE DB1_RESTORE
    FROM DISK = '\PATH\To\Diff_backup.bak'
    WITH NORECOVERY;

そして、ログファイルのバックアップごとに:

RESTORE LOG DB1_RESTORE FROM DISK = '\PATH\To\LogFile_1.trn'  WITH NORECOVERY;
RESTORE LOG DB1_RESTORE FROM DISK = '\PATH\To\LogFile_2.trn'  WITH NORECOVERY;
RESTORE LOG DB1_RESTORE FROM DISK = '\PATH\To\LogFile_3.trn'  WITH NORECOVERY;

以降、すべてのログファイルを復元するまで続けます。

最後に、

RESTORE DATABASE DB1_RESTORE WITH RECOVERY;

その後、復元されたDBから元の本番DBへのデータの手動コピーを開始できます。

ただし、データを運用データベースにコピーする前に、そのDBの完全バックアップを作成してください。念のため

ID(自動採番)列を持つテーブルにデータを挿入する必要がある場合は、

SET Identity_Insert DB1.dbo.tablename ON

INSERT INTO DB1.dbo.tablename ( col1, col2, col3 )
Select col1, col2, col3
From DB1_Restore.dbo.tablename Where col1 > 1234

SET Identity_Insert DB1.dbo.tablename OFF

上記は非常に一般的なスクリプトであり、ある程度の努力なしでは機能しませんが、これで開始できます。 Identity_Insertステートメントを使用すると、Identity列に挿入できます。 WHERE句を正しく設定して、不良データを挿入しないようにしてください

5
CaM

いいえ、質問であなたが言ったことを行うことはできません。

必要なデータを回復する方法はたくさんあると思います。 1つの方法は次のとおりです。

  • バックアップを別の(名前)データベースとして復元します。
  • このソースと現在のライブデータベースを使用してデータを調整します。どうやって?あなたが失ったものとあなたのビジネスロジックに完全に依存します。
  • 自動生成された整数キーを確実に利用できます(少なくとも、これを持っているテーブルでは)。現在のライブデータベースのどこにギャップがあるかに応じて、ここでいくつかの配管を行う必要がある場合があります。

私はそれが非常に一般的な答えであることを知っています。個々のテーブルに関する特定のヘルプが必要な場合は、テーブルスキーマ、サンプルデータ、ギャップの詳細を投稿する必要があります。

余談ですが、おそらくこのホスティング会社を今後使用することを再考したいと思います。

7
SqlWorldWide