今日はMySQLのバックアップ&リストア&リカバリのお勉強をしたので
メモ。
テスト環境:
Redhat系Linux/MySQL : 5.0.27-0vl6。
シチュエーション:
ある日、突然データベースがぶっとんでしまった(’A`)、ので、
数日前に取っておいた全体バックアップとリアルタイムで更新される
バイナリログを使用してデータベースを復旧させる。
●まず、定期的にデータベースの全体バックアップ(権限テーブル含む。
# mysqldump --user=root --password=rootpass --socket=/var/lib/mysql/mysql.sock
--single-transaction --master-data=2 --flush-logs --hex-blob
--default-character-set=binary --add-drop-table --all-databases > mysql-all.dump
(InnoDB以外のテーブルが含まれている場合は、共有ロックをかけるために
--single-transactionをはずしましょう。
(--flush-logsでバックアップと同時にbin-logもスイッチされる。
(/var/lib/mysqlにmysql-bin.000009が生成された
データベースが飛んだ・・・・・(’A`)
●Webアプリがデータベースを更新しないようにapacheをストップ
# service apache2 stop
●MySQLをストップ
# service mysql stop
●リストア、リカバリ時にバイナリログを生成しないように
my.cnfのlog-bin=mysql-binをコメントアウト
#log-bin=mysql-bin
●リモートから接続できなくするため--skip-networkingオプションでmysql起動
# /usr/bin/mysqld_safe --defaults-file=/etc/my.cnf --skip-networking --skip-grant-tables &
[1] 28450
# Starting mysqld-max daemon with databases from /var/lib/mysql
●全体バックアップからリストア
# mysql --user=root --socket=/var/lib/mysql/mysql.sock
--default-character-set=binary < mysql-all.dump
●バイナリログでリカバリ
(全体バックアップ時に新たに生成されたmysql-bin.000009~を使う。
# mysqlbinlog --disable-log-bin /var/lib/mysql/mysql-bin.000009 > recover.sql
# mysql --user=root --password=rootpass --socket=/var/lib/mysql/mysql.sock
--default-character-set=binary < recover.sql
●my.cnfのlog-bin=mysql-binを有効にする
log-bin=mysql-bin
●MySQL再起動
# service mysql stop
# service mysql start
これでOK^^
かな?