MySQLのデータベースをバックアップ・復元するコマンドを紹介します。

いつも必要なときにど忘れしてしまうので、個人的なメモの意味も込めて・・・

MySQLのデータベースをバックアップするにはmysqldumpコマンドを使用します。

データベースをバックアップする

全てのデータベースをバックアップする方法や、特定のデータベースをバックアップする方法を紹介します。

全てのDBのバックアップ

$ mysqldump -u DBユーザ名 -p -A > 出力ファイル名

これはDBをロックとかはしていません、稼働中にバックアップする際は注意です。

ロックするには-xオプションを付けます。

-Aは–all-databasesと同義です。

特定のDBのバックアップ

$ mysqldump -u DBユーザ名 -p DB名 > 出力ファイル名

これで特定のデータベースのみバックアップできます。

特定のDBの定義のみバックアップ

$ mysqldump -u DBユーザ名 -p -d DB名 > 出力ファイル名

-dオプションを付けると定義のみバックアップできます。

データが入っていないってことです。DBのみ複製するときに利用します。

DBのデータのみバックアップ

$ mysqldump -u DBユーザ名 -p -t DB名 > 出力ファイル名

-tオプションを付けるとデータのみバックアップできます。

INSERT分だけバックアップです、CREATE TABLEは含まれません。

テーブルのデータのみバックアップ

$ mysqldump -u DBユーザ名 -p -t DB名 TABLE名 > 出力ファイル名

DB名の後にTABLE名を付けるとTABLEのデータのみ(INSERT)のみバックアップできます。

データベースを復元する(取り込み)

データを復元したり取り込むにはmysqlコマンドを利用します。

mysqlが稼働している必要があります。

全てのDBを復元

$ mysql -u DBユーザー名 -p < 出力ファイル名

全てのデータベースの出力ファイルを、データベースに復元します。

特定のDBのみを復元

$ mysql -u DBユーザー名 -p DB名 < 出力ファイル名

DB名を指定することで特定のDBにmysqldumpしたファイルを復元します。

DB稼働中のバックアップ

mysqldumpを使用するとDBがロックしてしまいます。

夜間などでシステムを停止している間にバックアップなら問題ありませんが、稼働中だと問題です。

InnoDBに限りますが、–single-transactionオプションを付けることでロック問題を解決できます。

–single-transactionとコマンド発行時の状態をスナップショットしてそのデータをダンプします。

スナップショットをダンプすることでロックする事なく 整合性のとれたダンプを取る事が可能です。

通常、停止できないシステム構成の場合はDBもmasterとslvae構成になっているはずなので-xオプション付けてslaveでダンプすればよいと思います。

-xオプションはデータベースのすべてのテーブルをリードロックします。

データベースをリードロックすると参照系クエリは発行できるが、 更新系クエリはロックが解除されるまで待ち状態になります。

slaveが参照クエリ用に構成されていればたぶん問題ないはずです。