こんにちは!データベースの世界へようこそ。
PostgreSQLを触り始めると、「WAL(Write Ahead Log)」とか「チェックポイント」といった、ちょっと難しそうな言葉によく出会いますよね。特に「フルページライト(Full Page Writes)」なんて聞くと、「なんだか凄そうな仕組みだけど、結局何をしてるの?」と身構えてしまう方も多いのではないでしょうか。
今日は、そんなフルページライトの正体を、身近な「日記帳」に例えて紐解いてみましょう。
—
データベースは「差分」で記録する
まず、データベースが普段どうやってデータを保存しているか想像してみてください。
例えば、あなたは毎日「日記」を書いているとします。
普通なら「今日はりんごを1個食べた」と書くところを、データベースは「昨日の状態から、りんごを+1した」という差分(変更点)だけを記録して節約しようとします。
この「差分だけを記録する」というやり方は、ディスクの容量も節約できるし、書き込みも速いので、基本的にはとっても賢いんです。
突然の「停電」という悲劇
でも、ここで一つ困ったことが起きます。もし、日記を書いている途中で突然停電して、ペンが止まってしまったらどうなるでしょうか?
- 「りんごを+1した」という記録は残ったけど、紙にはまだインクが滲んだ跡しかなかった。
- 次にページを開いたとき、「+1」という命令だけ見ても、元がいくつだったのか分からなくなっちゃいますよね。
データベースの世界でも同じことが起きます。OSがデータを保存している最中に電源が落ちると、データが中途半端な状態で壊れてしまうことがあるんです。これを「ページ破損」と呼びます。
救世主「フルページライト」の登場
そこで登場するのが、今回の主役「フルページライト」です。
これは、チェックポイント(データベースが「今の状態を確定させよう!」とディスクに書き込むタイミング)の直後、そのページを初めて書き換えるときだけ、ページ全体を丸ごと記録に残すという機能です。
日記の例で言うなら、こんな感じです。
- 普段は「差分」だけをメモする。
- ただし、新しいページを書き始めるその瞬間だけは、「今のページの状態を写真に撮って保存しておく」。
こうしておけば、もし途中で停電しても安心です。「写真(フルページ)」さえあれば、そこから「差分」をもう一度やり直せば、データは完璧に元通りになりますよね。
なぜ「最初の1回」だけなの?
「それなら毎回写真を撮ればいいじゃない!」と思うかもしれませんね。でも、毎回写真を撮っていたら、日記帳がすぐにパンパンになってしまいます。データベースにとっても同じで、毎回フルページを書き出すのはすごく重い処理なんです。
だからPostgreSQLは、「チェックポイント後の、最初の一回だけ」という絶妙なタイミングで写真を撮ることで、「安全性」と「パフォーマンス」のバランスを絶妙に保っているんです。
—
まとめ:PostgreSQLの優しさ
フルページライトは、一言で言えば「万が一の事故に備えた、PostgreSQLの慎重な保険」です。
私たちが普段何気なく「SELECT」や「UPDATE」を使えているのは、こうして裏側でフルページライトのような仕組みが、データが壊れないように見守ってくれているからなんですよ。
データベースって、ただデータを溜め込むだけの箱じゃないんです。こうやって、泥臭いトラブルを回避するために、エンジニアたちが知恵を絞った「物語」が詰まっているんですよね。
もしこの記事を読んで、「へぇ、データベースって意外と人間くさいんだな」なんて感じていただけたら嬉しいです。また次回の記事でお会いしましょう!
コメント