none
SQLServerの障害時のデータ状態と復旧について RRS feed

  • 質問

  • SQLServerの導入を検討しています。
    検討項目として、サーバー障害時のデータ状態と復旧方法について、調査していますが、適切な資料を見つけられません。
    知っている方がいましたら、ご教授頂きたいと思い投稿しました。

    SQLServerについては、最近始めたばかりなので初心者になります。

    ハードウエア構成:
     MSCSの2ノードクラスタ構成で、サーバー機2台にSQLServer2005(もしくは2000)のインスタンス
     外部ディスク(共有ディスク、SCSI)にSQLServerのデータファイル

    問題の基点:
     障害でフェールオーバー(自動サーバー切換)が起きた場合に、
     データの運用継続判断と、ダウンタイム短縮の為の自動復旧。

    問題①:
     トランザクション(複数レコードの更新)中に、
     サーバー機の電源が突然落ちた場合(最悪のケース)
     但し、外部ディスク自体とサーバー-外部ディスク間の通信経路は100%信頼できると仮定する。

     データファイルはどの状態になる可能性があるでしょうか?
     (1)トランザクション中はロールバックされ正しいデータに戻る。
      (複数トランザクションのトランザクション単位であれば途中でも正しいとする。)
     (2)レコード単位でトランザクション途中まで書込。
     (3)データファイルそのものが信頼できない。

    問題②:
     問題①の結果によりますが、データが(2)(3)の場合の復旧方法に
     自動復旧のようなものはありますか?
     もしくは、一般的に自動復旧はせずに、
     手動復旧か別の可能性システムを導入するものなのでしょうか?

     手動ならばバックアップとトランザクションログで障害直前までの状態に戻すことは
     可能という点は理解しています。


    以上、長文となり失礼いたしますが宜しくお願いいたします。

    2007年12月10日 8:43

回答

  • このページのことですね。全然違います。

    最初の投稿は実行のトランザクションのことについて書かれています。そのページに書かれているのは完了したトランザクションのことです。おそらく最初の投稿が正しく投稿者の疑問を表現していなかったのだと推測しています。

     

    SQL Server はまずトランザクション ログにトランザクションでやることをどんどん記録していきます。記録ができて初めてトランザクションの操作は実行されます。データの更新自体は最初にメモリ上のデータが更新され、暇なときにディスクに更新したデータを書き出します。

    メモリ上のデータが更新された後、ディスクに書き出す前に SQL Server が終了した場合はディスク上のデータは更新されていません。でもトランザクション ログには漏れなくやったことが記録されているので次に SQL Server が起動したときにまだデータファイルに書き込んでいなかった内容はトランザクション ログからロールフォワードされ、ちゃんとデータは更新されます。これが SQL Server 起動時に行われる復旧処理です。

    実行中の完了していないトランザクションが残ったまま SQL Server が終了した時は、そのトランザクションはロールバックされるだけです。

    2007年12月11日 3:30

すべての返信

  • (1) です。

    > 但し、外部ディスク自体とサーバー-外部ディスク間の通信経路は100%信頼できると仮定する。
    この前提がありえないので、一般的には問題が起きたら DBCC CHECKDB/バックアップからもどす/サポートを使うことになります。

    2007年12月10日 15:47
  • 回答ありがとうございます。

    (1)であるというのはダーティクローズ(*1)と再起動時の復元機能によるものでしょうか?
      (*1)PASSJの「バックアップとリカバリ」の記載にある
        「3.クリーンシャットダウンとダーティクローズ」を参考にしました。

    仮定の話は、ディスク障害時はリストアしかないと思うので、
    サーバー障害時のデータへの影響を知りたかった為、ありえない前提をさせていただきました。

    DBCC CHECKDBについて基本かもしれませんが未知の機能だったので勉強になりました。


    2007年12月11日 2:03
  • このページのことですね。全然違います。

    最初の投稿は実行のトランザクションのことについて書かれています。そのページに書かれているのは完了したトランザクションのことです。おそらく最初の投稿が正しく投稿者の疑問を表現していなかったのだと推測しています。

     

    SQL Server はまずトランザクション ログにトランザクションでやることをどんどん記録していきます。記録ができて初めてトランザクションの操作は実行されます。データの更新自体は最初にメモリ上のデータが更新され、暇なときにディスクに更新したデータを書き出します。

    メモリ上のデータが更新された後、ディスクに書き出す前に SQL Server が終了した場合はディスク上のデータは更新されていません。でもトランザクション ログには漏れなくやったことが記録されているので次に SQL Server が起動したときにまだデータファイルに書き込んでいなかった内容はトランザクション ログからロールフォワードされ、ちゃんとデータは更新されます。これが SQL Server 起動時に行われる復旧処理です。

    実行中の完了していないトランザクションが残ったまま SQL Server が終了した時は、そのトランザクションはロールバックされるだけです。

    2007年12月11日 3:30
  • 理解できました。

    迅速な回答をいただき大変助かりました。
    ありがとうございます。
    2007年12月11日 6:16