none
SQLServer2008 バックアップ/復元の方法 RRS feed

  • 質問

  • SQLServer2000から2008に移行をし、現在バックアップ/復元のテスト中です。

    しかし、復元をすると以下エラーが出力され復元ができません。

    ========================================

    サーバ'XX'の復元に失敗しました。

    追加情報:

    System.Data.SqlClient.SqlError:データベース"XXX"のログの末尾がバックアップされませんでした。

    この部分の作業を保存しておく場合はBACKUP LOG WITH NORECOVERを使用してログをバックアップして下さい。

    ログのコンテンツを上書きするだけの場合は、RESTOREステートメントでWITH REPLACE句または

    WITH STOPAT句を使用して下さい。

    ========================================

    そこで、トランザクションログのバックアップ取得時にWITH NORECOVERを指定をしてみましたが、

    今度は、復元中となったままとなってしまいます。

    ログのバックアップの取得方法をどう変更すれば指定した時間に復元ができるのか教えて頂けないでしょうか?

     

    【補足】

    現在のバックアップ方法:フルのバックアップを毎朝1回取得+ログのバックアップを1時間ごとに取得

    現在のログバックアップの取得文:LOG [DBName] TO  DISK = [PathName] WITH  NOINIT ,   NAME = [Dir],  NOSKIP ,  NOFORMAT

    2010年9月30日 0:23

回答

  • 障害発生を想定したデータベースの現在使っているトランザクションログのバックアップおよび復旧をするか、
    メッセージの後半で出ているWITH REPLACEまたはWITH STOPATを使ってリストアをしてみてはいかがでしょうか。
    エラーの詳細は
    http://msdn.microsoft.com/ja-jp/library/bb283410.aspx
    こちらをご覧ください。なぜそのような状態になっているかの解説があります。
    障害発生時にどこまで戻せば良いのか検討してみてください。

    • 回答としてマーク 山本春海 2010年10月19日 8:53
    2010年9月30日 13:22
    モデレータ
  •  【補足】
     現在のバックアップ方法:フルのバックアップを毎朝1回取得+ログのバックアップを1時間ごとに取得

    System.Data.SqlClient.SqlError: このバックアップ セットのログは LSN 5881000000007100001 から始まります。これはデータベースに適用するには新しすぎます。LSN 5879000000049700001 を含むバックアップよりも前のログ バックアップを復元できます。 (Microsoft.SqlServer.Smo)

     の情報から、フルバックアップのリストア後、1時間おきに取得しているトランザクションログを順番に戻していないとか、特定のトランザクションログを戻し忘れているということはないでしょうか?

    • 回答としてマーク 山本春海 2010年10月19日 8:53
    2010年10月1日 4:49
  • 復旧は極端な話をすれば過程はどうあれ、戻ればOKだと思っています。
    気になったので以下のやり方をやってみたところ正しく戻りました。

    ■手順
    完全バックアップ(fullbk.bak)取得
    テーブルを1つ作成
    トランザクションログバックアップ(logbk.bak)取得

    fullbk.bakを別名DBとしてリストア(with NORECOVERY) =>この時点で復旧中のステータスに
    logbk.bakをwith recoveryでリストア => 復旧完了

    • 回答としてマーク 山本春海 2010年10月19日 8:53
    2010年10月7日 1:36
    モデレータ

