WordPressのためというのが現在の主な用途ですが、MySQLを稼働させています(記事投稿時点での最新バージョン5.5.9を使用)。
さて、そうなるとMySQLには大切なデータを保存していることになるので、データの保全性とブログの可用性向上のためにバックアップ/リカバリの構築が必要になります。
もちろん、高いレベルを求めれば切りがありませんので、最も手軽で簡単な方法を採りたいと考え、まずはmysqldumpでのバックアップ運用とmysql、mysqlbinlogを使用した復旧(リストア&リカバリ)の手順を構築しておこうと思います。
【可用性要件】
要件は、
「毎日夜中に全データベースのバックアップを取る」
ということです。
【バックアップ】
オンラインバックアップを行うことにします。バックアップ設定手順は次の通りです。
1.cronの確認
[root ~]# ps -ef | grep crond root 17548 1 0 2010 ? 00:00:01 crond ←稼働している! root 55239 44276 0 23:07 pts/0 00:00:00 grep crond
稼働していない場合の対応には文字数が必要なので、ここでは割愛します。
2.crontabの確認
[root ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 37 * * * * root run-parts /etc/cron.hourly 24 3 * * * root run-parts /etc/cron.daily ←毎日午前3時24分に実行する設定あり 36 0 * * 0 root run-parts /etc/cron.weekly 42 1 30 * * root run-parts /etc/cron.monthly
設定がなければ、記述します。
3./etc/cron.daily/mysqldumpの作成
ここでは、実行ユーザはrootで、パスワードはPASSWORDの場合を想定していますので、実際にはそれぞれの環境に沿って設定してください。
ここでは全データベースを一括してバックアップしています。
[root ~]# vim /etc/cron.daily/mysqldump ---以下を記述して保存--- #!/bin/sh mysqldump -u root -pPASSWORD --single-transaction --flush-logs --all-databases > /root/mysql/mysqldump/mysqldump_`date +%Y%m%d%H%M%S`.sql 2>/dev/null ---前行まで---
なお、サイズが大きくなるので、実用上は次のように圧縮する方がいいでしょう。
[root ~]# vim /etc/cron.daily/mysqldump ---以下を記述して保存--- #!/bin/sh mysqldump -u root --single-transaction --flush-logs --all-databases 2>/dev/null | gzip > /root/backup/mysqldump/mysqldump_`date +%Y%m%d%H%M`.sql.gz 2>/dev/null ---前行まで---
mysqldumpコマンドには多くのオプションがありますが、デフォルトで次の設定がなされています。
--add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset
バイナリデータ(BLOB型)を含むデータベースをバックアップする場合には、次のオプションを付け加えてください。
--hex-blob
4.バックアップテスト
[root ~]# /etc/cron.daily/mysqldump [root ~]# ll /root/mysql/mysqldump -rw-r--r-- 1 root root 16940604 2月 26 22:32 mysqldump_201102262232.sql
ファイルの中身は、データベースとテーブル、データを再作成するためのSQL文です。
【復旧(リストア&リカバリ)】
1.リストア
次のコマンドで、最終バックアップ時点の状態に戻します。
使用するバックアップファイルは直近最新のものを使用します。
[root ~]# mysql -u root -pPASSWORD < /root/mysql/mysqldump/mysqldump_201102262232.sql
2.リカバリ
次のコマンドで、リストアした最終バックアップ時点から障害発生時点にロールフォワードします。
[root ~]# mysqlbinlog -u root -pPASSWORD --disable-log-bin /var/lib/mysql/mysql-bin.000099 | mysql