【入門編】 archive_command – PostgreSQL

こんにちは!データベースエンジニアの私です。

今日は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が消えても昨日までは戻せる!」という安心感を持って開発ができます。

最初は「シェルコマンドって何?」と難しく感じるかもしれません。でも、「データベースが一生懸命、自分の日記を安全な場所に運ぼうとしているんだな」と想像してみると、少しだけ身近に感じられませんか?

もし設定で迷ったり、うまくいかなくて悩んだりしたら、いつでもまた聞きに来てくださいね。皆さんのデータベース運用が、穏やかで安全なものになりますように!

それでは、また次回の記事でお会いしましょう!

コメント

タイトルとURLをコピーしました