mysql の定期的なバックアップ

  • 149
    いいね
  • 3
    コメント
この記事は最終更新日から1年以上が経過しています。
  • 解説が不十分な部分ついては、補足(コピペで本文に取り込める体裁だとありがたい)を頂けると助かります!
  • mysqlのバックアップ手法に関しては様々な方法がありますので随時追記していきたいと思います!
  • サーバー構成に関しても様々なパターンがありますので、随時追記していきたいと思います。

mysql-server 5.1.8以降では、以前の手法ではWarningが発生するようになったため、
それ回避した上での手法を公開したいと思います。

まずmysql5.1.8以前のバージョンでのバックアップ手法


mysqldump --opt --all-databases --default-character-set=binary -u root > /root/backup/mysql/all_db.sql

以前はこれで問題なかったのですが、5.1.8以降では上記コマンドを実行すると下記のWaningが
発生するようになりました。


-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.

これはバージョン5.1.8からmysqlデータベースにeventsテーブルが追加されたことが原因です。

mysqldump コマンドに対して全てのデータベース内容をdumpする「--all-databases」のオプションを付与している場合、
これまでの手法では上記のeventsテーブルのみが対象外となってしまっているために発生しているWaningです。

この回避策としては、mysqldum コマンドに対して「--all-databases」のオプションを付与している場合は
さらに「--events」 のオプションを追加する必要があります。

これらの内容を反映した上での、バックアップ取得スクリプトを作成してみました。

/bin/sh + mysqldump バージョン

事前準備(バックアップ保存用ディレクトリの作成)

sudo mkdir /root/backup/mysql


スクリプト作成開始

sudo vim /root/backup4mysql.sh


backup4mysql.sh
#!/bin/sh

# 他のユーザからバックアップを読み込めないようにする
umask 077

# バックアップファイルを何日分残しておくか(一ヶ月分)
period=31
# バックアップファイルを保存するディレクトリ
dirpath='/root/backup/mysql'

# ファイル名を定義(※ファイル名で日付がわかるようにしておきます)
filename=`date +%y%m%d`

# mysqldump実行(ファイルサイズ圧縮の為gzで圧縮しておきます。)
mysqldump --opt --all-databases --events --default-character-set=binary -u root --password=パスワード | gzip > $dirpath/$filename.sql.gz

# 古いバックアップファイルを削除
oldfile=`date --date "$period days ago" +%y%m%d`
rm -f $dirpath/$oldfile.sql.gz

アクセス権限設定変更

このshellにはmysqlのrootのパスワードが丸々記載されているため、rootユーザ以外は内容を閲覧できなくしておく必要があります。


sudo chmod 0700 /root/backup4mysql.sh


cron設定

最後にこのスクリプトをcronで定期実行することにより、定期的に全データベースのバックアップを取得することが可能となります。


su -
echo "0 3 * * * root /root/backup4mysql.sh" > /etc/cron.d/backup4mysql

以上、ご参考になれば幸いです。