2012-03-28 8 views
9

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.mysqldump ohne Unterbrechung der Live-Produktion INSERT

Ich habe diese Seite durchgesehen und sehe, ob mysqldump Online-Backup unsere Produktion Website herunterbringen wird. Von diesem Beitrag: Run MySQLDump without Locking Tables, sagt es offensichtlich mysqldump wird die db sperren und einfügen verhindern. Aber nach ein paar Tests bin ich gespannt, ob es anders aussieht.

Wenn ich

mysqldump -u root -ppassword --flush-logs testDB > /tmp/backup.sql 

mysqldump wird schließlich standardmäßig tun, um eine '--lock-Tabellen', und das ist ein READ LOCAL Schlösser (refer to mysql 5.1 doc), wobei die gleichzeitige Einsatz nach wie vor zur Verfügung. 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. Was bedeutet, mysqldump wird den Produktionsserver nicht unterbrechen und INSERT kann immer noch auf gehen.

Gibt es jemanden mit anderen Erfahrungen? Ich möchte dies vorher auf meinem Produktionsserver durchführen lassen, 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]

+0

Sie sollten den Zugriff auf den neuen Server ** FIRST ** erhalten und wahrscheinlich die mysql-Replikation suchen, um die Migration zu lösen. ** ERINNERN SIE SICH: ** Sie können dump und auf neuen Server installieren, ** ABER ** nach dem Dump der Daten, gibt es ** MEHR ** neu schreiben, wie Sie die neue Schreib auf den neuen Server synchronisieren ? – ajreal

+0

Für die nachfolgende neue Daten schreiben, werden wir es mit mysqlbinlog lösen, das sollte gut gepflegt werden. Jetzt ist mein Hauptanliegen die erste Sicherung mit mysqldump. Ich möchte nur sicherstellen, ob mysqldump INSERT verhindert oder nicht. Von meinem Test hat es nicht gezeigt, dass es wird. Ich möchte nur sicherstellen, wie andere Erfahrung ist. – sylye

Antwort

0

mysqldump nicht --lock-Tabellen standardmäßig hinzu. Versuchen Sie zu verwenden --lock-Tabellen Lassen Sie mich wissen, wenn es geholfen

BTW - Sie sollten auch add-locks verwenden, die Ihren Import schneller machen wird!

+1

hi, ich habe es erneut getestet und es wird bestätigt, dass mysqldump standardmäßig --lock-tables ausgibt. Zwei Punkte, um das zu beweisen. Zuerst wird 'mysqldump --help | grep lock' zeigt 'lock-tables' ist TRUE. mysql> zeigen offene Tabellen; ' während mysqldump passiert, die 'In_use' Spalte zeigt 1, und eine andere mysql INSERT macht es nicht zu 2, so dass es eine LOCK READ LOCAL anzeigen. Also meine Frage ist, gibt es noch jemand anderen ihre mysqldump sperren die Tabelle und verhindern, INSERT? weil meine nicht. – sylye

1

Ich habe es noch nie zuvor getan, aber Sie könnten versuchen --skip-add-locks beim Dumping.

Obwohl es länger dauern könnte, könnten Sie mehrere Patches erstellen, von denen jeder sehr wenig Zeit in Anspruch nehmen würde. Durch Hinzufügen von --skip--add-drop-table können Sie diese mehreren kleineren Sicherungen in dieselbe Tabelle hochladen, ohne sie neu erstellen zu müssen. Mit --extended-insert würde die SQL-Datei kleiner zu booten.

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 und laden Sie zuerst, um dump es auf diese Art und Weise zu tun, oder entfernen Sie die --skip-Add-Drop-Tabelle für die erste Dump

+0

Hallo, danke für den Hinweis. Aber im Moment geht es mir nicht darum, die mysqldump-Zeit zu reduzieren, da die Daten zu viel sind. Meine Absicht wird es sein, herauszufinden, ob mysqldump INSERT verhindert oder nicht, während es läuft. Suche nach jemandem, der das schon mal gemacht hat. – sylye

1

