💬

logrotateでmysqlの定期バックアップを簡単自動化!

2022/12/08に公開

こんにちはー!むちょこです。
mysql の自動バックアップ設定をする機会があったので、方法をここに記録しておきます。

ここでは logrotate から mysqldump を実行することで、毎日のバックアップファイル作成と古いファイルの削除を自動化しています。

手順

1. mysql の専用ユーザを作成する

意図せぬ操作の予防で、バックアップ専用ユーザを作成します。

新規ユーザの作成

今回は mysql がインストールされているサーバと logrotate を実行したいサーバが同じなので、ホストには localhost を指定しました。違うサーバの場合は適宜変更してください。

CREATE USER `{your_name}`@`localhost` IDENTIFIED BY {your_password};

対象テーブルに最低限の権限だけを付与

作成したユーザに対して mysqldump の実行に必要な SELECTLOCK TABLES の権限を付与します。

GRANT SELECT, LOCK TABLES ON {your_database}.* to `{your_name}`;

2. logrotateの設定ファイルを作成する

logrotate.d ディレクトリの中に、適当なファイルを作成します。
ここではファイル名を mysqldump としました。分かりやすい名前ならなんでも良いです。
また、保存先を/var/log/dump.sql にしました。これもお好きな場所に変更可能です。

# vim /etc/logrotate.d/mysqldump

/var/log/dump.sql.gz {
        daily
        rotate 7
        size 0
        missingok
        nocompress
        postrotate
                mysqldump -u{your_name} -p{your_password} {your_database} | gzip > /var/log/dump.sql.gz
        endscript
}

設定内容の詳細

上記で設定した内容の意味は、以下のコメントの通りです。

/var/log/dump.sql.gz {  # /var/log/dump.sql.gz をローテートする
        daily           # 毎日ローテートを実行する
        rotate 7        # 7世代分のログファイルを残す
        size 0          # 更新中のログファイルが 0byte を超えたときにローテートする
        missingok       # ログファイルがなくてもエラーを出力しない
        nocompress      # ローテート時に圧縮しない
        postrotate      # ここから endscript までのスクリプトをローテート後に実行する
                mysqldump -u{your_name} -p{your_password} {your_database} | gzip > /var/log/dump.sql.qz # 作成したユーザで `mysqldump` コマンドを実行し、結果を gzip で圧縮して出力する
        endscript
}

3. 手動実行

エラーなくローテートされるか手動実行して確認していきます。
ファイルがないとローテートのしようがないので、初回は空のファイルを作ります。

# touch /var/log/dump.sql
# gzip /var/log/dump.sql

詳細表示の v と強制ローテートの f オプションをつけて実行します。

# /usr/sbin/logrotate -vf /etc/logrotate.d/mysqldump

エラーが出たら修正してください。
空ファイルがローテートされ、新しい dump ファイルが作成されたことを確認します。

-rw-r--r--   1 root   root    192972 Dec  7 12:26 dump.sql.gz
-rw-r--r--   1 root   root        35 Dec  7 12:26 dump.sql.gz.1

4. 自動実行結果確認

翌日以降に以下が確認できれば設定完了です。

  • 自動でファイルが作成されている
  • 古いファイルがローテートされている

トラブルシューティング

うまく行かないときは次の項目を確認していきます。

実行ログの確認

実行された日付を確認します。

# cat /var/lib/logrotate/logrotate.status

logrotate.status ファイルのデフォルトの場所は環境によって異なります。# man logrotate の実行で確認できます。

手動実行

実行エラーが出ないか確認します。

# /usr/sbin/logrotate -vf /etc/logrotate.d/mysqldump

スクリプトだけ実行

postrotate ~ endscript の間に書いたスクリプトが正常に動くのか確認します。

# mysqldump -u{your_name} -p{your_password} {your_database} | gzip > /var/log/dump.sql.qz

Discussion