MySQLバックアップ&リストアまとめ

mysqldump利用上の注意点

  • バックアップデータの整合性
    • デフォルトオプション(--opt)に含まれる--lock-tablesでは複数DB内のテーブルを同時にロックできない→どうする?
    • InnoDBのみの場合:single-transactionを使えば、整合性を保ちつつテーブルの更新も可能な状態でバックアップできる
    • MyISAMも利用している場合:--lock-all-tablesを使えば整合性を保てる…が、MySQLサーバ全体がReadOnlyになる
  • LOAD DATAでリストアを高速化する   
    • mysqldumpはデータがINSERTコマンドで表現されておりリストアに時間が掛かる
    • データをタブ区切りデータで出力し、LOAD DATAコマンドでリストアすることで高速にリストアできる
    • tabオプションを利用することで、テーブル名.sql(テーブル定義、CREATEコマンド)とテーブル名.txt(テーブルのデータ)が作成される  

shell>mysqldump [options] --tab=ファイルの出力先 [データベースやテーブルの指定]  

    • リストア時には.sqlファイルでテーブルを再作成し、LOAD DATAコマンドで.txtのファイルをロードする。
    • tabオプションは--databaseおよび--all-databasesオプションと併用できないことに注意
  • ログのローテーション
    • バイナリログで差分バックアップを行いたい場合は、mysqldump時に--flush-logsオプションを付けてバイナリログのローテーションを行う。
    • そうすることで、フルバックアップに適用するべきバイナリログの開始位置が新しいログファイルの先頭からになりわかりやすくなる。
    • しかし、そのままだと複数のDBをダンプする場合に個々のダンプを解する時点でログのローテーションが行われてしまうので、対策として、--master-dataオプションを利用することでmysqldumpトランザクションの開始とログのローテーションを同期する。
    • つまり、複数DBのdump時に--flush-logsオプションを利用する場合は、--master-dataオプションは必須
    • ただし、master-dataは本来レプリケーションスレーブのセットアップをするためのオプションで、バイナリログのファイル名と現在位置をCHANGE MASTER TO 形式で出力するためのもの。これをコメントアウトするために、--master-data=2を指定する。

リストア方法

  • dumpファイルのリストア

shell> mysql -uユーザ名 -p < dump.sql

  • LOAD DATA(.sqlの方はdumpファイルのリストアと同じ方法。ここではデータの中身の戻し方)

mysql> LOAD DATA INFILE '/backup/テーブル名.txt' INTO TABLE テーブル名;

    • LOAD DATAでは、ファイルのテキストデータの文字コードをDBのデフォルトの文字コードであるとみなすので、DBの文字コードとテキストデータの文字コードが異なっていると文字化けが発生してしまう。
    • LOAD DATAコマンドを実行する前に、SET @@character_set_database=binaryにしておく
    • もしくは、LOAD DATAのフロントエンドのmysqlimportを利用する