Ich versuche, mysqldump auszuführen, um einen Datenbank-Snapshot zu erstellen, und stelle fest, dass dieser zufällig auf halbem Weg angehalten wird, ohne dass ein Fehler gemeldet wird. Meine Datenbank ist relativ klein (ca. 100 MB) und verwendet InnoDB.
Ich führe es so aus:
mysqldump --force --single-transaction --quick --user myuser --password=mypass -h mydatabasehost mydb > /tmp/snapshot.sql
Überprüfen des Exit-Codes meldet 0.
Meine Version ist: mysqldump Ver 10.13 Distrib 5.1.52 für redhat-linux-gnu (i386)
Ich habe einige ähnliche Beiträge und sogar einen offiziellen Fehlerbericht gesehen , aber keine der beiden Lösungen scheint zuzutreffen.
Wie kann ich mysqldump dazu bringen, einen vollständigen Datenbank-Snapshot zu erstellen?
BEARBEITEN: Meine Datenbank befindet sich derzeit auf Amazon RDS.
--force
Parameter zu entfernen, um festzustellen, welchen Fehler Sie erhalten? Oder--quick
?Antworten:
Möglicherweise war es ein Problem,
max_allowed_packet
dass sowohl auf dem Client (dh mysqldump) als auch auf dem Server (dh Amazon RDS) nicht hoch genug eingestellt wurde . Ich habe dies auf beiden auf 500M eingestellt und das scheint das Problem behoben zu haben.Da die Informationsschema-Tabellen von InnoDB nur Schätzungen der Zeilenanzahl enthalten, ist es schwer zu sagen, ob mein Snapshot wirklich alles von RDS enthält. Alle Tabellen sind vorhanden, aber die Zeilenzahlen unterscheiden sich. Ich werde mit einer definitiveren Antwort aktualisieren, wenn ich etwas Zeit habe, eine gründlichere Analyse zu erstellen.
quelle
Hast du es versucht?
Das ist einfach so, wie ich es immer ohne Probleme mache. Wenn Sie den Dump auf diese Weise ausführen, erhalten Sie zu einem bestimmten Zeitpunkt alles, was Sie haben (Daten, Objekte und manchmal wertvolle Kommentare), und ignorieren nicht festgeschriebene Transaktionen.
quelle
mysqldump: Got error: 1049: "Unknown database 'data'" when selecting the database
Soweit ich weiß, schlägt die mysql docs --single-transaction fehl, wenn während des Dumpings ein Lesevorgang für die Tabelle ausgeführt wird. Was ist das Ergebnis, wenn es ohne "--force --single-transaction --quick" ausgeführt wird?
quelle
Es ist durchaus möglich, dass die Tabelle beschädigt ist. Ich meine nicht, dass die Daten und / oder Indexseiten beschädigt sind. Es könnte etwas sehr Einfaches geben, das kaputt ist.
Ich habe kürzlich ein Problem mit einem Sicherungsskript auf einem Slave-Server festgestellt, als ich mehrere Datenbanken parallel mysqldumped habe. Das Ausführen von mysqldump in einer der Datenbanken führte zu einem sehr kleinen mysqldump. Die DB hatte mehr als 80 Tabellen. Der mysqldump wurde jedoch an der fünften Tabelle in der Datenbank angehalten. Als ich
SHOW CREATE TABLE tblname\G
auf dem Slave auf dem Tisch lief , bekam ich den Fehler "Tabelle nicht gefunden". Als ich rannteSHOW CREATE TABLE tblname\G
auf dem Master lief, wurde die Tabellenbeschreibung wie erwartet angezeigt.Was passierte, war ein wenig verrückt: Ein Client bat um eine Wiederherstellung der Tabelle, und ein Techniker stellte die .ibd-Datei der InnoDB-Tabelle aus einer Festplattensicherung wieder her. Die Tablespace-ID der .ibd-Datei (25) stimmte nicht mit der in ibdata1 (28) registrierten Tablespace-ID überein.
Ich habe das Problem behoben, indem ich den Slave abgespritzt, den Master mysqldumped und die Replikation von Grund auf neu eingerichtet habe. Glücklicherweise betrug der Daten- und Indexspave insgesamt 7 GB. Daher war der Wiederherstellungsprozess keine große Sache.
MORAL DER GESCHICHTE
Das Grundproblem besteht darin, dass mysqldump keinen Fehler in einer InnoDB meldet, wenn die Tablespace-ID falsch ist. Wenn ein mysqldump beendet wird und nicht jede Tabelle in alphabetischer Reihenfolge speichert, bedeutet dies, dass sie durch einen Fehler beendet wurde und dies ohne Drucken einer Fehlermeldung.
Überprüfen Sie, um sicherzugehen
SHOW CREATE TABLE
quelle
Das Folgende ist nur ein Brainstorming zu mysqldump und InnoDB:
Denken Sie bitte über das Verhalten von mysqldump gegenüber einer InnoDB-Tabelle nach. Wenn sich im InnoDB-Pufferpool schmutzige Seiten befinden, die zu einer Tabelle gehören, die Sie sichern, müssen die schmutzigen Seiten dieser Tabelle auf die Festplatte gelöscht werden, bevor eine
SELECT /* SQL_NO_CACHE */
gegen sie ausgeführt werden kann.Da Sie Amazon RDS verwenden, habe ich das Gefühl, dass sich Ihre Datenbank in einer Infrastruktur mit mehreren Mandanten befindet (Sie können diese Aussage jederzeit korrigieren, wenn ich dies zu stark vereinfache). Andere Datenbanken verwenden möglicherweise einen gemeinsam genutzten InnoDB-Pufferpool, eine gemeinsam genutzte Metadatendatei (ibdata1) und einen gemeinsam genutzten Tabellenbereich (ibdata1, wenn innodb_file_per_table) deaktiviert ist).
Möglicherweise ist auch eine gewisse Redundanz der Datenbank vorhanden, die sich auf MVCC gegenüber der Datenbank auswirken kann , obwohl es sich um ein kleines Dataset handelt.
Möglicherweise möchten Sie innodb_lock_wait_timeout (Standard 50 Sekunden) in Ihrer mysqldump-Sitzung erhöhen, um festzustellen , ob dies Auswirkungen auf Amazon RDS hat (oder Amazon dieses Limit erhöhen lässt). Versuchen Sie auch, einzelne Tabellen zu sichern.
UPDATE 2011-11-14 17:58 EDT
Versuchen Sie, dies in Ihrer DB-Sitzung auszuführen (setzt es auf zwei Minuten):
quelle