CodeGym /コース /SQL SELF /Linuxで pg_cronと cronを使ったバックアッ...

Linuxで pg_cronと cronを使ったバックアップ自動化の設定

SQL SELF
レベル 44, レッスン 0
使用可能

バックアップの自動化って、データベースのための自動歯磨きみたいなもんだよ。定期的なバックアップがあれば、世界(つまり君のデータ)が崩壊するのを防げる。誰だって夜中3時に「サーバー落ちた!」って通知が来て、最後のバックアップが2週間前だった…なんて気づきたくないよね。自動化ならこの問題も解決!もうヒューマンエラーでデータを危険にさらすことはないよ。

自動化ツールはいろいろあるけど、今日は特に人気な2つを紹介するね:

  1. cron — Linuxで昔から使われてる万能なタスクスケジューラー。
  2. pg_cron — PostgreSQLの拡張機能で、DBサーバーから直接ジョブを実行できるやつ。

pg_cronの裏側ではcronサービスを叩いてる。このサービスはLinux限定だよ!

じゃあ、始めよう!

pg_cronのインストール

pg_cronはPostgreSQLの拡張機能で、DB内で自動ジョブのスケジュールができる。これでPostgreSQLがちょっとしたオペレーションセンターに進化するよ。

インストール手順:

  1. PostgreSQL 10+を使ってるか確認しよう。pg_cronは新しめのバージョンだけサポートしてるからね。
  2. システムのパッケージマネージャーで拡張機能をインストール。例えばUbuntuなら:

    sudo apt install postgresql-<version>-cron
    

    <version>は自分のPostgreSQLバージョンに置き換えてね。

  3. PostgreSQLの設定ファイルで拡張機能を有効化。postgresql.confを開いて、これを追加:

    shared_preload_libraries = 'pg_cron'
    

    なんでこれが必要?pg_cronはPostgreSQL起動時にライブラリを読み込む必要があるから、これが必須なんだ。

  4. PostgreSQLサーバーを再起動:

    sudo systemctl restart postgresql
    
  5. 自分の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: 「ログどこいった?」

コマンドの出力をログファイルにリダイレクトするのを忘れずに。これがないと、何が起きたか全然分からないよ。

これでデータベースのバックアップ自動化はバッチリ!サーバーが急にバケーションに行っても、君のデータはちゃんと守られてるから安心してね!

2
タスク
SQL SELF, レベル 44, レッスン 0
ロック未解除
`pg_cron`を使った自動バックアップの作成
`pg_cron`を使った自動バックアップの作成
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION