Heim > Datenbank > MySQL-Tutorial > Hauptteil

Lassen Sie mysqldump zur Magie des gleichzeitigen Exports und Imports werden

高洛峰
Freigeben: 2016-11-21 15:18:58
Original
1585 Leute haben es durchsucht

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
Nach dem Login kopieren

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&#39;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]
Nach dem Login kopieren

--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
Nach dem Login kopieren

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
Nach dem Login kopieren


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage