まず、mysqldump のエクスポート速度は遅くはありません。テスト後、10G データの場合は 3 分かかります。ボトルネックはネットワークとディスク IO にあることがわかります。いくらエクスポートツールを使ってもそれほど高速ではありませんが、インポートに60分かかり、ディスクとネットワークの使用率が20%程度しかなかったのがネックでした(一般的なシーケンシャル書き込みには達しません)。 IOPS 制限)、myloader のインポート速度と mysqldump エクスポートの柔軟性を考慮して、mypumpkin が誕生しました。
95712e0b0bc62c64b1fddfac486f9cb8
Python を使用してキューを構築し、エクスポートする必要があるすべてのテーブルを一度にキューに入れ、N 個の Python スレッドを同時に開始し、それぞれがテーブルを取り出しますこのキューからの名前とサブプロセス オペレーティング システムの mysqldump コマンドを呼び出して、データを dbname.tablename.sql という名前のファイルにエクスポートします。ロードインはダンプアウトと似ています。指定されたライブラリ名またはテーブル名に従って、すべての SQL ファイルが dump_dir ディレクトリから検索され、N 個のスレッドが同時に mysql を呼び出して新しいコマンドを構築し、< をシミュレートします。 ; 手術。
パラメータ解析は、私自身による元の解析から argparse モジュールを使用するようにほぼリファクタリングされました。
--tables が指定されていない場合、プログラムはすべてのテーブル名についてライブラリにアクティブにクエリを実行し、それらをフィルタリングしてキューに入れます。
ターゲットライブラリにロードします。オプションはダンプアウトと同じくらい豊富で、どのデータベース、どのテーブルをインポートするか、どのテーブルを無視するかを指定できます。
重要な点は、元の mysqldump との互換性があることです。テーブル関連のオプション (-B、-A、--tables、--ignore=) を分析して新しい実行コマンドに組み合わせる必要があるため、次のことを考慮してください。多くの例外があります。
制限事項
重要: エクスポートされたデータはライブラリレベルの一貫性を保証しません
履歴的に変更されていないテーブルには影響しません
テーブルが一貫性を保証できるかどうかは、mysqldump 自体が使用するオプションによって決まります
さまざまなテーブル エクスポート アクションが異なる mysqldump コマンドで実行されるため、トランザクションは保証されません。私のケースのシナリオでは、開発クラスメートが binlog 解析プログラムを使用して支援し、完了後にすべての変更をリプレイして最終的な一貫性を確保しました。
さらに、データをインポートする場合、多くの場合、完全または一貫したデータは必要ありません。焦点は、データを迅速に開発に提供することです。
この珍しいオプション識別プログラムは、mysqldump コマンドとの互換性を保つために最善を尽くしています。mypumpkin.py を追加して dump-dir を指定するだけで、同時実行の魔法が完了します。ただし、場合によっては、パラメーターの解析が不便です。 、形式はまだサポートされていません:
db1 table1 table2 db2 db3
つまり、コマンド ラインで db1 と table1 がライブラリ名であるかサーフェスであるかを判断するために上記を使用することはできません。これらを使用する場合、覚えておく必要があるのは 3 つのグループ "[ だけです。 -A|-B], [--tables], [--ignore-table]" の場合は、次の 1 つを指定する必要があります: db1 table1 table2 は db1 --tables table1 table2 に変更され、db2 は -B db2 db3 に変更されます。
当面の間、パスワードは明示的にのみ入力できます
4. 使用手順
インストールは Python 2.7 に基づいて開発されており、他のバージョンはテストされていません。 MySQLdbライブラリが必要です。
4.1 help
./mypumpkin.py --help Only mysqldump or mysql allowed after mypumpkin.py usage: mypumpkin.py {mysqldump|mysqls} [--help] This's a program that wrap mysqldump/mysql to make them dump-out/load-in concurrently. Attention: it can not keep consistent for whole database(s). optional arguments: --help show this help message and exit -B db1 [db1 ...], --databases db1 [db1 ...] Dump one or more databases -A, --all-databases Dump all databases --tables t1 [t1 ...] Specifiy tables to dump. Override --databases (-B) --ignore-table db1.table1 [db1.table1 ...] Do not dump the specified table. (format like --ignore-table=dbname.tablename). Use the directive multiple times for more than one table to ignore. --threads =N Threads to dump out [2], or load in [CPUs*2]. --dump-dir DUMP_DIR Required. Directory to dump out (create if not exist), Or Where to load in sqlfile At least one of these 3 group options given: [-A,-B] [--tables] [--ignore-table]
--dump-dir、必須。元のシェルの標準入出力 > は使用できません。 dump-dir で指定したディレクトリが存在しない場合は、自動的に作成されます。
--threads=N、N は、同時エクスポートまたはインポート スレッドの数を指定します。ダンプ出力のデフォルトのスレッド数は 2 で、mypumpkin ロードインのデフォルトのスレッド数は CPU の数 * 2 です。
注: ここでの主な測定指標は、ネットワーク帯域幅、ディスク IO、およびターゲット ライブラリ IOPS です。これを観察するには、dstat を使用するのが最適です。
-B、--tables、--ignore-table は、次のように mysqldump と同じものを使用します。
mysqldump では、--tables は --databases/-B オプションをオーバーライドします
mysqldump では、--tablesと --ignore-table を同時に指定することはできません
mysqldump では、-B が指定されていない場合は、DB 名の後に --tables または --ignore-table を指定する必要があります
その他のオプションでは、mypumpkin はそのまま残ります。シェル内で実行します。したがって、他のオプションにエラーがある場合、チェックはネイティブの mysqldump に委ねられ、実行中にエラーが発生すると、スレッドは終了します。
4.2 の例
エクスポート:
## 导出源库所有db到visit_dumpdir2目录 (不包括information_schema和performance_schema) $ ./mypumpkin.py mysqldump -h dbhost_name -utest_user -pyourpassword -P3306 \ --single-transaction --opt -A --dump-dir visit_dumpdir2 ## 导出源库db1,db2,会从原库查询所有表名来过滤 $ ./mypumpkin.py mysqldump -h dbhost_name -utest_user -pyourpassword -P3306 \ --single-transaction --opt -B db1 db2 --dump-dir visit_dumpdir2 ## 只导出db1库的t1,t2表,如果指定表不存在则有提示 $ ./mypumpkin.py mysqldump -h dbhost_name -utest_user -pyourpassword -P3306 \ --single-transaction --opt -B db1 --tables t1 t2 --dump-dir visit_dumpdir2 ## 导出db1,db2库,但忽略 db1.t1, db2.t2, db2.t3表 ## mysqldump只支持--ignore-table=db1.t1这种,使用多个重复指令来指定多表。这里做了兼容扩展 $ ./mypumpkin.py mysqldump -h dbhost_name -utest_user -pyourpassword --single-transaction \ --opt -B db1 db2 --ignore-table=db1.t1 --ignore-table db2.t2 db2.t3 --dump-dir visit_dumpdir2 (如果-A表示全部db) ## 不带 -A/-B $ ./mypumpkin.py mysqldump -h dbhost_name -utest_user -pyourpassword -P3306 \ --single-transaction --opt db1 --ignore-table=db1.t1 --dump-dir=visit_dumpdir2 ## 其它选项不做处理 $ ./mypumpkin.py mysqldump -h dbhost_name -utest_user -pyourpassword -P3306 \ --single-transaction --set-gtid-purged=OFF --no-set-names --skip-add-locks -e -q -t -n --skip-triggers \ --max-allowed-packet=134217728 --net-buffer-length=1638400 --default-character-set=latin1 \ --insert-ignore --hex-blob --no-autocommit \ db1 --tables t1 --dump-dir visit_dumpdir2
インポート:
-A、-B、--tables、--ignore-table、--threads、--dump-dir の使用法と機能は上記とまったく同じです。ここにあります。いくつかの例を示します:
## 导入dump-dir目录下所有表 $ ./mypumpkin.py mysql -h dbhost_name -utest_user -pyourpassword --port 3307 -A \ --dump-dir=visit_dumpdir2 ## 导入db1库(所有表) $ ./mypumpkin.py mysql -h dbhost_name -utest_user -pyourpassword --port 3307 -B db1 \ --dump-dir=visit_dumpdir2 ## 只导入db.t1表 $ ./mypumpkin.py mysql -h dbhost_name -utest_user -pyourpassword --port 3307 \ --default-character-set=utf8mb4 --max-allowed-packet=134217728 --net-buffer-length=1638400 \ -B db1 --tables t1 --dump-dir=visit_dumpdir2 ## 导入db1,db2库,但忽略db1.t1表(会到dump-dir目录检查db1,db2有无对应的表存在,不在目标库检查) $ ./mypumpkin.py mysql -h dbhost_name -utest_user -pyourpassword --port 3307 \ -B db1 db2 --ignore-table=db1.t1 --dump-dir=visit_dumpdir2