すべての返信

  • 障害発生を想定したデータベースの現在使っているトランザクションログのバックアップおよび復旧をするか、
    メッセージの後半で出ているWITH REPLACEまたはWITH STOPATを使ってリストアをしてみてはいかがでしょうか。
    エラーの詳細は
    http://msdn.microsoft.com/ja-jp/library/bb283410.aspx
    こちらをご覧ください。なぜそのような状態になっているかの解説があります。
    障害発生時にどこまで戻せば良いのか検討してみてください。

    • 回答としてマーク 山本春海 2010年10月19日 8:53
    2010年9月30日 13:22
    モデレータ
  • ご回答ありがとうございます。

    教えて頂いたリンクから、なぜこのエラーとなったのか分かりました。

    そこで、

    ・最後に取得したトランザクションログのバックアップ以降に戻したい場合は、ログの末尾をバックアップしてから、復元をする。

    ・最後に取得したトランザクションログのバックアップ以前に戻したい場合は、ログの末尾をバックアップせずに、復元をする。

    という手順にしたいと思います。

    しかし、どちらの方法で復元しても今度は以下の違うエラーが出て復元ができません。(WITH REPLACEを指定の有無に関わらずエラーです。)

    解決策が分かりましたら教えて頂けますでしょうか?

     

    ====エラー内容==========================

    サーバ'XX'の復元に失敗しました。

    追加情報:

    System.Data.SqlClient.SqlError: このバックアップ セットのログは LSN 5881000000007100001 から始まります。これはデータベースに適用するには新しすぎます。LSN 5879000000049700001 を含むバックアップよりも前のログ バックアップを復元できます。 (Microsoft.SqlServer.Smo)

    ========================================

    2010年10月1日 1:19
  •  【補足】
     現在のバックアップ方法:フルのバックアップを毎朝1回取得+ログのバックアップを1時間ごとに取得

    System.Data.SqlClient.SqlError: このバックアップ セットのログは LSN 5881000000007100001 から始まります。これはデータベースに適用するには新しすぎます。LSN 5879000000049700001 を含むバックアップよりも前のログ バックアップを復元できます。 (Microsoft.SqlServer.Smo)

     の情報から、フルバックアップのリストア後、1時間おきに取得しているトランザクションログを順番に戻していないとか、特定のトランザクションログを戻し忘れているということはないでしょうか?

    • 回答としてマーク 山本春海 2010年10月19日 8:53
    2010年10月1日 4:49
  • ご回答ありがとうございます。

    リストア時はMicrosoft SQL Server Management Studioからデータベースの復元機能をしていますので、順番や漏れはないのかなと思います。

    ただ、1点気になる事があります。

    Microsoft SQL Server Management Studioから復元→データベース にて、データベースの復元画面を開きます。

    バックアップセット一覧が表示されるのですが、

    「最初のLSN」の項目が

    フルのバックアップとその後に取得したトランザクションログでは、トランザクションログの方が小さな値となっています。

    最初のトランザクションログ取得時に、その前に取得したフルのバックアップとの紐付けが上手く出来ていないのかと考えられるのですが、

    フルのバックアップの後の最初のトランザクションログのバックアップ取得方法に問題があるのでしょうか?

     

    【ログバックアップの取得方法】

    LOG [DBName] TO  DISK = [PathName] WITH  NOINIT ,   NAME = [Dir],  NOSKIP ,  NOFORMAT

     

    2010年10月1日 6:30
  • 必要なログバックアップが別なバックアップセットに含まれていないでしょうか?
    ログバックアップの最初のLSNが完全バックアップのLSNよりも前なのは
    ログファイルにはログレコードが綿々と記録されているので、最後のログバックアップから
    完全バックアップ取得までのレコードがあるためと考えられます。

    CatTailさんもおっしゃっていますが、間が抜けているように思います。
    もう一度バックアップから実行してみても同じでしょうか。

    2010年10月4日 14:27
    モデレータ
  •  ふと思ったのですけど、先にmsdbをリストアしていませんか?

     自分も、「Management Studioから戻しているから問題なさそうだな」と思っていたのですが、よくよく考えたらバックアップの履歴はmsdbに格納されますので、msdbをリストアしてしまうとバックアップの履歴も、msdbをバックアップした時点に戻ってしまいます。

     ログのバックアップは、バックアップファイルに追加しているようなので、"RESTORE FILELISTONLY"や"RESTORE HEADERONLY"で格納されているバックアップの内容がManagement Studioでの復元画面で表示される内容と一致しているか確認してみてください。

    ※なお、復元ダイアログで「復元元デバイス」にてバックアップファイルを指定している場合は、バックアップファイルの内容に格納されている内容を表示しますので、これには当てはまりません。
     データベースのバックアップ履歴からリストアする場合のみ、該当します。

    2010年10月5日 3:59
  • ご回答頂き、ありがとうございます。

    色々なパターンで調査をしてみたら理由は不明ですが、以下の方法でバックアップを取得した所、復元できる事が確認できました。

    しかし、この方法が一般的で正しい方法なのか?が心配です。

    なぜこの方法で出来るようになったのか、または、変更後の方法の問題点等ありましたら、ご指摘頂けますか?

    【変更前】現在のバックアップ方法:フルのバックアップを毎朝1回取得+ログのバックアップを1時間ごとに取得

    【変更後】現在のバックアップ方法:フルのバックアップとトランザクションログを毎朝1回取得+ログのバックアップを1時間ごとに取得

    2010年10月6日 8:49
  • 復旧は極端な話をすれば過程はどうあれ、戻ればOKだと思っています。
    気になったので以下のやり方をやってみたところ正しく戻りました。

    ■手順
    完全バックアップ(fullbk.bak)取得
    テーブルを1つ作成
    トランザクションログバックアップ(logbk.bak)取得

    fullbk.bakを別名DBとしてリストア(with NORECOVERY) =>この時点で復旧中のステータスに
    logbk.bakをwith recoveryでリストア => 復旧完了

    • 回答としてマーク 山本春海 2010年10月19日 8:53
    2010年10月7日 1:36
    モデレータ