CHECKPOINTまたはCOMMITはディスクに書き込みますか?


12

たとえば、SQLServer2008R2以降の場合、完全復旧モードのデータベースを使用します。

私はいつも考えた:

  1. トランザクションがコミットされると(COMMIT)、トランザクションはRAMのトランザクションログに書き込まれます。

  2. CHECKPOINTが発生すると(一定の時間および/またはいくつかのトランザクションおよびその他の基準の後)、最後のCHECKPOINTと現在のCHECKPOINTの間のトランザクションがディスクに書き込まれます。

  3. バックアップログが発生すると、データはMDFファイルに書き込まれます。

私は正しいですか?同僚の中には、自分が間違っていると言っている人もいます。BOLを使っても正しい答えを見つけるのは難しいです。

ありがとう!


回答:


20

残念ながら、これまでのCOMMITの動作方法に関する回答には多くのエラーがあるため、別のエラーを追加します。参照してください仕組み:ボブDorrのSQL ServerのI / Oプレゼンテーション詳細については、およびSQL Server 2000のI / Oの基本。仕組みは次のとおりです。

  • 完全に記録されたすべてのデータ書き込み(変更)は、正確に次の順序で発生します(SQL Serverがクエリを実行する方法の理解:データの書き込みを参照)。

    • データページは排他的にラッチされます
    • 変更を説明するログレコードがメモリのログに追加されます。新しいログレコードは、新しいLSNを生成します。LSN とは:ログシーケンス番号を参照してください。
    • データページが変更されます(ページ上のデータレコードとlast_update_lsnの両方)。これは現在、変更された(「ダーティ」)ページです。
    • データページラッチが解放されます
    • 更新の結果として直接ディスクに書き込まれるものはありません
  • COMMITは次のことを行います

    • COMMITを記述する新しいログレコードをメモリ内のログに追加します
    • 上記で生成されたものを含め、ディスクにフラッシュされていないすべてのログレコードがフラッシュされます(ディスクに書き込まれます)
    • スレッドブロックは、OSが上記の書き込みを耐久性があると報告するまで待機します(IOが完了します)
    • COMMITステートメント(または暗黙的なコミットを伴うDMLステートメント)が完了する
  • チェックポイントは次の(簡略化された)処理を行います。チェックポイントの仕組みと記録される内容を参照してください。

    • メモリ内のすべてのダーティページはディスクに書き込まれます
      • 各ダーティページについて、ディスクへの書き込みを開始する前に、そのページのlast_update_lsnであるLSNまでのログがフラッシュされます(ディスクに書き込まれます)。LSNをフラッシュすると、以前のすべてのLSNもフラッシュされることになります。したがって、最もダーティなページの場合、last_updateは既にフラッシュされている可能性が高いため、これはノーオペレーションです。
    • チェックポイントを記述するログレコードがログに書き込まれ、フラッシュされます
    • データベースブートページは、上記で生成されたレコードのLSNで更新されます

最小限のログ記録操作では、書き込みの動作が異なります。最小限のログ記録が可能な操作を参照してください。大体、最小限に記録された操作は、次のように機能します(簡略化)。

  • 最小ログ記録操作の一部としてページに行を挿入する前に、ページが最小ログ記録操作に参加するという事実を説明するログレコードが生成され、ログに追加されます(メモリ内)
  • 最小限のログが記録されたページは、それに多くの挿入が書き込まれているため、更新されています。何も記録されず、nothignはディスクに書き込まれます。
  • 最小ログ記録操作がコミットする場合、コミットする前に、そのトランザクションで最小ログ記録操作に参加したすべてのページがディスクに書き込まれている必要があります。この書き込みが完了した後、OnylはCOMMITログレコードをログ(メモリ内)に追加でき、この新しく追加されたコミットログレコードまでのログはディスクにフラッシュ(書き込み)されます。

8

トランザクションがコミットされると(COMMIT)、トランザクションはRAMのトランザクションログに書き込まれます。

トランザクションは、クエリで要求されたページまたはデータを変更する前に、トランザクションログに書き込まれます。これは、先行書き込みログ(WAL)と呼ばれます。メモリ内のページの更新中にSQL Serverがクラッシュした場合、WALはDBエンジンがトランザクションログを読み取り、トランザクションをロールバックできるようにします。これは、RDBMSのACIDプロパティです。

CHECKPOINTが発生すると(一定の時間および/またはいくつかのトランザクションおよびその他の基準の後)、最後のCHECKPOINTと現在のCHECKPOINTの間のトランザクションがディスクに書き込まれます。

チェックポイントは、ダーティページをバッファからディスクにフラッシュします。tempdbの動作は少し異なります。ダーティページとは、ディスクから読み取られてから変更されたページです。このチェックポイントプロセスは、トランザクションがコミットされた時点まで、トランザクションログにマークを作成します。障害の後、リカバリは、そのマークまでのすべてのトランザクションがコミットされたことを認識します。TSQLコマンドを使用して、チェックポイントを手動で発行できます。

バックアップログが発生すると、データはMDFファイルに書き込まれます。

いいえ、バックアップログが発生すると、SQL Serverはデータベースログファイルからバックアップを書き込んでいるディスクにトランザクションログ情報をコピーします。バックアップ操作は、ディスクからデータを読み取り、ディスクにデータを書き込みます。

以下のリンクをお読みください

Markが既に指摘しているSQL Serverのロギングとリカバリについて

SQL Server 2008内部とトラブルシューティングブック

トランザクションログのアーキテクチャと管理


わかりました。念のため:COMMITが発生すると、トランザクションログに書き込まれたと言います。バッファまたはディスク(LDF)のことですか?
マドキサフ14

最初は常にログキャッシュに書き込まれ、その後ディスク上のトランザクションログにフラッシュされます。私はWALがどのように動作するかのためにそれを参照してくださいトランザクションログ管理のリンクを追加した
Shanky

「メモリ内のページの更新中にSQL Serverがクラッシュした場合、WALはDBエンジンがトランザクションログを読み取り、トランザクションをロールバックできるようにします。」これは、トランザクションがコミットされていない場合にのみ当てはまります。すでにコミットされている場合は、何もロールバックできません。トランザクションログの情報は、データファイルの更新に使用されます。クラッシュの前にバッファがデータファイルに書き込まれなかった場合でも。
奇跡173 14

@Miracle:もちろんトランザクションの特定のトランザクションに関連するページが更新されている場合、トランザクションはコミットされなかったでしょう。
シャンキー14

4

以下はあなたのために物事を明確にします:

トランザクションがコミットされると(COMMIT)、トランザクションはRAMのトランザクションログに書き込まれます。

  • COMMIT(またはBEGIN)は、復旧モデルとは関係ありません。トランザクションレベルです。トランザクションは完全に完了するか失敗する必要があります(ACIDプロパティを覚えておいてください)。そのため、本質的に、COMMITは成功したトランザクションの終了をマークします(暗黙的または明示的)。COMMITステートメントは、トランザクションのすべての変更がデータベースの永続的な部分になることを保証します。
  • SQL Serverは、変更を加えるために、WAL(先行書き込みログ)を使用します。WALでは、データを変更する前に、最初に行う変更をログに記述します。

CHECKPOINTが発生すると(一定の時間および/またはいくつかのトランザクションおよびその他の基準の後)、最後のCHECKPOINTと現在のCHECKPOINTの間のトランザクションがディスクに書き込まれます。

バックアップログが発生すると、データはMDFファイルに書き込まれます。

参照する :

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.