Unvollständiger mysqldump


11

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.


Gibt es genügend Speicherplatz? Und haben Sie CHECK TABLE ausgeführt, um festzustellen, dass die Tabellen keine DB-Beschädigung aufweisen?

Haben Sie versucht, den --forceParameter zu entfernen, um festzustellen, welchen Fehler Sie erhalten? Oder --quick?

@Adrian, ja, ich habe ungefähr 10 GB freien Speicherplatz, mehr als genug. Und ja, alle Tische sind in Ordnung.

@Yzmir, Ja, das gleiche Problem tritt auf.

Antworten:


5

Möglicherweise war es ein Problem, max_allowed_packetdass 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.


4

Hast du es versucht?

mysqldump --compress --add-drop-table data --routines --events  --comments --extended-insert -h {host} -u {user} -p {database} > dbdump.sql

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.


1
Ich habe den folgenden Fehler beim Versuch, diesen Befehl auszuführen:mysqldump: Got error: 1049: "Unknown database 'data'" when selecting the database
Andy

1
@ Andy du hast jetzt etwas falsch gemacht. dev.mysql.com/doc/refman/5.7/en/… . Ich denke, "Daten" sollten überhaupt nicht da sein.
Rui Marques

1

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?


Ich erhalte den gleichen Fehler.
Cerin

Ich konnte in der Dokumentation nichts finden, was diese Aussage stützen könnte. AFAIK-Lese- und Schreibvorgänge in der Tabelle werden unterstützt, wenn --single-transaction ausgeführt wird. Anweisungen zum Ändern der Tabellenstruktur (ALTER, CREATE, TRUNCATE usw.) können jedoch dazu führen, dass der Speicherauszug fehlschlägt oder unerwartete Daten liefert. ( dev.mysql.com/doc/refman/5.7/en/… )
Code Commander

1

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\Gauf 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

  • Sie können die Struktur der Tabelle mit anzeigen SHOW CREATE TABLE
  • Sie können alles über eine Tabelle in INFORMATION_SCHEMA.TABLES abfragen

0

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):

SET innodb_lock_wait_timeout = 120;

innodb_lock_wait_timeout ist ein statischer Parameter auf RDS, der nicht geändert werden kann.
Cerin

@Cerin: Laut Docs können Sie es in Ihrer Sitzung einstellen.
RolandoMySQLDBA

Was meinst du mit "meine Sitzung"? mysqldump listet keine Option zum Anpassen von Zeitüberschreitungen auf.
Cerin

Entschuldigung, ich habe es rückwärts betrachtet. Ich wollte sagen, set innodb_lock_wait_timeout in Amazon RDS.
RolandoMySQLDBA
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.