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.
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 < Betrieb.
Die Parameteranalyse wurde fast von der ursprünglichen Analyse auf die Verwendung des argparse-Moduls umgestellt.
Wenn --tables nicht angegeben ist, fragt das Programm die Bibliothek aktiv nach allen Tabellennamen ab und filtert sie dann in die Warteschlange.
In die Zielbibliothek laden, die Optionen sind so umfangreich wie das Ausgeben. Sie können angeben, welche Datenbank importiert werden soll und welche Tabellen ignoriert werden sollen.
Der entscheidende Punkt ist die Kompatibilität mit dem ursprünglichen mysqldump, da die tabellenbezogenen Optionen (-B, -A, --tables, --ignore=) analysiert und zu einer neuen Ausführung kombiniert werden müssen Befehl gibt es viele Ausnahmen, die berücksichtigt werden müssen.
Einschränkungen
Wichtig: Die exportierten Daten garantieren keine Konsistenz auf Bibliotheksebene
Sie haben keine Auswirkungen auf historische unveränderliche Tabellen
Spezifisch für eine Die Konsistenz der Tabelle wird durch die von mysqldump selbst verwendeten Optionen bestimmt
Verschiedene Tabellenexportaktionen werden in verschiedenen mysqldump-Befehlen ausgeführt und Transaktionen können nicht garantiert werden. In meinem Fall unterstützte mich ein Entwicklungskamerad mit einem Binlog-Parsing-Programm und spielte alle Änderungen nach Abschluss noch einmal ab, um die endgültige Konsistenz sicherzustellen.
Außerdem benötigen wir beim Importieren von Daten in vielen Fällen keine vollständigen oder konsistenten Daten. Sie werden nur für die Offline-Analyse oder den temporären Export verwendet. Der Schwerpunkt liegt darauf, die Daten schnell zur Entwicklung zu bringen.
Das ungewöhnliche Optionserkennungsprogramm hat sein Bestes gegeben, um mit dem Befehl mysqldump kompatibel zu sein. Sie müssen lediglich mypumpkin.py hinzufügen und dump-dir angeben, um die Parallelitätsmagie zu vervollständigen sind unpraktisch zu analysieren und werden noch nicht unterstützt. Format:
db1 table1 table2 db2 db3
Das heißt, die obigen Angaben können nicht bestimmen, ob db1 und table1 Bibliotheksnamen oder Oberflächen in der Befehlszeile sind. Denken Sie bei der Verwendung daran: „[ -A|-B], [--tables], [--ignore-table]“ drei Gruppen, von denen eine erscheinen muss: db1 Tabelle1 Tabelle2 wird in db1 --tables Tabelle1 Tabelle2 geändert, und db2 wird in -B geändert db2 db3.
Das Passwort kann vorerst nur explizit eingegeben werden
4. Gebrauchsanweisung
Die Installation basiert auf Python 2.7, andere Versionen wurden nicht getestet. Erfordert die MySQLdb-Bibliothek.
4.1 Hilfe
./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, erforderlich, die ursprüngliche Shell-Standardeingabe und -ausgabe > 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