こんにちは!データベースエンジニアの私です。
今日はPostgreSQLの、ちょっと「職人気質」な側面についてお話ししようと思います。データベースの世界って、一見冷たそうに見えて、実はすごく几帳面で人間味(?)あふれる仕組みがあるんですよ。
その中でも、特に「万が一」に備えて毎日コツコツと仕事をしている`archive_command`(アーカイブコマンド)について、今日は皆さんと一緒に紐解いていきましょう。
—
そもそも「WAL」って何者?
本題に入る前に、まずは「WAL(Write Ahead Log)」という言葉を知っておく必要があります。
簡単に言えば、WALは「データベースの今日の日記」です。PostgreSQLは、何か変更があったときに、いきなり大きなデータベース本体を書き換えるのではなく、まずはこの「日記帳」に「〇〇を更新したよ!」と走り書きをします。
もし途中で停電したり、パソコンがクラッシュしたりしても、この日記帳があれば「あ、さっきまでここまでやってたんだな」と後から復旧できるわけです。
—
archive_command は「配送業者さん」
この日記帳(WAL)は、一定のサイズまで溜まると新しいものに切り替わります。でも、古い日記をそのまま放置しておくと、いつか溢れてしまいますよね。
そこで登場するのが `archive_command` です。
例えるなら、「一杯になった日記を、安全な倉庫へ運んでくれる配送業者さん」です。PostgreSQLは「この日記、一杯になったから倉庫へ送って!」と指示を出します。その指示の内容が `archive_command` に書かれているシェルコマンドなのです。
設定ってどうやるの?
設定は、PostgreSQLの設定ファイル(`postgresql.conf`)に一行書き加えるだけです。例えば、こんな感じです。
archive_mode = on
archive_command = ‘cp %p /mnt/server/archivedir/%f’
- `archive_mode = on`:「配送サービスをONにするよ!」という宣言です。
- `%p`:今まさに運んでほしい「一杯になった日記」の場所。
- `%f`:その日記に付けられた「ファイル名」。
- `cp`:コピーするというコマンド。
つまり、「`%p`にあるファイルを、`/mnt/server/archivedir/`という倉庫の中に`%f`という名前でコピーしてね!」とお願いしているわけですね。
—
もし「配送」に失敗したらどうなるの?
さて、ここからが大事な話です。もし、倉庫がいっぱいだったり、ネットワークが切れていて配送ができなかったら、この配送業者さんはどうすると思いますか?
「あ、ダメだ。次行こうっと!」 とはなりません。
PostgreSQLは非常に責任感が強いので、「配送が完了するまで、何度でも同じ命令を出し続けます」。
これ、実はちょっと危険なんです。もしずっと失敗し続けると、配送待ちの荷物(WALファイル)がデータベースのフォルダの中にどんどん溜まっていき、最終的にはディスクの容量を食いつぶして、データベースそのものがパンクしてしまいます。
だからこそ、私たちは「ちゃんと荷物が届いているかな?」と定期的に監視してあげないといけないんです。
—
最後に:初心者の方へ伝えたいこと
`archive_command` は、データベースのバックアップにおいて「要」となる仕組みです。これがあるおかげで、私たちは「もし明日、DBが消えても昨日までは戻せる!」という安心感を持って開発ができます。
最初は「シェルコマンドって何?」と難しく感じるかもしれません。でも、「データベースが一生懸命、自分の日記を安全な場所に運ぼうとしているんだな」と想像してみると、少しだけ身近に感じられませんか?
もし設定で迷ったり、うまくいかなくて悩んだりしたら、いつでもまた聞きに来てくださいね。皆さんのデータベース運用が、穏やかで安全なものになりますように!
それでは、また次回の記事でお会いしましょう!
コメント