Wie genau aktualisiert die InnoDB-Engine in MySQL ihre Hauptdatenspeicherdateien?

274
mike rodent

Beim Testen des Linux-Hilfsprogramms Back In Time Backup ist mir aufgefallen, dass ich nicht verstehen kann, wie MariaDB tatsächlich Daten speichert.

Nachdem ich einen falschen Datensatz zu einem Tisch hinzugefügt und ihn bis zum nächsten Snapshot belassen hatte, stellte ich erstaunt fest, dass die Wiederherstellung des älteren Snapshots (vor dem hinzugefügten falschen Datensatz) nicht dazu führte, dass der falsche Datensatz entfernt wurde.

Ich habe dies zwei weitere Male ausprobiert: Falscher neuer Datensatz hinzugefügt, Schnappschuss erfolgt (automatisch, weil dies das ist, was ich Back In Time gesagt habe) ... und Restore tut nicht das, was ich erwartet hatte.

Wenn ich mir die eigentlichen "Modified by" -Dateien ansehe, sehe ich im Hauptverzeichnis (wo alle Datenbanken Unterverzeichnisse sind), dass nur zwei Dateien sich scheinbar geändert haben: ib_logfile0und ib_logfile1. Bei der Konfiguration meines Back In Time-Jobs habe ich diese bewusst aus der Konfiguration übersehen, da ich davon ausging, dass es sich nur um Protokolle handelte. Ganz sicher nicht.

Zur Lösung meines unmittelbaren Problems scheint es, als müsste ich nur diese beiden Dateien in meine Momentaufnahmen aufnehmen. Aber wie oder durch welchen Prozess werden ibdata1die neuen Informationen aktualisiert? Ist es vielleicht, wenn der MySQL-Dienst heruntergefahren ist? Oder gestartet?

Seltsam ist, dass ich da draußen scheinbar nicht viele Informationen finde.

0
Bei diesem Problem geht es weniger um MySQL als um die von der InnoDB-Speicher-Engine verwendeten Methoden. Nach meinem besten Wissen müssen Sie nicht einmal die Dateien `ibdata1`,` ib_logfile0` und `ib_logfile1` kopieren. Beenden Sie einfach MySQL, löschen Sie diese Dateien und MySQL wird sie beim Neustart neu erstellen. JakeGould vor 5 Jahren 0
Danke ... das ist ein hilfreicher Hinweis. InnoDB-spezifisch, OK. Herunterfahren und löschen, OK. Für ein kontinuierliches Snapshot-Verfahren während der Arbeit an einer Datenbank muss man natürlich Snapshots der unterschiedlichen Versionen "ib_logfile0 / 1" aufbewahren ... Sie scheinen zu implizieren, dass MySQL "ibdata1" tatsächlich aktualisiert, wenn es heruntergefahren wird ... aber Was passiert im Fall einer brutalen Abschaltung einer Maschine? Natürlich kann ich selbst Experimente machen, um Antworten zu finden ... mike rodent vor 5 Jahren 0
Korrektur: `ibdata1` wird benötigt. `ib_logfile0` und` ib_logfile1` sind nicht. JakeGould vor 5 Jahren 0
Mike - Ich werde Ihnen sagen, welche Konfiguration ich bei MySQL InnoDB Engine vorziehen möchte, die [Tabellen-Tabellenbereiche für Tabellen pro Tabelle] (https://dev.mysql.com/doc/refman/5.7/de/innodb-file-per-table) -intro.html) .... Viel mehr Flexibilität, sobald Sie damit beginnen. Dies ist buchstäblich eine Datei pro Tabellenkonfiguration .... Verrückt !!! Pimp Juice IT vor 5 Jahren 0

1 Antwort auf die Frage

0
danblack

Sie können ein generisches Sicherungsprogramm wie "Back in Time" nicht verwenden, um Datenbanken zu sichern.

Wie Sie festgestellt haben, benötigen Sie eine konsistente Momentaufnahme der Datenbankdateien, um eine funktionsfähige Sicherung zu erhalten. Ohne sie landest du mit etwas, das nicht korrekt ist oder einfach nicht startet. Das Problem ist, dass ib_logfile*temporär gespeichert wird und dann in die Tablespaces migriert wird. Sie können diese nur löschen, wenn Sie das System ordnungsgemäß herunterfahren (was mehr als ein systemctl stoppt mysqld). Dies ist offensichtlich nicht der Fall, als Sie die Sicherung durchgeführt haben.

Kurzum, für MySQL verwenden Sie ein Backup-Programm, das MySQL kennt (mysqldump, mydumper, xtrabackup), ein konsistentes Snapshot-Tool (llvm-Snapshots oder eine auf einem Dateisystem basierende konsistente Snapshot-Funktion) oder einen Replikationsslave einer der vorherigen Methoden.

Ein Spiel mit MySQL-Datendateien von außerhalb von MySQL führt nur zu Datenverlust. Tu es nicht.

Danke ... wie ich anfange zu verstehen: eine ganze Dose Würmer. Was passiert, wenn eine Maschine mit MySQL-Datenbanken beispielsweise brutal ausgeschaltet wird, z. B. nichts mit willkürlichen Benutzeraktionen zu tun hat? Ich bin sicher, dass es da draußen Antworten gibt, und ich muss versuchen (erneut) zu suchen. Ich werde auf jeden Fall versuchen, nach diesen "konsistenten Schnappschuss-Tools" zu suchen. Sie haben vermutlich keine nützlichen Links? Oder Hinweise zu den von Ihnen persönlich verwendeten Protokollen? mike rodent vor 5 Jahren 0
MySQL übernimmt wie andere Datenbanken die ACID-Prinzipien. Brutale Macht ist eine Art Momentaufnahme. Es wurde genügend Status angegeben, sodass jede Transaktion, die als erfolgreich an den Benutzer zurückgegeben wurde, in den Protokolldateien von innodb vorhanden ist und beim Neustart des Dienstes wiedergegeben / angewendet wird. Das Undo-Log der laufenden Transaktionen wird zurückgesetzt. lvm snapshot könnte verwendet werden (nicht llvm, da ich Tippfehler gemacht habe), mysqldump hat eine --single-Transaktion, Datenbankgröße, Bandbreite, akzeptable Wiederherstellungszeit - alle spielen eine Rolle, in denen Mechanismen verwendet werden. Ich schlage eine neue Frage vor :-) danblack vor 5 Jahren 0