Heim >Datenbank >MySQL-Tutorial >Lassen Sie mysqldump zur Magie des gleichzeitigen Exports und Imports werden
Erstens ist die Exportgeschwindigkeit von mysqldump nicht langsam, es kann eine Geschwindigkeit von 50 M/s erreichen und 3 Minuten dauern. Es ist ersichtlich, dass der Engpass im Netzwerk und in der Festplatten-E/A liegt. Egal wie viel das Export-Tool ist, es kann nicht schneller sein, aber der Import dauerte 60 Minuten und die Festplatte und das Netzwerk wurden nur zu etwa 20 % genutzt. Der Engpass war die Schreibgeschwindigkeit der Zielbibliothek (allgemeines sequentielles Schreiben). kann das IOPS-Limit nicht erreichen), also wurde mypumpkin geboren – unter Berücksichtigung der Myloader-Importgeschwindigkeit und der Mysqldump-Exportflexibilität.
95712e0b0bc62c64b1fddfac486f9cb8
Verwenden Sie Python, um eine Warteschlange zu erstellen, alle Tabellen, die exportiert werden müssen, auf einmal in die Warteschlange zu stellen und N Python-Threads zu starten Gleichzeitig wird jeweils der Tabellenname aus dieser Warteschlange abgerufen, und der Unterprozess ruft den Befehl mysqldump des Betriebssystems auf, um die Daten in eine Datei mit dem Namen dbname.tablename.sql zu exportieren. Das Einladen ähnelt dem Ausgeben von Dateien. Entsprechend dem angegebenen Bibliotheksnamen oder Tabellennamen werden alle SQL-Dateien aus dem Verzeichnis dump_dir gefunden und in die Warteschlange verschoben. N Threads rufen gleichzeitig MySQL auf, um neue Befehle zu erstellen und den 12c6ff306ddbeb0b1f26383ddfdd0892 darf nicht verwendet werden. Wenn das durch dump-dir angegebene Verzeichnis nicht existiert, wird versucht, es automatisch zu erstellen.
--threads=N, N gibt die Anzahl gleichzeitiger Export- oder Import-Threads an. Die Standardanzahl der Threads für den Dump-Out beträgt 2, und die Standardanzahl der Threads für das Laden von MyPumpkin beträgt die Anzahl der CPUs * 2.
Hinweis: Je größer die Anzahl der Threads, desto besser. Die wichtigsten Messindikatoren sind hier die Netzwerkbandbreite, die Festplatten-IO und die IOPS der Zielbibliothek.
-B, --tables, --ignore-table, verwenden Sie dasselbe wie mysqldump, zum Beispiel:
In mysqldump überschreibt --tables die Option --databases/-B
In mysqldump können --tables und --ignore-table nicht gleichzeitig erscheinen.
Wenn in mysqldump -B nicht angegeben ist, müssen --tables oder --ignore-table vorhanden sein follow db Nach dem Namen
weitere Optionen, mypumpkin behält sie intakt und legt sie zur Ausführung in die Shell. Wenn bei anderen Optionen Fehler auftreten, wird die Prüfung daher dem nativen mysqldump überlassen. Tritt während der Ausführung ein Fehler auf, wird der Thread beendet.
4.2-Beispiel
Export:
## 导出源库所有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
Import:
-A, -B, --tables, --ignore-table, --threads, Die Verwendung und Funktion von --dump-dir sind genau die gleichen wie oben. Hier einige Beispiele:
## 导入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