Ich bin dabei, unsere Produktionsdatenbank auf einen anderen Server zu migrieren. Es ist etwa 38 GB groß und verwendet MYISAM-Tabellen. Da ich keinen physischen Zugriff auf das neue Server-Dateisystem habe, können wir nur mysqldump verwenden.
Ich habe diese Seite durchgesehen und sehe, ob mysqldump Online-Backup unsere Produktionswebsite zum Einsturz bringt. Von diesem Beitrag: Run MySQLDump ohne Sperren Tabellen , es sagt offensichtlich mysqldump wird die Datenbank sperren und verhindern, einfügen. Aber nach ein paar Tests bin ich gespannt, ob es anders aussieht.
Wenn ich
verwende %Vor%mysqldump wird schließlich standardmäßig ' - lock-tables ' ausführen, und dies ist eine READ LOCAL Sperren ( beziehen Sie sich auf mysql 5.1 doc ), wo das gleichzeitige Einfügen noch verfügbar ist. Ich habe eine for-Schleife gemacht, um jede Sekunde in eine der Tabellen einzufügen, während mysqldump eine Minute braucht, um sie abzuschließen. Jede Sekunde wird während dieser Zeit ein Datensatz eingefügt. Das bedeutet, dass mysqldump den Produktionsserver nicht unterbricht und INSERT weiterhin aktiviert werden kann .
Gibt es jemanden mit anderen Erfahrungen? Ich möchte dies vorher auf meinem Produktionsserver durchführen, daher wäre ich froh zu wissen, ob ich etwas falsch gemacht habe, das meinen Test falsch macht.
[Meine Version von mysql-server ist 5.1.52 und mysqldump ist 10.13]
Nun haben Sie vielleicht eine Datenbank mit disjunkten Tabellen oder einem Data Warehouse - wo alles (überhaupt) nicht normalisiert ist und wo zwischen den Tabellen keine Links vorhanden sind. In diesem Fall würde jeder Dump funktionieren.
Ich ÜBERNEHMEN, dass eine Produktionsdatenbank, die 38G-Daten enthält, Grafiken in irgendeiner Form (BLOBs) enthält, und dann - unberechtigterweise - Sie haben Links von anderen Tabellen. Richtig?
Daher sind Sie - soweit ich es beurteilen kann - in Gefahr, ernsthafte Verknüpfungen zwischen Tabellen zu verlieren (normalerweise primäre / fremde Schlüsselpaare). Daher können Sie eine Tabelle zum Zeitpunkt der Aktualisierung / Einfügung in während seine abhängige Tabelle (die diese Tabelle als primäre Quelle verwendet) noch nicht aktualisiert wurde. Dadurch verlieren Sie die Integrität Ihrer Datenbank.
In den meisten Fällen ist die Wiederherstellung der Integrität äußerst umständlich, meistens weil das System, das das Datenbanksystem verwendet / erzeugt / verwaltet, nicht als transaktionsorientiertes System erstellt wurde, so dass Beziehungen in der Datenbank nicht verfolgt werden können außer über die Primär- / Fremdschlüsselbeziehungen.
Sie können also sicher sein, dass Sie Ihren Tisch ohne Schlösser und viele andere Vorschläge kopieren - aber Sie laufen Gefahr, sich die Finger zu verbrennen, und je nachdem, wie empfindlich die Vorgänge im System sind, können Sie das tun Verbrenne dich stark oder erhalte nur einen Oberflächenkratzer.
Beispiel: Wenn Ihre Datenbank ein kritisches Missionsdatenbanksystem ist, das die empfohlene Herzschlagrate für lebenserhaltende Geräte auf einer Intensivstation enthält, würde ich mehr als zweimal überlegen, bevor ich die Migration mache.
Wenn jedoch die Datenbank Bilder von Facebook oder ähnlichen Seiten enthält = können Sie möglicherweise mit den Folgen von 0 bis 129.388 verlorenen Links leben: -).
Jetzt - so viel zur Analyse. Lösung:
SIE MÜSSEN eine Software erstellen, die den Dump für Sie mit vollständiger Integrität ausführt, Tabellensatz für Tabellensatz, Tupel für Tupel. Sie müssen diesen Datencluster identifizieren, der von Ihrer aktuellen Online-24/7/365-Basis in Ihre neue Basis kopiert werden kann, dann tun Sie das und markieren dann, dass es kopiert wurde.
Wenn jetzt IFFF-Änderungen an den Datensätzen vorgenommen werden, die Sie bereits kopiert haben, müssen Sie eine nachfolgende Kopie dieser Datensätze erstellen. Es kann eine knifflige Angelegenheit sein, dies zu tun.
IFFF Sie führen eine erweiterte Version von MYSQL aus - Sie können tatsächlich eine andere Site und / oder ein Replikat oder eine verteilte Datenbank erstellen - und dann damit durchkommen.
IFFF haben Sie ein Fenster von sagen wir 10 Minuten, die Sie erstellen können, wenn Sie es brauchen, dann können Sie auch nur die physischen Dateien kopieren, die sich auf dem Laufwerk befinden. Ich spreche über die .stm .std - und so weiter - Dateien - dann können Sie den Server für ein paar Minuten schließen, dann kopieren.
Nun zu einer grundsätzlichen Frage:
Sie müssen Ihre Maschinen von Zeit zu Zeit warten. Hat Ihr System keinen Platz für diese Art von Operationen? Wenn nicht - was machst du dann, wenn die Festplatte abstürzt. Achten Sie auf das "wenn" - nicht "wenn".
Ich habe es noch nie gemacht, aber Sie könnten --skip-add-locks
beim Dumping ausprobieren.
Obwohl es länger dauern könnte, könnten Sie mehrere Patches bereitstellen, von denen jeder nur sehr wenig Zeit benötigt. Wenn Sie --skip--add-drop-table
hinzufügen, können Sie diese mehreren kleineren Speicherauszüge in dieselbe Tabelle hochladen, ohne sie neu erstellen zu müssen. Die Verwendung von --extended-insert
würde die sql-Datei zum Booten kleiner machen.
Möglicherweise versuchen Sie etwas wie mysqldump -u -p${password} --skip-add-drop-table --extended-insert --where='id between 0 and 20000' test_db test_table > test.sql
. Sie müssten die Tabellenstrukturen ausgeben und sie zuerst hochladen, um dies zu tun, oder die --skip-add-drop-table für den ersten Speicherauszug entfernen
1) Die Verwendung von --opt
entspricht der Angabe von --add-drop-table
, --add-locks
, --create-options
, --disable-keys
, --extended-insert
, --lock-tables
, --quick
, und --set-charset
. Alle Optionen, für die --opt
steht, sind ebenfalls standardmäßig aktiviert, da --opt
standardmäßig aktiviert ist.
2) mysqldump kann Tabelleninhalte zeilenweise abrufen und dumpen oder den gesamten Inhalt aus einer Tabelle abrufen und im Speicher zwischenspeichern, bevor er gedownloadet wird. Pufferung im Speicher kann ein Problem sein, wenn Sie große Tabellen ablegen. Um Tabellen Zeile für Zeile auszugeben, verwenden Sie die Option --quick
(oder --opt
, die --quick
aktiviert). Die Option --opt
(und damit --quick
) ist standardmäßig aktiviert. Verwenden Sie daher --skip-quick
, um die Speicherpufferung zu aktivieren.
3) --single-transaction
Diese Option gibt eine BEGIN SQL
-Anweisung aus, bevor Daten vom Server ausgegeben werden (Transaktionstabellen InnoDB
).
Wenn Ihr Schema eine Kombination von InnoDB
und MyISAM
ist, wird Ihnen folgendes Beispiel helfen:
mysqldump fügt standardmäßig keine --lock-Tabellen hinzu. Versuchen Sie, --lock-Tabellen zu verwenden Lass es mich wissen, wenn es geholfen hat
BTW - Sie sollten auch add-locks verwenden, die Ihren Import schneller machen!