部分バックアップの作成を容易にするため、MySQL Enterprise Backup 3.10 では、--include-tables
と --exclude-tables
という部分バックアップ用の 2 つの新しいオプションが導入されています。これらの新しいオプションは、--include
、--databases
、--databases-list-file
、および --only-innodb-with-frm
の古いオプションに置き換わるものです。これらの古いオプションは新しいオプションと互換性がなく、次回のリリースで非推奨になります。次の説明では、この新しいオプションが部分バックアップに使用されることを想定しています。参考のため、古いオプションに関する情報をこのセクションの最後の「レガシーオプションによる部分バックアップの作成」に記載しています。
デフォルトではデータディレクトリ内のすべてのファイルがバックアップに含まれるため、このディレクトリ内のすべての MySQL ストレージエンジン、サードパーティー製ストレージエンジン、さらにはデータベース以外のファイルからのデータも、バックアップに含まれます。このセクションでは、データをバックアップするか除外するか選択する場合に使用できるオプションについて説明します。
MySQL Enterprise Backup には、次のようなさまざまな部分バックアップを作成する複数の方法が用意されています。
-
特定のテーブルをその名前で含めるまたは除外する。これは、
--include-tables
オプションまたは--exclude-tables
オプションを使用します。--include-tables
オプションまたは--exclude-tables
オプションで指定された正規表現と照合して各テーブルがチェックされます。正規表現がテーブルの完全修飾名に一致すると (db_name.table_name
の形式)、そのテーブルがバックアップに含められるか除外されます。使用される正規表現構文は、POSIX 1003.2 規格で指定された拡張形式です。これらのオプションは、Henry Spencer の正規表現ライブラリとともに実装されています。 InnoDB テーブルの一部またはすべてを含めるが、ほかのテーブルタイプは含めない。これは、
--only-innodb
オプションを使用します。MySQL データディレクトリに存在するが、実際には MySQL インスタンスの一部ではないファイルを除外する。これは、
--only-known-file-types
オプションを使用します。前述のオプションの組み合わせを使用して、複数の選択結果を得る。
トランスポータブルテーブルスペース (TTS) を使用して選択した InnoDB テーブルをバックアップする。これは、
--use-tts
オプションと--include-tables
オプションまたは--exclude-tables
オプション (あるいは両方) を使用します。
関連するすべてのオプションの構文の詳細は、セクション5.1.9「部分バックアップとリストアオプション」を参照してください。
通常、部分バックアップは、完全な MySQL インスタンスを構築するために必要な相互関連要素がバックアップデータに含まれていない場合があるため、完全バックアップよりもリストアが困難です。特に、InnoDB テーブルが保持する内部 ID とその他のデータ値は、同じインスタンスにのみリストアでき、別の MySQL Server ではリストアできません。必ず、関連した手順と制限について理解するために、どの部分バックアップでもリカバリ手順を十分にテストしてください。
InnoDB システムテーブルスペースは、インスタンス内のすべてのデータベースからの InnoDB テーブルに関するメタデータを保持しているため、ほかのデータベースを含むサーバー上で部分バックアップをリストアすると、システムがほかのデータベース内のこれらの InnoDB テーブルを追跡できなくなる可能性があります。部分バックアップは必ず、維持する必要のあるほかの InnoDB テーブルを含まない、新規の MySQL Server インスタンスでリストアしてください。
次に、部分バックアップのコマンド例を示します。
「emp」 で始まる名前のテーブルをすべてバックアップに含める場合:
$ mysqlbackup \
--host=localhost --user=mysqluser --protocol=TCP --port=3306 \
--backup-dir=$MEB_BACKUPS_DIR/backupdir \ --include-tables='\.emp' \
backup
「mysql」 データベースと 「performance_schema」 データベースからのテーブルを除き、すべてのテーブルのバックアップを取得する場合:
$ mysqlbackup \
--host=localhost --user=mysqluser --protocol=TCP --port=3306 \
--backup-dir=$MEB_BACKUPS_DIR/backupdir \
--exclude-tables='^(mysql|performance_schema)\.' \
backup
「sales」 データベース内のすべてのテーブルのバックアップを取得するが、「hardware」 という名前のテーブルを除く場合:
$ mysqlbackup \
--host=localhost --user=mysqluser --protocol=TCP --port=3306 \
--backup-dir=$MEB_BACKUPS_DIR/backupdir \
--include-tables='^sales\.' --exclude-tables='^sales\.hardware$' \
backup
すべての InnoDB テーブルをバックアップするが、.frm
ファイルはバックアップしない場合:
$ mysqlbackup --defaults-file=/home/pekka/.my.cnf --only-innodb backup
適切なオプションを追加することにより、圧縮、単一イメージ、およびほかの種類の選択的バックアップも作成できます。
次のステップ:
完全バックアップと増分バックアップの終わりに表示される、
mysqlbackup: Was able to parse the log up to lsn
などのメッセージ内の LSN 値を書き留めてください。この完全バックアップのあとに行われた変更の増分バックアップを実行するときに、この値を指定します。LSN_number
いつでも完全バックアップをリストアできるよう、非圧縮バックアップファイルにログを適用します。最初にバックアップデータを別のサーバーに移動して、データベースサーバーでこの操作を実行する CPU および I/O オーバーヘッドを回避できます。
ログを適用したあと、定期的に増分バックアップを取得します。これらのような完全バックアップより非常に高速で、小さくなります。
レガシーオプションによる部分バックアップの作成
このサブセクションの情報は、--include
、--databases
、--databases-list-file
、および --only-innodb-with-frm
のレガシーオプションを使用するためだけのもので、これらのオプションは次回の発行時に非推奨になります。部分バックアップの作成には、代わりに --include-tables
と --exclude-tables
の新しいオプションを使用することを強くお勧めします。部分バックアップのレガシーオプションと新しいオプションを単一のコマンドで組み合わせることはできません。
MySQL Enterprise Backup では、部分バックアップのレガシーオプションを使用して、次のようなさまざまな部分バックアップを作成できます。
特定の InnoDB テーブルを含めるが、ほかのテーブルは含めない。この操作には、
--include
、--only-innodb
、および--only-innodb-with-frm
のオプションが含まれます。選択したデータベースからの特定の非 InnoDB テーブルを含めるが、それ以外は含めない。この操作には、
--databases
オプションと--databases-list-file
オプションが含まれます。
これらのすべてのオプションに関する構文の詳細は、「レガシー部分バックアップオプション」を参照してください。
通常、部分バックアップは、完全な MySQL インスタンスを構築するために必要な相互関連要素がバックアップデータに含まれていない場合があるため、完全バックアップよりもリストアが困難です。特に、InnoDB テーブルが保持する内部 ID とその他のデータ値は、同じインスタンスにのみリストアでき、別の MySQL Server ではリストアできません。必ず、関連した手順と制限について理解するために、どの部分バックアップでもリカバリ手順を十分にテストしてください。
mysqlbackup は、その --include
オプションを使用して、一部の InnoDB テーブルを含み、ほかのテーブルは含まないバックアップを作成できます。
--include
オプションによる部分バックアップには、常に、InnoDB システムテーブルスペースとその内部のすべてのテーブルが含まれます。システムテーブルスペース外に格納された InnoDB テーブルの場合、部分バックアップには、その名前が、
--include
オプションで指定された正規表現に一致するテーブルだけが含まれます。
この操作には、除外されるテーブルが、個別の
ファイルに格納されることが必要です。InnoDB テーブルをシステムテーブルスペース外に置くには、table_name
.ibdinnodb_file_per_table
MySQL 構成オプションが有効な間に InnoDB テーブルを作成します。それぞれの .ibd
ファイルには、1 つのテーブルのデータとインデックスだけが保持されます。
innodb_file_per_table
をオフにして作成されたこれらの InnoDB テーブルは、InnoDB システムテーブルスペースに通常どおりに格納され、バックアップから除外できません。
per-table データファイルを含むテーブルごとに、db_name.table_name
の形式の文字列が、--include
オプションで指定された正規表現と照合してチェックされます。正規表現が文字列 db_name.table_name
全体に一致した場合、テーブルはバックアップに含められます。使用される正規表現構文は、POSIX 1003.2 規格で指定された拡張形式です。Unix のようなシステムでは、適宜、正規表現を引用符で囲んで、シェルメタキャラクタが解釈されないようにしてください。この機能は、Henry Spencer の正規表現ライブラリとともに実装されています。
生成されたバックアップディレクトリには、バックアップログファイルと InnoDB データファイルのコピーが含まれます。
重要: mysqlbackup コマンドは部分バックアップの取得をサポートしますが、部分バックアップからデータベースをリストアするときには注意してください。mysqlbackup は、たとえば --databases
オプションを使用して部分バックアップを実行したときを除き、バックアップに含まれないテーブルの .frm
ファイルもコピーします。--include
オプションを付けて mysqlbackup を使用する場合は、データベースのリストア前に、バックアップに含まれないすべてのテーブルの .frm
ファイルをバックアップデータから削除してください。
重要: InnoDB システムテーブルスペースは、インスタンス内のすべてのデータベースからの InnoDB テーブルに関するメタデータを保持しているため、ほかのデータベースを含むサーバー上で部分バックアップをリストアすると、システムがほかのデータベース内のこれらの InnoDB テーブルを追跡できなくなる可能性があります。部分バックアップは必ず、維持する必要のあるほかの InnoDB テーブルを含まない、新規の MySQL Server インスタンスでリストアしてください。
--only-innodb
オプションと --only-innodb-with-frm
オプションは、InnoDB テーブルだけをバックアップし、ほかのストレージエンジンのテーブルはスキップします。これらを --include
オプションと一緒に使用して、ほかのストレージエンジンが作成したほかのすべてのファイルを除きながら、InnoDB テーブルの選択的バックアップを作成することもできます。
例 3.1 InnoDB テーブルの非圧縮部分バックアップの作成
この例では、一部の InnoDB テーブルが独自のテーブルスペースを持つように MySQL を構成しました。ib
で始まる名前を持つ、test
データベース内の InnoDB テーブルだけを含む部分バックアップを作成します。test
データベースのデータベースディレクトリの内容を次に示します。このディレクトリには、データベースの各テーブル (alex1
、alex2
、alex3
、blobt3
、ibstest0
、ibstest09
、ibtest11a、ibtest11b
、ibtest11c
、および ibtest11d
) の MySQL 説明ファイル (.frm
ファイル) が含まれます。これら 10 個のテーブルのうち、6 つ (alex1
、alex2
、alex3
、blobt3
、ibstest0
、ibstest09
) は per-table データファイル (.ibd
ファイル) に格納されます。
$ ls /sqldata/mts/test
alex1.frm alex2.ibd blobt3.frm ibstest0.ibd ibtest11a.frm ibtest11d.frm
alex1.ibd alex3.frm blobt3.ibd ibtest09.frm ibtest11b.frm
alex2.frm alex3.ibd ibstest0.frm ibtest09.ibd ibtest11c.frm
--include
オプションを付けて mysqlbackup を実行します。
# Back up some InnoDB tables but not any .frm files.
$ mysqlbackup --defaults-file=/home/pekka/.my.cnf --include='test\.ib.*' --only-innodb backup
...many lines of output...
mysqlbackup: Scanned log up to lsn 2666737471.
mysqlbackup: Was able to parse the log up to lsn 2666737471.
mysqlbackup: Maximum page number for a log record 0
101208 17:17:45 mysqlbackup: Full backup completed!
# Back up some InnoDB tables and the .frm files for the backed-up tables only.
$ mysqlbackup --defaults-file=/home/pekka/.my.cnf --include='test\.ib.*' \
--only-innodb-with-frm=related backup
...many lines of output...
mysqlbackup: Scanned log up to lsn 2666737471.
mysqlbackup: Was able to parse the log up to lsn 2666737471.
mysqlbackup: Maximum page number for a log record 0
101208 17:17:45 mysqlbackup: Full backup completed!
バックアップディレクトリには、ibstest
テーブルと ibtest09
テーブルのバックアップだけが含まれます。ほかの InnoDB テーブルは test\.ib.*
のインクルードパターンに一致しませんでした。ただし、ibtest11a
、ibtest11b
、ibtest11c
、ibtest11d
のテーブルは、常にバックアップに含まれているシステムテーブルスペース (ibdata1
file) に格納されているため、次に示すディレクトリに表示されていなくてもバックアップに含まれていることに注意してください。
# With the --only-innodb option:
$ ls /sqldata-backup/test
ibstest0.ibd ibtest09.ibd
# With the --only-innodb-with-frm=related option:
$ ls /sqldata-backup/test
ibstest0.frm ibtest09.frm
ibstest0.ibd ibtest09.ibd
例 3.2 圧縮部分バックアップの作成
すべての InnoDB テーブルが独自のテーブルスペースを保持するように、MySQL を構成しました。alex
または blob
で始まる名前を持つ InnoDB テーブルだけを含む部分バックアップを作成します。test
データベースのデータベースディレクトリの内容を次に示します。
$ ls /sqldata/mts/test
alex1.frm alex2.ibd blobt3.frm ibstest0.ibd ibtest11a.frm ibtest11d.frm
alex1.ibd alex3.frm blobt3.ibd ibtest09.frm ibtest11b.frm
alex2.frm alex3.ibd ibstest0.frm ibtest09.ibd ibtest11c.frm
--compress
オプションと --include
オプションを付けて mysqlbackup を実行します。
$ mysqlbackup --defaults-file=/home/pekka/.my.cnf --compress \
--include='.*\.(alex|blob).*' --only-innodb backup
...many lines of output...
mysqlbackup: Scanned log up to lsn 2666737471.
mysqlbackup: Was able to parse the log up to lsn 2666737471.
mysqlbackup: Maximum page number for a log record 0
mysqlbackup: Compressed 147 MB of data files to 15 MB (compression 89%).
101208 17:18:04 mysqlbackup: Full backup completed!
データベース test
のバックアップディレクトリを次に示します。.ibz
ファイルは圧縮された per-table データファイルです。
$ ls /sqldata-backup/test
alex1.ibz alex2.ibz alex3.ibz blobt3.ibz
mysqlbackup コマンドの --databases
オプションと --databases-list-file
オプションを使用すれば、MySQL インスタンス全体ではなく選択したデータベースだけから、非 InnoDB テーブルをバックアップできます。(InnoDB テーブルをフィルタするには、代わりに --include
オプションを使用します。)--databases
では、データベース名のスペース区切りのリストを指定し、リスト全体を二重引用符で囲みます。--databases-list-file
では、データベース名のリストを含むファイルのパスを、1 行に 1 つずつ指定します。
データベース名の一部またはすべてをテーブル名で修飾して、これらのデータベースから選択した非 InnoDB テーブルだけをバックアップできます。
このオプションを指定する場合は、必ず、すべてのバックアップ (基本的に増分バックアップ) で同じデータベースセットを含め、データベースの古いバージョンをリストアしないようにしてください。