[CentOS/RHEL] logrotateでMySQLの定期バックアップ&世代保持

    

logrotateの設定

/etc/logrotate.d/mysql-full-dump

/opt/dbbackup/mysql-daily-backup.dump {
    
    daily
    rotate 3

    missingok
    notifempty
    sharedscripts
    nocompress

    postrotate
        mysqldump --opt --all-databases --events --flush-logs --single-transaction --user=dbuser --password='dbpassword' | gzip > /opt/dbbackup/mysql-daily-backup.dump 
    endscript


}

ローテートと同時にバックアップを実行しています。実行時にバックアップファイルが存在していないとpostrotateによるバックアップが実行されないので下記のコマンドで空ファイルを作成しておきます。

touch /opt/dbbackup/mysql-daily-backup.dump

手動実行ではうまく実行できるが日次処理でバックアップされない場合

手動実行手順はコチラを参照

数日間放置したのですが一向にバックアップされる気配がありませんでした。
/var/lib/logrotate.statusを見るとタイムスタンプが更新されているので実行されているようですがバックアップファイルが作成されない状況。
下記のコマンドによる手動実行ではうまくバックアップされる。

logrotateの強制実行

/usr/sbin/logrotate -f /etc/logrotate.d/mysql-full-dump

cronの日次処理の強制実行

/etc/cron.daily/logrotate

※ /var/lib/logrotate.statusの該当項目の日付を前日のものに変更してから実行
どうもタイミングの問題のようです。
mysqlのログファイル(/var/log/mysqld.log)を確認するとバックアップ時間と近いタイミングでログ関連の都合でmysqlの再起動が行われているようで、この再起動後にプロセスが立ち上がりきらないタイミングでバックアップしようとしてこけている雰囲気です。

mysqlのバックアップ時間を変更する

というわけで安全そうな時間にバックアップ処理を移動します。
「/etc/logrotate.d」に置いておくと日次処理で実行されますが時間が指定できないため、別なディレクトリとして「/etc/logrotate.d」直下に「manual」ディレクトリを作成しそこに移動することで通常の日次処理で実行されないようにしてしまいます。

cd /etc/logrotate.d
mkdir manual
mv mysql-full-dump ./manual

その後、手動実行コマンドをcrontabコマンドで登録します。
ここでは毎日午前4時に実行するように設定しました。

# crontab -e


0 4 * * * /usr/sbin/logrotate -f /etc/logrotate.d/manual/mysql-full-dump >/dev/null 2>&1