1) Verwendung von --opt ist die gleiche unter 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 ausgeben, oder es kann den gesamten Inhalt aus einer Tabelle abrufen und im Speicher zwischenspeichern, bevor es gedumpt wird. Pufferung im Speicher kann ein Problem sein, wenn Sie große Tabellen ablegen. Verwenden Sie die Option --quick (oder --opt, die --quick aktiviert), um Tabellen Zeile für Zeile auszugeben. Die Option --opt (und damit --quick) ist standardmäßig aktiviert. Verwenden Sie daher zum Aktivieren der Speicherpufferung --skip-quick.

3)--single-transaction Diese Option gibt eine BEGIN SQL Anweisung vor von dem Server (Transaktionstabellen Dumping Daten InnoDB).

Wenn Ihr Schema eine Kombination aus InnoDB und MyISAM, wird folgendes Beispiel Ihnen helfen:

mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=512M db > db.sql 
2

Jetzt Sie eine Datenbank mit disjunct Tabellen aufweisen können, oder einen Data Warehouse - wo alles nicht ist normalisiert (überhaupt), und wo gibt es keine Links was auch immer zwischen den Tabellen. In diesem Fall würde jeder Dump funktionieren.

Ich ÜBERNEHMEN, dass eine Produktion Datenbank mit 38G Daten enthält Grafiken in irgendeiner Form (BLOBs), und dann - unberechtigterweise - Sie haben Links von anderen Tabellen. Recht?

Daher sind Sie - soweit ich es beurteilen kann - in Gefahr, ernsthafte Verknüpfungen zwischen Tabellen zu verlieren (normalerweise primäre/fremde Schlüsselpaare), so dass Sie eine Tabelle zum Zeitpunkt der Aktualisierung/Einfügung erfassen können , 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 es sehr umständlich, die Integrität wiederherzustellen, meistens weil das System, das das Datenbanksystem verwendet/generiert/verwaltet, nicht als transaktionsorientiertes System erstellt wurde. Beziehungen in der Datenbank können daher nicht sein verfolgt außer über die Primär-/Fremdschlüsselbeziehungen.

So können Sie sicher mit dem Kopieren Ihres Tisches ohne Schlösser und viele der anderen oben genannten Vorschläge durchkommen - aber Sie sind in Gefahr, die Finger zu verbrennen, und je nachdem, wie empfindlich die Operationen des Systems - Sie sind kann sich stark verbrennen oder nur einen Oberflächenkratzer bekommen.

Beispiel: Wenn Ihre Datenbank ein kritisches Missionsdatenbanksystem mit der empfohlenen Herzschlagfrequenz für lebenserhaltende Geräte auf einer Intensivstation ist, würde ich mehr als zweimal überlegen, bevor ich die Migration mache.

Wenn jedoch die Datenbank Bilder von Facebook oder einer ähnlichen Seite enthält = können Sie mit den Folgen von allem von 0 bis zu 129.388 verlorenen Links leben :-).

Jetzt - so viel zur Analyse. Lösung:

SIE MÜSSEN eine Software verursachen, die den Speicherabzug für Sie mit der vollen Vollständigkeit durchführt, Tabelle-gesetzt durch Tabelle-Satz, Tupel durch Tuple. Sie müssen diesen Datencluster identifizieren, der von Ihrer aktuellen Online-Basis 24/7/365 auf Ihre neue Basis kopiert werden kann, dann tun Sie das und markieren dann, dass es kopiert wurde.

IFFF-Änderungen werden jetzt an den Datensätzen vorgenommen, die Sie bereits kopiert haben. Sie müssen die folgenden Kopien dieser Datensätze erstellen. Es kann eine knifflige Angelegenheit sein, dies zu tun.

IFFF Sie eine erweiterte Version von MYSQL ausführen - 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, die 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 auf eine Kardinalfrage:

Sie müssen von Zeit zu Zeit Wartung Ihrer Maschinen zu tun. 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 "Wann" - nicht "Wenn".

+0

Wie bedeutet eine Datenbankgröße von 38 GB Grafik- oder BLOB-Inhalt? – MattBianco

Verwandte Themen