Yakstは、海外の役立つブログ記事などを人力で翻訳して公開するプロジェクトです。
約9年前投稿 修正あり

mysqlpumpの紹介(MySQL Server Blogより)

MySQL 5.7.8で新しい論理バックアップのクライアントユーティリティーがリリースされた。バックアップが並列化され大幅に高速化されている。本記事ではmysqldumpの利用方法や制約事項についてご紹介する。

原文
Introducing mysqlpump | MySQL Server Blog (English)
翻訳依頼者
D98ee74ffe0fafbdc83b23907dda3665 B5aa4f809000b9147289650532e83932
翻訳者
B5aa4f809000b9147289650532e83932 taka-h
翻訳レビュアー
D98ee74ffe0fafbdc83b23907dda3665 doublemarket 0deae06ab5d86b39feeec2e23a30b88a yoku0825
原著者への翻訳報告
未報告


免責事項

この記事は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を使ってくれてありがとう

次の記事
Redis作者自身によるRedisとMemcachedの比較
前の記事
Telegraf 0.1.9のリリース、クラスタリングおよびOpenTSDBとAMQPのサポート(InfluxDB Blogより)

Feed small 記事フィード

新着記事Twitterアカウント