MySQL テーブルはファイルとして保存されるため、バックアップが簡単です。一貫したバックアップを行うには、そのテーブルに対して LOCK TABLES を実行してから、FLUSH TABLES を実行します。
See 項6.7.5. 「LOCK TABLES および UNLOCK TABLES 構文」。
See 項4.6.4. 「FLUSH 構文」。
読み取りロックだけが必要なので、データベースディレクトリのファイルをコピーしている間も、他のスレッドはテーブルに対してクエリを続行できます。FLUSH TABLE は、バックアップを開始する前に、キャッシュされているページをすべてディスクに書き込むために必要です。
3.23.56 から 4.0.12 では、セキュリティ上のリスクがあるため、BACKUP TABLE で既存ファイルの上書きはできないようになっています。
テーブルを SQL レベルでバックアップするには、
SELECT INTO OUTFILE または BACKUP TABLE を使用します。 See 項6.4.1. 「SELECT 構文」。
See 項4.5.2. 「BACKUP TABLE 構文」。
データベースのバックアップには、mysqldump プログラムまたは mysqlhotcopy script を使用することもできます。 See 項4.9.7. 「mysqldump(テーブル構造とデータのダンプ)」。
See 項4.9.8. 「mysqlhotcopy(MySQL のデータベースとテーブルのコピー)」。
データベースをフルバックアップする。
shell> mysqldump --tab=/path/to/some/dir --opt db_name または shell> mysqlhotcopy db_name /path/to/some/dir
サーバが何かを更新中でなければ、すべてのファイル(*.frm、*.MYD、および *.MYI)を単にコピーすることもできる。
スクリプト mysqlhotcopy はこの方法を使用している。
注意: データベースに InnoDB テーブルが含まれている場合、InnoDB はテーブルコンテンツをデータベースディレクトリに保存しないため、この方法は使用できない。mysqlhotcopy は MyISAM テーブルと ISAM テーブルにのみ有効。
mysqld が実行中であればいったん停止し、--log-bin[=file_name] オプションで再起動する。See 項4.10.4. 「バイナリログ」。 mysqldump 実行後に行われたデータの変更をレプリケートするための情報が、バイナリログファイルにより提供される。
MySQL サーバがスレーブの場合、どのバックアップ方法を選択しても、スレーブのデータをバックアップするとき、master.info ファイルと relay-log.info ファイルもバックアップしてください。これらのファイルは、スレーブのデータをリストア後、レプリケーションを再開するときに必要です。スレーブが、レプリケーションを行う LOAD DATA INFILE コマンドの対象となっていた場合、SQL_LOAD-* ファイルもバックアップしてください。このファイルは、--slave-load-tmpdir オプションによって指定されているディレクトリにあります(このファイルの場所が指定されていない場合、デフォルトで、この場所は tmpdir 変数の値になります)。中断されていた LOAD DATA INFILE 処理のレプリケーションを再開するためにスレーブはこれらのファイルを必要とします。
何かをリストアする必要がある場合、最初に REPAIR TABLE または myisamchk -r を使用してテーブルのリカバリを試みてください。ほとんどの場合、これで成功するはずです。myisamchk でリカバリできなかった場合、以下を実行します。これは、--log-bin で MySQL を起動している場合にのみ可能な方法です。項4.10.4. 「バイナリログ」 を参照してください。
オリジナルの mysqldump バックアップ、またはバイナリバックアップをリストアする。
以下のコマンドを実行して、バイナリログ内の更新を再実行する。
shell> mysqlbinlog hostname-bin.[0-9]* | mysql
場合に応じて、特定の位置から後のバイナリログだけを再実行する(通常は、リストアしたバックアップの日付以降の、不正なクエリ以外のすべてのバイナリログを再実行する)。
mysqlbinlog ユーティリティおよびその使用法の詳細については、項4.9.5. 「mysqlbinlog(バイナリログからクエリを実行する)」 を参照のこと。
更新ログ(MySQL 5.0 で廃止)を使用している場合、更新ログの内容を以下のように実行できる。
shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
ls は、すべての更新ログファイルを正しい順序で取得するために使用します。
SELECT * INTO OUTFILE 'file_name' FROM tbl_name で選択的バックアップを行い、LOAD DATA INFILE 'file_name' REPLACE ... でリストアすることもできます。重複テーブルを避けるため、テーブルに PRIMARY KEY または UNIQUE キーが必要です。REPLACE キーワードを使用すると、ユニークキーが新規レコードと旧レコードで重複していた場合に、旧レコードが新規レコードで置き換えられます。
バックアップに伴いパフォーマンス上の問題が発生する場合、レプリケーションをセットアップして、マスタではなくスレーブ上でバックアップを実行することによりこの問題を解決できる。 See 項4.11.1. 「はじめに」。
Veritas ファイルシステムを使用している場合、以下を実行できます。
クライアント(または Perl)から、FLUSH TABLES WITH READ LOCK を実行する。
別のシェルから、mount vxfs snapshot を実行する。
最初のクライアントから、UNLOCK TABLES を実行する。
スナップショットからファイルをコピーする。
スナップショットのマウントを解除する。