免責事項
この記事はBharathy Satish氏によるMySQL Server Blogの記事「Introducing mysqlpump」(2015/9/2)をユーザが翻訳したものであり、Oracle公式の文書ではありません。
MySQL 5.7.8から、新しいクライアントユーティリティーを提供しています。mysqlpumpと呼ばれる論理バックアップを行うもので、元のスキーマオブジェクトおよびテーブルデータを再生成できる一連のSQL文を作成するものです。mysqlpumpのゴールは、拡張可能でかつ並列化をネイティブサポートする最新の機能を持たせることです。我々はこれを達成する最善の方法は、全く新しいツールを作ることと考えました。mysqldumpとの互換性に縛られず、またいくつかのレガシーな機能を実装することを強制されずに、です。mysqlpumpは、論理バックアップを実行するのに必要な総所要時間を大幅に削減する為に、複数のデータベースおよび内部のオブジェクトのダンプに関連する全ての操作を並列で実行します。
バックアップ例
ここに全データベースの基本的なバックアップを取得する時に実行するであろうコマンドを示します(デフォルトではmysqlpumpは全データベースをダンプします)
mysqlpump --user=root --password > full_backup.sql
# OR
mysqlpump --all-databases --user=root --password > full_backup.sql
注: mysqlpumpはデフォルトで次の特別な内部データベースはダンプしません。すなわちPERFORMANCE_SCHEMA、SYS SCHEMA、ndbinfoです。mysqlpumpは次のシステムテーブルも明示的に--include-tablesオプションを付与しない限りダンプしません。すなわち、user、db、 tables_priv、 columns_priv、 procs_priv、 proxies_priv、 event、 proc、 apply_status、 schema、 general_log、 slow_logです。
mysqlpumpはダンプの工程をいくつかのサブタスクに分割して、これらのサブタスクをマルチスレッド化されたキューに加えます。それから、キューは並列で動作できるようNスレッド(Nはデフォルトで2)で処理されます。各スレッドは全ての必要な情報を扱うためにMySQLサーバーへのコネクションをはって動作を開始します。利用するスレッド数は--default-parallelismと--parallel-schemasオプションで設定できます。
全データベースを4スレッドでダンプする場合:
mysqlpump --user=root --password --default-parallelism=4 > full_backup.sql
ワーカーキューを2つ(1つはdb1とdb2を処理するため、もう1つはその他を処理するため)作成して、1つのキューあたり3スレッドで処理する場合(デフォルトでダンプタスクを完了させるためには、1つのキューあたり2スレッドです):
mysqlpump --user=root --password --parallel-schemas=db1,db2 --default-parallelism=3 > full_backup.sql
db1とdb2に対しては最初のキューで5スレッドで、その他のデータベースに対してはデフォルトキューで3スレッドで処理する場合:
mysqlpump --user=root --password --parallel-schemas=5:db1,db2 --default-parallelism=3 > full_backup.sql
db1とdb2に対しては最初のキューで5スレッドで、db3とdb4に対しては2番目のキューで2スレッドで、他の全てのデータベースに対してはデフォルトキューで3スレッドで動作させる場合:
mysqlpump --user=root --password --parallel-schemas=5:db1,db2 --parallel-schemas=2:db3,db4 --default-parallelism=3 > full_backup.sql
「accounts」と「inventory」データベース/スキーマだけをバックアップする場合:
mysqlpump --databases accounts inventory --user=root --password > partial_backup.sql
メタデータの情報だけを出力し、テーブルに関連する全データを出力しないようにするには、--skip-dump-rowsが利用できます:
mysqlpump --databases accounts inventory --skip-dump-rows --user=root --password > partial_backup.sql
db1およびdb2データベース/スキーマのみをダンプする例:
mysqlpump --user=root --password --include-databases=db1,db2 --result-file=db1_db2_backup.sql
名前が「db」で始まるデータベース/スキーマをダンプする例:
mysqlpump --user=root --password --include-databases=db% --result-file=all_db_backup.sql
db1およびdb2を除いた全てのデータベース/スキーマをダンプする例:
mysqlpump --user=root --password --exclude-databases=db1,db2 --result-file=partial_backup.sql
全データベース/スキーマから名前が「t」であるテーブル以外の全てのテーブルをダンプする例:
mysqlpump --user=root --password --exclude-tables=t --result-file=partial_backup.sql
全データベース/スキーマから名前が「__user」にマッチしない全てのテーブルをダンプする例(dbuser、STuser、45user、など):
mysqlpump --user=root --password --exclude-tables=__user --result-file=partial_backup.sql
全データベース( MySQLのシステムデータベース/スキーマは除く)から、「ev2」という名前のイベントと「p1」という名前のルーチンだけをダンプする例:
mysqlpump --user=root --password --include-events=ev2 --include-routines=p1 --exclude-databases=mysql --result-file=partial_backup.sql
mysql.userテーブルにあるユーザーのみをダンプする例。-usersオプションはmysql.userテーブルへのインサート文を生成するのではなく、論理的なユーザー定義をCREATE USER、GRANT文の形式でダンプします:
mysqlpump --user=root --password --exclude-databases=% --users
mysql.userテーブル内のrootユーザ以外の全ユーザーをダンプする例:(※)
mysqlpump --user=root --password --users --exclude-users=root
(※) 訳注: mysql.userのみのダンプであれば--exclude-databases=% が不足しており、原文が誤っている。@yoku0825さんありがとうございます
デフォルトで、mysqlpumpはダンプの進捗を表示する。例えば次の通りです。
mysqlpump --user=root --password > full_backup.sql
Dump progress: 0/1 tables, 6/6 rows
Dump progress: 4/6 tables, 53964/1867889 rows
Dump progress: 4/6 tables, 109464/1867889 rows
Dump progress: 4/6 tables, 173714/1867889 rows
Dump progress: 4/6 tables, 252464/1867889 rows
Dump progress: 4/6 tables, 316464/1867889 rows
Dump progress: 4/6 tables, 332964/1867889 rows
....
Dump completed in 40554 milliseconds
リストア例
データは簡単にインポートしてリストアできます。新しいMySQLのインスタンスに生成されたバックアップファイルをインポートして、MySQLのコマンドラインクライアントで簡単にデータをインポートできます。
mysql -uroot -p < partial_backup.sql
現在の制約事項
mysqlpumpは現在はできる限り並列化しようとしていて、データのバックアップを開始する前のダンプスレッドの同期点が欠けています。現在は、汎用目的のバックアップを置き換える(つまりmysqldumpを完全に置き換えるには)にはこの点で安全ではありません。これからバックアップの一貫性関連の機能やその他の様々な機能を今後のバージョンで追加する予定です。
まとめ
これまでの開発の内容の追加の詳細情報に関しては、WL#7755をご覧ください。
MySQLのユーザーから論理ダンプとバックアップを作成する為に新しいツールを試し始めた、と聞けることを楽しみにしています!このツールで問題に直面したり、あるいは新機能に関するアイデアをお持ちの場合は、ここのコメント欄でお知らせいただくか、バグレポートまたは機能リクエストをbugs.mysql.comに作成いただくか、あるいはサポートチケットを作成お願いします。
いつもの通り、MySQLを使ってくれてありがとう!