|
|
前のページ 1 2 3 4 次のページ
|
|
信頼性を保障するトランザクションログ
|
いくら性能を稼ぐためとはいえ、信頼性を犠牲にしたままではまずいですから、PostgreSQLではしっかりとした対策が行われています。それがトランザクションログです。
PostgreSQLではデータを更新する際に、どのような変更を行うのかを記録として残すようにしており、これをトランザクションログといいます。PostgreSQLではWAL(write ahead log)と呼んでいます。PostgreSQLエンジンによって更新されたデータは共有バッファ上に留まるのみで、すぐにはハードディスクに書き込まれませんが、実はトランザクションログにはしっかりと記録されていたというわけです。
不運にも何らかの障害によってPostgreSQLサーバが停止してしまい、最新のデータがハードディスクに保管されずに失われてしまったとします。トランザクションログは、このような状況から失われたデータを復元するために用いられます。
|
トランザクションログバッファ
|
さて信頼性の確保のためにあるトランザクションログですが、サーバの障害時にトランザクションログ自体が失われてしまうようでは元も子もありません。ですからトランザクションログは、必要なタイミングで頻繁にハードディスクに書き込まれています。
ではトランザクションログは、どのようなタイミングでハードディスクに書き込まれているのでしょうか。そのタイミングとは、データの更新を確実に保障しなければならない瞬間ですから、具体的にはトランザクションが「コミット」される瞬間となります。トランザクションのコミットが発生するたびに、トランザクションログがハードディスクに書き出されているのです。
もう1つ例外的に書き出されるタイミングがあります。それは、メモリ上に用意された「トランザクションログバッファ」が未書き込みのトランザクションログで一杯になってしまった時です。
トランザクションログはデータが更新されるたびに随時生成されるのですが、その都度ハードディスクには書き込まずに、メモリ上のトランザクションログバッファに溜め込んでいきます(図2)。
図2:トランザクションログ生成までの流れ
その後トランザクションがコミットされてデータの更新を保障しなければならない状況になると、それまでに溜まったトランザクションログをすべてハードディスクに書き出します。こうして、トランザクションログにおいてもハードディスクへのアクセスを極力減らしているわけです。
ただトランザクションログバッファの大きさには限りがありますから、場合によっては未書き込みのトランザクションログで一杯になってしまうことがあります。
たとえばデータの更新がとても多いトランザクションを実行した場合とか、多数のトランザクションを同時に実行した場合などです。この場合は仕方ないので、溜まったトランザクションログをすべてハードディスクに書き出して、再びトランザクションログを溜められるようにします。ここで余計なディスクアクセスが発生することになります。
|
前のページ 1 2 3 4 次のページ
|
|
|
|
著者プロフィール
日本PostgreSQLユーザ会 片岡 裕生
1995年よりインターウィズという屋号で個人事業を営む。普段はPostgreSQLを用いたウェブアプリケーション開発などを行う。各コンピュータ情報誌にてPostgreSQL関連記事や連載を執筆。日本PostgreSQLユーザ会の創立メンバーの1人で、同会の技術担当理事、PostgreSQLのしくみ分科会座長を経て、2004年度からは理事長を勤める。
|
|
|
|