Ich habe in letzter Zeit viele MySQL-Notizen gemacht, hauptsächlich weil das Oracle des Unternehmens relativ stabil ist und weniger Wartung erfordert. Letzte Woche wurde mir die Migration von Milliarden MySQL-Daten zugewiesen, also habe ich die Gelegenheit genutzt, um meine Studiennotizen aufzuzeichnen. Die Datenmigration ähnelt in ihrem Funktionsprinzip und technischen Support dem Datenexport, BI-Berichten usw. Der größte Unterschied liegt in der Menge der importierten und exportierten Daten. Im Allgemeinen übersteigt die Menge der Berichtsdaten nicht mehrere Millionen. Bei der Datenmigration von Internetunternehmen geht es jedoch oft um Dutzende oder Hunderte Millionen Daten. Importieren und Exportieren sind zwei Prozesse. Auch bei der Datenmigration sollten wir sie getrennt betrachten. Gleichzeitig werden die Import-/Exportmethoden unterteilt in: 1. MySQL verfügt über eine Import/Export-Methode 2. Verschiedene Client-Import-/Exportmethoden Fassen Sie zunächst den Export zusammen: 1. Für Daten mit weniger Feldern oder weniger Feldinhalt können Sie Tools wie Navicat verwenden, um sie über den Client zu exportieren. Hier exportiere ich drei Felder, die alle Werte innerhalb von 11 Ziffern sind. Mit Navicat werden etwa 2,5 Millionen Daten pro Minute exportiert. 2. MySQLs eigene Exportanweisung: „select into outfile“-Anweisung; SELECT ... FROM TABLE_A --Sie können eine Where-Bedingung hinzufügen INTO OUTFILE "/Pfad/zur/Datei" --Speicherort der Exportdatei FIELDS TERMINATED BY ',' OPTIONAL ENCLOSED BY '"' --Feldtrennzeichen und Einschlusszeichen LINES TERMINATED BY '\n';--Zeilenumbruchzeichen Die Felder davor sind sehr einfach und verständlich, deshalb werde ich sie hier nicht erklären. Lassen Sie uns über die Felder danach sprechen: FELDER MIT ',' ABGESCHLOSSEN bedeutet, dass die Felder durch Kommas getrennt sind, z. B.: Feld A Feld B, das Anzeigeformat beim Export ist: A, B OPTIONAL ENCLOSED BY '"' bedeutet, dass der Feldinhalt in doppelte Anführungszeichen eingeschlossen ist. Das Exportformat ist: "A","B" Zeilen, die durch '\n' abgeschlossen sind; Jede Datenzeile ist durch eine neue Zeile getrennt. Das Exportformat ist wie folgt: "A","B" "A1","B1" Natürlich können Sie die Feldunterscheidungs- und Inklusionssymbole auch selbst definieren, etwa: '# Der Vorteil der Verwendung des in MySQL integrierten Exports/Imports besteht darin, dass es extrem schnell ist. Der Nachteil besteht jedoch darin, dass Dateien nur an die lokale Adresse des Serverhosts exportiert werden können. Für Kollegen wie bi, die keine Datenbankhostberechtigungen haben, kann diese Methode ein Luxus sein. Glücklicherweise ist die Exportgeschwindigkeit von Client-Tools von Drittanbietern für Berichte mit weniger Feldern/Inhalten nicht besonders langsam; Import: Der Schlüssel ist der Datensatzimport. Der Import wird hauptsächlich von DBAs durchgeführt, um Daten zu migrieren. Die Methoden sind in Client- und MySQL-integrierte Methoden unterteilt: Ich empfehle hier dringend, MySQL-Import zu verwenden, da ich zuvor 130 Millionen Daten migrieren musste. Der Import der Daten mit dem Navicat-Client dauerte 22 Stunden, was zu zeitaufwändig und unsicher war. Tools wie Navicat bergen das Risiko eines Pseudotodes. Daher ist es nicht zu empfehlen, mehr als 10.000 Daten über Navicat zu importieren. Integrierte MySQL-Importmethode: --Die offizielle Dokumentdefinition lautet wie folgt und die Kommentare wurden basierend auf meinem eigenen Verständnis hinzugefügt: DATEN LADEN 、 [LOW_PRIORITY | CONCURRENT]--Ausführen/sofort, wenn niemand die Datenbank verwendet[LOCAL]--Mit diesem Parameter liest die Serverseite die Datei nicht auf dem Serverhost. Ohne diesen Parameter wird die Datei standardmäßig auf dem Serverhost gelesenINFILE 'file_name'--Dateiadresse und Dateiname lesen[REPLACE | IGNORE]--Bei doppelten Daten heißt es: Ersetzen/Schreiben wiederholen. Es wird empfohlen, wiederholtes Schreiben zu ignorierenINTO TABLE tbl_name--In welche Tabelle importieren[PARTITION (partition_name [, partition_name] ...)]--Diese Parameterzeile kann weggelassen werden. Es wird empfohlen, die folgenden Felder zu verwenden [CHARACTER SET charset_name]--Legt das Zeichenformat des importierten Inhalts fest. Sie können utf-8 oder GBK usw. angeben. [{FIELDS | COLUMNS} --Feldkennung [TERMINATED BY 'string'] --Welches Symbol wird verwendet, um die Systemfelder zu unterscheiden? [[OPTIONALLY] ENCLOSED BY 'char']--Welches Symbol wird verwendet, um den Anfang und das Ende des Systemfelds selbst zu unterscheiden? [ESCAPED BY 'char']--Escape-Zeichen. Wenn es sich um eine Textdatei handelt, gibt es im Textfeld Sonderzeichen wie doppelte Anführungszeichen. Sie können die Sonderzeichen der Textdatei ignorieren, indem Sie ein Escape-Zeichen definieren.] [LINES --Zeilenkennung [STARTING BY 'string'] -- Zeichenfolge, die den Anfang einer Zeile definiert. Wenn am Anfang einer Zeile keine Zeichenkennung steht, ist es normalerweise nicht notwendig, [TERMINATED BY 'string'] -- Zeichenfolgekennung am Zeilenende zu schreiben. Die Daten zwischen den Zeilen werden durch definierende Zeichen unterschieden] [IGNORE number {LINES | ROWS}]--Ignoriere die erste Anzahl von Zeilen in der Datei, die normalerweise nicht geschrieben werden-das Folgende gibt an, welche Felder in [(col_name_or_user_var) eingefügt werden sollen [, Spaltenname_oder_Benutzervariable] ...)] [SET col_name={Ausdruck | DEFAULT}, [, col_name={Ausdruck | DEFAULT}] ...] Im Originaltext heißt es, dass mit „Daten laden“ Daten sehr schnell in die Datenbank importiert werden können. Wenn Sie jedoch die Parameter „Felder“ und „Zeilen“ verwenden möchten, müssen Sie über einen Parameterwert verfügen und die „Felder“ müssen vor dem Parameter „Zeilen“ stehen. Die Aussage, die ich dieses Mal verwendet habe, ist:
Einfügen ist eine sehr einfache Anweisung. Ich werde hier keine spezifischen Beispiele geben. Was ich zeigen möchte, ist, wie man die Effizienz des Einfügens verbessern kann. Denn als ich die Anweisung zum Einfügen zum ersten Mal verwendet habe, begann die Ausführung um 12 Uhr abends und war bis 11 Uhr des nächsten Tages noch nicht abgeschlossen. Das bedeutet also nicht, dass die Verwendung von load ohne die Konfiguration anderer Dinge definitiv schnell sein wird. Das Datenformat, das ich dieses Mal eingefügt habe, ist wie folgt: Das Textformat ist wie folgt: Es gibt insgesamt 140 Millionen Datensätze, die in Form eines 4,3 GB großen Textdokuments exportiert und per FTP-Software in den Ordner „Server/Daten/Dateien“ hochgeladen wurden. Beschwerde 1:Da das Projekt erforderte, dass alle drei Felder Indizes haben mussten, habe ich beim Erstellen der Tabelle Indizes hinzugefügt, was zu einer unbegrenzt langen Wartezeit führte. Grund: Indizes beanspruchen Speicherplatz. Wenn ich zum Importieren von drei Feldern Indizes hinzufügen muss, bedeutet das, dass ich den Index einmal für jedes Feld schreiben muss, was um ein Vielfaches länger dauert, als wenn ich keine Indizes hinzufüge. Optimierungsmethode: Entfernen Sie vor dem Importieren den Tabellenindex und hinterlassen Sie eine Auto-Inkrement-ID. Fügen Sie diese dann nach Abschluss des Imports hinzu. Beschwerdepunkt 2:Motorauswahl: Die MySQL-Engine behandelt das Laden und Schreiben anders, insbesondere der Master-Slave-Sicherungsmechanismus: Für die MyISAM-Engine: Für die InnoDB-Engine: Wenn Sie also extreme Geschwindigkeit anstreben und Milliarden von Daten haben, können Sie die MyISAM-Engine wählen. Der Standard für MySQL sollte InnoDB sein. Dieses Mal habe ich die Engine jedoch nicht geändert. Ich empfehle nicht, die Standard-InnoDB-Engine zu ändern. Schließlich ist die offizielle Haupt-Engine von Oracle die umfassendste. Sofern keine besonderen Umstände vorliegen, wird die Verwendung von MyISAM nicht empfohlen. Wenn Sie MyISAM verwenden, achten Sie auf zwei Punkte: Bei Verwendung von MyISAM können Sie mehrere Sitzungswerte anpassen, um den Lesespeicher zu erweitern und die Lesedaten zu verbessern. Die Anweisungen lauten wie folgt: SETZEN SIE DIE SITZUNG BULK_INSERT_BUFFER_SIZE = 256217728; Setzen Sie die Sitzung myisam_sort_buffer_size auf 256217728. Für die MyISAM-Engine kann die eindeutige Prüfung vor dem Importieren zunächst ausgeschaltet und dann wieder eingeschaltet werden: SET UNIQUE_CHECKS=0 -- Deaktivieren SET UNIQUE_CHECKS=1 -- Aktivieren Beschwerdepunkt 3:Obwohl MySQL lokale Clients beim Lesen von Dateien unterstützt, hat es aus verschiedenen Netzwerkgründen nur geringe Auswirkungen auf Dutzende oder Hunderte von Daten. Wenn die Datenmenge jedoch Hunderte von Millionen erreicht, hat sogar 1 Millisekunde besonders große Auswirkungen. Daher wird empfohlen, FTP zum Übertragen auf den Server zum Lesen zu verwenden. Beschwerdepunkt 4:Erfahrungsaustausch: Überprüfen Sie nach dem Importieren den Serverstatus: Verwenden Sie den Befehl top, um die MySQL-CPU-Auslastung des Hosts zu überprüfen. Theoretisch wird dadurch mehr CPU belegt. Bei meinem ersten Import, der sehr lange dauerte, war die CPU zu 10 % belegt, was ein äußerst abnormaler Import war. Beim zweiten Import war die CPU zu 110 % belegt, was dem Zustand des schnellen Schreibens entsprach. Die letzten 140 Millionen Daten dauerten nur mehr als 7 Minuten, daher müssen Sie den Server nach der Ausführung der Anweisung überwachen, da die Anweisung sonst möglicherweise nicht normal ausgeführt wird. CPU-Auslastung: Hinweis: Der größte Unterschied zwischen Laden und Einfügen besteht darin, dass beim Laden die Syntax nur einmal ausgeführt wird und die Daten dann stapelweise eingefügt werden, während beim Einfügen alle Daten einmal bearbeitet werden und der Feldindex einmal durchlaufen wird. Daher ist das Einfügen selbst bei großen Datenmengen extrem langsam. Zusammenfassen:Die größte und offensichtlichste Änderung dieser Optimierung ist, dass die Importgeschwindigkeit nach dem Entfernen des Indexes extrem hoch ist. Index, ich sage es noch einmal: Beim Importieren können Sie den Index zunächst entfernen und nach Abschluss des Imports hinzufügen. Aktualisiert am 3. Juli 2020Beim Importieren großer Datenmengen in MySQL müssen Sie auf das maximale Transaktionslimit achten. Vor einigen Monaten trat bei einer Datenmigration im MySQL 8.0 MGR-Cluster ein hohes Transaktionslimit auf, wodurch die Instanz Probleme bekam und MySQL neu gestartet werden musste. Die Standardkonfiguration sollte ein Transaktionslimit von 150 Millionen aufweisen. Zu diesem Zeitpunkt waren die importierten Daten relativ groß und es wurde keine Parametererweiterung durchgeführt. Gleichzeitig wurde für den Import keine Datensegmentierung oder Flusssteuerung durchgeführt, wodurch die Datenbank blockiert und neu gestartet wurde. Aufgrund der Unternehmensanforderungen eines 7*24*365-Mechanismus wurde dies als Unfall angesehen. Wenn das Unternehmen hohe Anforderungen stellt, wird empfohlen, beim Importieren auf die MySQL-Konfiguration selbst oder auf die Limits für die Übermittlung von Importtransaktionen zu achten. Damit ist dieser Artikel über MySQL-Datenimport, -export und -migrationshinweise auf Milliardenebene abgeschlossen. Weitere relevante MySQL-Datenimport-, -export- und -migrationsinhalte auf Milliardenebene finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Beispielcode zur Implementierung eines Waben-/Sechseckatlas mit CSS
>>: In Webseiten eingebettetes Flash und Kompatibilitätsprobleme mit IE, FF und Maxthon
Spezifische Methode: Schritt 1: Stoppen Sie den M...
Code <div Klasse="Test"> <div&...
Server: Ubuntu Server 16.04 LSS Kunde: Ubuntu 16....
Inhaltsverzeichnis Vorwort VMware-Klon virtueller...
Ich habe das ganze Internet durchsucht und bin au...
Ich verfolge wochentags gerne die Nachrichten und ...
Obwohl Mac-Systeme mit PHP und Apache ausgeliefer...
Heute fiel mir plötzlich ein, die Produktionsprinz...
Inhaltsverzeichnis 1. Funktionseinführung 2. Schl...
mysql5.5.28 Installations-Tutorial zu Ihrer Infor...
Verwenden Sie HTML, um eine dynamische Web-Uhr zu...
Navigationsleiste erstellen: Technische Vorausset...
Vorwort Beim Installieren der ausführbaren Datei ...
Docker-Download-Adresse: http://get.daocloud.io/#...
Das zeitgenössische visuelle Webdesign hat drei vö...