MySQL – 障害対応方法

  • 投稿者:
  • 投稿カテゴリー:MySQL

その前に – バックアップの考え方

mysqldump -uroot -ppassword –single-transaction –master-data=2 –flush-logs –all-databases > alldatabase.sql

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
START TRANSACTION WITH CONSISTENT SNAPSHOT
#その瞬間のデータのスナップショットが保持される
UNLOCK TABLES
DB選択
http://tree-tips.appspot.com/mysql/mysqldump/online_backup/

–single-transaction:一貫性を保持したバックアップを取得できる。
これをつけないと、mysqldump があるテーブルをダンプしている間に、まだダンプしてない別のテーブルが他の接続により更新されると、取得したバックアップは更新前と後のテーブルが混在する

MySQL 5.5.21 未満の注意事項

mysqldump –single-transaction –master-data –flush-logs DB名
※MySQL 5.5 ではこの組み合わせはうまくいかない。
MySQL 5.5 では「FLUSH LOGS*2」でトランザクションが暗黙的に終了(COMMIT)するため
バグとして登録されてました(http://bugs.mysql.com/61854)が、MySQL 5.5.21 で修正されました。

障害時 – まず対応すること

MySQL サーバ(InnoDB)のクラッシュから復旧する為のたった一つの要求事項は、再起動させる事です。
InnoDB は自動的にログを確認し、データベースの前進を現在まで実行します。
InnoDB はクラッシュした時に存在していなかった、コミットされていないトランザクションを自動的にロールバックします。

テーブルが破損したかどうかを確認する為に CHECK TABLE SQL ステートメントを利用する事ができます

明白なデータベース ページの破損は、OSがそれ自体のファイル キャッシュを破損している為に起きていて、
ディスク上のデータは無傷な事があります。まず最初にコンピュータを再起動するのが一番良いでしょう

スレーブの設定方法

GRANT REPLICATION SLAVE ON *.* TO repl@49.212.146.190 IDENTIFIED BY ‘x4fcXrCCpEsNkcu3mTvK’;

スレーブをマスタに切り替える

http://shin3tky.blogspot.jp/2010/02/mysql.html

バックアップから復旧する

http://beausoir.blog100.fc2.com/blog-entry-86.html
mysqlbinlog –stop-datetime=”2007-06-22 12:45:00″ /backup/mysql-bin.000020 > /backup/recovery.sql

positionも指定できる
mysqlbinlog –no-defaults –start-position 107 /var/log/mysql/mysql-bin.000094 > test1.log.sql

注意事項

他のデータベースの更新情報があると復旧が困難となる
そのためall-databaseの情報から復旧が一番良い

# mysqldump -uroot -pM4az2w1AMLSZX4HQ6G4I --single-transaction --master-data=2 --flush-logs test1 > test1.sql
# mysql -uroot -pM4az2w1AMLSZX4HQ6G4I
mysql> INSERT INTO  `test1`.`tb1` (`num`)VALUES ('2');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO  `test2`.`tb2` (`num`)VALUES ('2');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO  `test1`.`tb1` (`num`)VALUES ('3');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO  `test2`.`tb2` (`num`)VALUES ('3');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO  `test1`.`tb1` (`num`)VALUES ('4');
Query OK, 1 row affected (0.01 sec)

# mysqldump -uroot -pM4az2w1AMLSZX4HQ6G4I test2 > test2.sql
# lv mysql1.log →'mysql-bin.000097', MASTER_LOG_POS=107;
# mysql -uroot -pM4az2w1AMLSZX4HQ6G4I test1 < test1.sql
# mysql -uroot -pM4az2w1AMLSZX4HQ6G4I test1 < test1.log.sql
→'test2.tb2'がないというエラーになる

参考

http://dev.mysql.com/doc/refman/5.1/ja/innodb-backup.html