logrotateでmysqlの定期バックアップを簡単自動化!
こんにちはー!むちょこです。
mysql の自動バックアップ設定をする機会があったので、方法をここに記録しておきます。
ここでは logrotate
から mysqldump
を実行することで、毎日のバックアップファイル作成と古いファイルの削除を自動化しています。
手順
1. mysql の専用ユーザを作成する
意図せぬ操作の予防で、バックアップ専用ユーザを作成します。
新規ユーザの作成
今回は mysql
がインストールされているサーバと logrotate
を実行したいサーバが同じなので、ホストには localhost
を指定しました。違うサーバの場合は適宜変更してください。
CREATE USER `{your_name}`@`localhost` IDENTIFIED BY {your_password};
対象テーブルに最低限の権限だけを付与
作成したユーザに対して mysqldump
の実行に必要な SELECT
と LOCK 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