バックアップの自動化って、データベースのための自動歯磨きみたいなもんだよ。定期的なバックアップがあれば、世界(つまり君のデータ)が崩壊するのを防げる。誰だって夜中3時に「サーバー落ちた!」って通知が来て、最後のバックアップが2週間前だった…なんて気づきたくないよね。自動化ならこの問題も解決!もうヒューマンエラーでデータを危険にさらすことはないよ。
自動化ツールはいろいろあるけど、今日は特に人気な2つを紹介するね:
cron— Linuxで昔から使われてる万能なタスクスケジューラー。pg_cron— PostgreSQLの拡張機能で、DBサーバーから直接ジョブを実行できるやつ。
pg_cronの裏側ではcronサービスを叩いてる。このサービスはLinux限定だよ!
じゃあ、始めよう!
pg_cronのインストール
pg_cronはPostgreSQLの拡張機能で、DB内で自動ジョブのスケジュールができる。これでPostgreSQLがちょっとしたオペレーションセンターに進化するよ。
インストール手順:
- PostgreSQL 10+を使ってるか確認しよう。
pg_cronは新しめのバージョンだけサポートしてるからね。 システムのパッケージマネージャーで拡張機能をインストール。例えばUbuntuなら:
sudo apt install postgresql-<version>-cron<version>は自分のPostgreSQLバージョンに置き換えてね。PostgreSQLの設定ファイルで拡張機能を有効化。
postgresql.confを開いて、これを追加:shared_preload_libraries = 'pg_cron'なんでこれが必要?
pg_cronはPostgreSQL起動時にライブラリを読み込む必要があるから、これが必須なんだ。PostgreSQLサーバーを再起動:
sudo systemctl restart postgresql自分のDBで拡張機能を有効化:
CREATE EXTENSION pg_cron;
ここまででpg_cronの準備はOK!
バックアップ自動作成ジョブの作成
pg_cronの一番のウリは、指定した時間にコマンドを実行できること。じゃあ、pg_dumpコマンドを自動で実行するジョブを作ってみよう。
例:
SELECT cron.schedule(
'yoru_no_backup', -- ジョブ名
'0 2 * * *', -- スケジュール(毎晩2時)
$$pg_dump -U username -F c -f /backups/university_backup.dump university$$ -- コマンド
);
このマジックを分解すると:
'yoru_no_backup'— ジョブの名前。あとで分かりやすいように好きな名前をつけてOK。'0 2 * * *'— cron形式のスケジュール:毎日2:00。$$ $$の中のコマンド:pg_dumpでuniversityデータベースのバックアップを作る。
ジョブを作ったら、あとはスケジュール通りに自動実行されるよ!
pg_cronのジョブ確認と削除
今あるジョブを全部見るには:
SELECT * FROM cron.job;
もういらないジョブはこうやって消せる:
SELECT cron.unschedule(job_id);
job_idはさっきのクエリで出てきたIDに置き換えてね。
cronで自動化する方法
もしクラシックなLinux流の自動化が好きだったり、pg_cronが使えない場合は、万能なcronが助けてくれるよ。
cronでジョブを設定する
まずcronがインストールされて動いてるか確認しよう:
sudo systemctl enable cron
sudo systemctl start cron
次にバックアップ用のジョブを追加。cronのタスク設定エディタを開く:
crontab -e
この行を追加:
0 2 * * * pg_dump -U username -F c -f /backups/university_backup.dump university
このマジックな一行の意味:
- 毎日2時(
0 2 * * *)にuniversityデータベースのバックアップを作る。 - 全部のバックアップは
/backups/university_backup.dumpに保存される。
ファイルを保存したら、crontabのジョブがスケジュール通りに動き始めるよ。
cronの実行ログ
たまに「何がダメだったの?」って知りたい時があるよね。コマンドの出力をログファイルに記録しておくと便利。コマンドに出力リダイレクトを追加しよう:
0 2 * * * pg_dump -U username -F c -f /backups/university_backup.dump university >> /var/log/backup.log 2>&1
これでジョブ実行中に起きたことは全部/var/log/backup.logに保存されるよ。
pg_cronとcronの比較
さて、強力なツールが2つあるけど、どっちを選ぶ?
pg_cronは、PostgreSQLから直接スケジュールやジョブ管理したい時に最高。DBから出なくていいし、ジョブの拡張も楽。cronはもっと汎用的。PostgreSQLだけじゃなく、他の自動化にも使える。
| 特徴 | pg_cron | cron |
|---|---|---|
| 統合のしやすさ | PostgreSQLに組み込みだけど拡張が必要 | どんなプロセスにも使える |
| インストール | 拡張機能のインストールが必要 | ほとんどのLinuxに最初から入ってる |
| ログ | PostgreSQL内(cron.job_run_detailsテーブル)に保存 |
システムログ(普通は/var/log/syslog)に記録 |
| 柔軟性 | PostgreSQL内でSQLだけ実行 | どんなコマンド・スクリプト・バイナリも実行OK |
ジョブ実行の確認
バックアップがちゃんと動いてるか確認したい時は、cronコマンドを手動で実行してみよう:
pg_dump -U username -F c -f /backups/university_backup.dump university
あと、指定ディレクトリにバックアップファイルがあるか、サイズや最終作成日時もチェックしよう。例えば:
ls -lh /backups/
定期的にログも確認して、ジョブがちゃんと動いてるか見ておこう。
よくあるミスの簡単ガード
ミスその1: 「権限設定忘れた!」
cronを実行するユーザーがpg_dumpを実行する権限を持ってないと、ジョブは動かないよ。ユーザーがDBにアクセスできるか確認しよう。
ミスその2: 「ファイルの場所間違えた!」
ファイルやコマンドのフルパスは必ず指定しよう。cronは君の環境変数を知らないから、フルパス必須:pg_dump -> /usr/bin/pg_dumpみたいに。
ミスその3: 「ログどこいった?」
コマンドの出力をログファイルにリダイレクトするのを忘れずに。これがないと、何が起きたか全然分からないよ。
これでデータベースのバックアップ自動化はバッチリ!サーバーが急にバケーションに行っても、君のデータはちゃんと守られてるから安心してね!
GO TO FULL VERSION