DBMSに保存されたレコードはテーブル上に保存されますが、テーブルとはユーザー目線用に抽象化された概念であり、実体としてはレコードはファイルに保存されます。というDBMSの基本的な仕組みについて、なんとなく知ってはいましたが達人に学ぶDB設計徹底指南書 第2版の冒頭を読んでもっと詳しく学びたい!と思ったので、調べてみました。
DBMSが作成する実ファイルは主に以下の5つの種類があります。
データファイル
レコードを保存するファイルです。
SQLを通じて作成・更新・削除されたレコードは全てこのファイルに保存されます。5つのファイルの中でデータファイルが一番IOが多くファイルサイズも大きくなりがちで、DBMSを利用するシステムが長期間稼働するとともにファイルサイズが増加する傾向にあります。
インデックスファイル
テーブルのインデックスに関する情報が保存されるファイルです。
DBMSではデータファイルとインデックスファイルは別々のファイルで管理されています。DBの設計にもよりますが、データファイルの次にIOが多いとされています。こちらもデータファイルほどではないですが、ファイルサイズは時間と共に増加する傾向にあります。
システムファイル・一時ファイル
システムファイルとはDBMSが内部管理用に利用するファイルです。こちらはデータファイル・インデックスファイルのようにSQLを通じて内容が変化するものではなく、ユーザーがあまり意識することはありません。
一時ファイルとはその名の通り一時的に保持したい情報を保存するファイルで、例えばGROUP BYやORDER BYで実行された抽出・ソートに関する情報や、サブクエリで展開されたSQLの内容などを一時的に保持します。保持した情報は不要になったらあとで一時ファイルから削除されるため、一時ファイルのファイルサイズはデータファイル・インデックスファイルのように肥大化することはあまりありません。
ログファイル
DBMSにおけるログファイルは、トランザクションに関する情報をログとして保存する役割を持ちます。
多くのDBMSはWAL(Write-Ahead Logging)という仕組みを採用しています。これは「ログ先行書き込み」と呼ばれ、SQLを通じてINSERT/UPDATE/DELETEが行われると、変更内容はまずログファイルに同期的に書き込まれます。実際のデータページへの反映(チェックポイント処理)は、ログ書き込み後に非同期で行われます。これにより、トランザクションのコミットを高速に処理しつつ、障害時の復旧も可能になります。
これまたDBMSによって細かい仕様は異なりますが、多くのDBMSではUNDOログとREDOログという2種類のログファイルがあります。
UNDOログ
UNDOログは変更前の状態を記録します。ROLLBACKなどでトランザクションをロールバックしたい時、DBMSはUNDOログを参照することでSQL実行前の状態にDBを戻すことができます。
REDOログ
REDOログとは変更内容そのものを記録します。INSERT,UPDATE,DELETEなどで実施される変更内容を保持することで、実際にDBに変更をかけることができます。
トランザクション
UNDOログとREDOログを組み合わせることでDBMSはデータの操作を行います。
トランザクション開始
↓
変更前データをUNDOログに記録
↓
変更後データをREDOログに記録
↓
実際のデータページを更新
↓
コミット or ロールバック
DBMSのデータの整合性はこのログファイルたちによって守られているということです。
余談ですが、AWS AuroraのUNDOログ・REDOログの運用について話されているPodcastがあるので、こちらも聞いてみると面白いです。
この辺の話です
- AuroraはARIESからDBを理解した人がフルスクラッチで変えたように見える
- AuroraはUndoの情報をログに含めず、Redoを含める
- Auroraの場合は、Redoログを受け取るのがHDDではなくクラウド
- ページの一貫性を担保する責任をクラウドへ押し付けた
- メモリをディスクへ書き戻す必要がなくなる
- Redoログ一辺倒になったのでチェックポイントがいらなくなった
おわり。