Percona XtraBackupの機能紹介 (2) テーブル単位で抽出

XtraBackupシリーズで今回はテーブル単位のデータ抽出&リストアです。

通常は全データベースを対象としますが、テスト用とかで部分的に本番データが欲しい時などに利用できます。用意されている2種類の方法を紹介します。



利用条件

どちらの方法も、バックアップ/リストアの両サーバにおいて innodb_file_per_table 設定が有効な必要があります。


部分的なバックアップ

Partial Backups より。

正規表現指定 –tables

通常のバックアップと基本は同じで、–tables オプションを指定することで特定のテーブルのみを抽出できます。この例では sbtestデータベースの、test* テーブルのみ取り出しており、sbtestテーブルがスキップされていることがわかります。

リストアも手順は同じですが、prepare時に、存在しなくなったテーブルの警告がでます。
prepareの後はデータディレクトリとして普通に利用できます。

テーブルリストのファイル指定 –tables-file

テーブルリストを書いたファイルを利用することでもテーブルを指定できます。
リストの値は dbname.table を完全一致させて書きます。


テーブルのExportとImport

Exporting and Importing Tables より。
参考:任意のテーブルの IMPORT TABLESPACE – DB改造屋雑記

データディレクトリ丸ごとのリストアではなく、テーブル単位で出し入れしたい時にこれを利用します。InnoDBのテーブルデータは、単に .ibd と .frm ファイルをデータディレクトリにコピーしてもテーブルとして利用することができないためです。

Export

innodb_file_per_table ONのバックアップデータに対して、–export をつけて –prepare すると、.ibd の横に .exp ファイルが出来上がります。これ自体はデータを取り出してるわけじゃないのでExportって言うと違和感がありますね…

Import

このデータを稼働中のMySQLにインポートします。

innodb_expand_import はv5.5.10で
innodb_import_table_from_xtrabackup に名称変更されています。


既存のテーブルと入れ替えたい場合で、外部キーがあるデータの場合は一時的に無効にしてからImportする必要があります。(参照:Expand Table Import

このExport & Import は、ちょっと手順をミスるとテーブル操作ができなくなったりするので、テスト環境で納得するまで遊んでみるとよいです。


MySQL5.6 からはInnoDBテーブル単位での移行ができるようになるみたいで、.exp が .cfg になっているところが似た匂いを感じますが、

  • Understanding InnoDB transportable tablespaces in MySQL 5.6
  • 開発スピードアクセル全開ぶっちぎり!日本よ、これがMySQL 5.6だッ!! – 漢(オトコ)のコンピュータ道

  • 例で UNLOCK TABLES; を実行しているところをみると、テーブル単位でのオンラインバックアップができないと実用には少し遠いかも知れません。Percona Serverも5.6になった時、この辺の扱いがどうなるかは注目せざるを得ないところですね。