MySQL 5.5.x のバックアップ/リカバリ

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

Comments are closed.