Stellen Sie sicher, dass das mysqldump-Backup frei von Korruption ist

7

Wir haben eine Cron-Aufgabe, mit der wir unsere Datenbank mysqldumpsichern können. Mein Hauptanliegen ist die Beschädigung, nicht das manuelle Importieren und Überprüfen der Sicherungen jedes Mal, wenn der beste Weg ist, um zu überprüfen, ob eine Sicherung frei von Beschädigungen ist.

Hintergrund: Wir verwenden MySQL 5.5. * Und InnoDB. Wir laufen mysqldumpdirekt vom Server. Wir verwenden derzeit weder Master / Slave noch Master / Master, könnten uns aber ändern, wenn dies helfen würde. Die Datenbank ist derzeit klein <1 MB, sie wird auf absehbare Zeit <50 MB sein, daher muss die Skalierung in diesem Fall nicht wirklich berücksichtigt werden.

Sam
quelle

Antworten:

4

Der beste Weg, um eine Sicherung zu überprüfen, besteht darin, die Datenbank daraus wiederherzustellen.

Ein weiterer Grund dafür ist die kürzere Wiederherstellungszeit.

akuzminsky
quelle
4

Es gibt zwei Dinge, die Sie berücksichtigen möchten

SICHERUNGSPROZESS

Es gibt wirklich keinen Ersatz für eine Wiederherstellung. Dies ist nur eine Wiederholung eines mysqldump. Wenn Sie PITR ausführen müssen , müssen Sie möglicherweise mysqlbinlog für die entsprechenden Binlogs ausführen und die Ereignisse bis zu dem erforderlichen Datum und der erforderlichen Uhrzeit abspielen.

Sie sollten dies regelmäßig tun, wenn die Festplatte, auf der sich der mysqldump befindet, fehlerhaft ist oder wenn der mysqldump eine Zeichenfolge in einem BLOB enthält, die eine Wiederherstellung unmöglich macht.

SICHERUNGSINTEGRITÄT

Sie sollten in der Lage sein, mysqld ohne Probleme zu starten. Sobald Sie mysqld ausgeführt haben, müssen Sie die Benutzerfreundlichkeit jeder Tabelle testen. Sie können dies tun, indem Sie diese Abfrage ausführen:

SELECT CONCAT('CHECK TABLE ',dbtb,';') FROM
(SELECT CONCAT(table_schema,'.',table_name) dbtb FROM
information_schema.tables WHERE table_schema NOT IN
('information_schema','performance_schema','mysql')) A;

Dadurch wird für jede MyISAM-, InnoDB-, ARCHIVE- und CSV-Tabelle ein Befehl CHECK TABLE erstellt , um deren Integrität zu überprüfen. Sie können dies in ein Skript ausgeben und das Skript ausführen. Mit dem Befehl CHECK TABLE können Sie auch alle Tabellen als einen einzigen Befehl überprüfen. Sie können die Abfrage ändern, um die Tabellennamen als durch Kommas getrennte Liste zu erfassen und Folgendes voranzustellen:

SELECT CONCAT('CHECK TABLE ',dbtblist,';') FROM
(SELECT GROUP_CONCAT(table_schema,'.',table_name) dbtblist FROM
information_schema.tables WHERE table_schema NOT IN
('information_schema','performance_schema','mysql')) A;

WARNUNG: Die GROUP_CONCAT()Funktion ist standardmäßig auf 1024 Zeichen begrenzt. Wenn Sie eine bescheidene Anzahl von Tabellen haben, werden nicht alle Tabellen aufgelistet, und die zuletzt aufgeführte Tabelle wird abgeschnitten, was zu einem Fehler führt. Sie können Ihrem Befehl ein Vorwort geben SET SESSION group_concat_max_len = 10000;, um die Länge der Rückgabe zu erhöhen.

Hier ist ein Beispiel aus MySQL 5.6.16 (Windows) auf meinem Laptop:

mysql> SELECT CONCAT('CHECK TABLE ',dbtblist,';') FROM
    -> (SELECT GROUP_CONCAT(table_schema,'.',table_name) dbtblist FROM
    -> information_schema.tables WHERE table_schema NOT IN
    -> ('information_schema','performance_schema','mysql')) A;
+----------------------------------------------------------------------------+
| CONCAT('CHECK TABLE ',dbtblist,';')                                        |
+----------------------------------------------------------------------------+
| CHECK TABLE ayman.articles,ayman.topics,test.nuoji,test.prod,test.prodcat; |
+----------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql>

Speichern Sie diese Ausgabe dann in einer Variablen und führen Sie sie über die Befehlszeile aus. Beachten Sie, dass wir die group_concat_max_lenvor dem Ausführen des Befehls vorübergehend erhöht haben .

MYSQL_USER=root
MYSQL_PASS=rootpass
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SET SESSION group_concat_max_len = 1048576;"
SQL="${SQL} SELECT CONCAT('CHECK TABLE ',dbtblist,';') FROM"
SQL="${SQL} (SELECT GROUP_CONCAT(table_schema,'.',table_name) dbtblist FROM"
SQL="${SQL} information_schema.tables WHERE table_schema NOT IN"
SQL="${SQL} ('information_schema','performance_schema','mysql')) A"
mysql ${MYSQL_CONN} -ANe"${SQL}" | mysql ${MYSQL_CONN}

Versuche es !!!

RolandoMySQLDBA
quelle
Die maximale Länge des Ergebnisses der Funktion GROUP_CONCAT () beträgt 1024 Zeichen. Wenn Sie viele Tabellen haben, werden nicht alle Tabellen angezeigt, und höchstwahrscheinlich wird der zuletzt gedruckte Tabellenname abgeschnitten. Sie möchten SET SESSION group_concat_max_len = 10000;vor dem Befehl.
jnovack
@jnovavk danke, dass du das verstanden hast. Ich habe danach von group_concat_max_len erfahren und das in meine späteren Beiträge aufgenommen. Siehe dba.stackexchange.com/… . Ich habe gerade 10000 in 1048576 geändert. Nochmals vielen Dank für Ihr Adlerauge.
RolandoMySQLDBA
1

Ein Ansatz, den ich für eine normale mysqldump- Konsistenz verfolge

Schreiben Sie ein Shell-Skript in den unten genannten Ablauf und speichern Sie es als "mysqlbackup.sh".

  • Auf Meister

! # / usr / bin / bash

  • Spoolen Sie die Datenbanknamen in der FOR-Schleife und erstellen Sie eigene .sqls wie db1.sql

  • mysqldump -uroot -pPASSWORD --single-transaction "db1"> /backup/mysql/TODAY_DATE/db1.sql

  • cd / backup / mysql /

  • tar -czvf TODAY_DATE.tar.gz TODAY_DATE # Tar Gun Zip-Verzeichnis

  • gzip -t /backup/mysql/TODAY_DATE.tar.gz # Zur Überprüfung der Integrität von gzip

  • scp /backup/mysql/TODAY_DATE.tar.gz-Datei auf einen anderen Server # Um den Ausfall auf Serverebene als minimalen Fehlerpunkt oder Archiv in SAN oder Multiplex abzudecken, können je nach Ausfallstufe Rechenzentrumsebene, Netzwerkebene usw. .,

  • Bereinigen und drehen Sie alte Sicherungen innerhalb von 7 Tagen (abhängig von Ihrer Notwendigkeit, sie vom lokalen Server wiederherzustellen).

crontab -l

00 3 * * * /usr/scripts/mysqlbackup.sh 2> / usr / scripts / log_mysqlbackup. date +%Y_%m_%d_M.irren

Überwachen Sie Ihre Nagios oder Netcool, um auf die Datei / usr / scripts / log_mysqlbackup zu verweisen. date +%Y_%m_%d_M.irren

err_file="/usr/scripts/log_mysqlbackup.`date +%Y_%m_%d_M`.err "

if [[ -s $err_file ]]
then
"Trigger alert -> Alerting team should call DB Team to fix it by rerunning backup"
fi
  • Sie können andere Prüfkriterien hinzufügen, um die Warnung auszulösen, z. B. sollte die Größe der Sicherungsdatei mehr als 3 GB betragen (abhängig von der Standardgröße der Sicherung) und einen Alarm auslösen, wenn sie geringer ist usw. Analysieren Sie diese Kriterien in mysqlbackup.sh und geben Sie die Details in / usr / scripts / log_mysqlbackup ein, falls Probleme auftreten, die Ihren Kriterien entsprechen. date +%Y_%m_%d_M.irren. Da das Überwachungstool einen Alarm auslöst, wenn die Fehlerdatei eine Größe enthält.

  • Da Sie die Master-Binlog-Datei und die Master-Binlog-Position in sqldump aufgezeichnet haben, ist dies bei PITR hilfreich, wenn Sie später Binärprotokolldateien anwenden müssen.

Andere Level-Checks:

  • Einmal im Monat können Sie versuchen, eine zufällige Sicherung von allen gemultiplexten Geräten (dh lokalem Server / externem Server / SAN / Band) wiederherzustellen.

Dies stellt die Konsistenz Ihrer Sicherungsdaten sicher und kann Situationen vermeiden, in denen Sicherungsdaten zum Zeitpunkt einer dringenden Wiederherstellung ungültig sind.

Mannoj
quelle
0

Sie sollten sich daran erinnern, dass ein MySQL-Dump im Grunde eine große SQL-Skript-Textdatei ist, die das Datenbankschema erstellt und alle Daten in dieses einfügt. Sobald mysqldump korrekt beendet wurde, können Sie ziemlich sicher sein, dass alles gut gelaufen ist (vorausgesetzt natürlich, Sie sichern die richtigen Datenbanken!)

Mir ist nicht bekannt, wie eine mysqldump-Datei beschädigt werden könnte (es sei denn, es gab Probleme mit dem Dateisystem. In diesem Fall könnte eine Datei beschädigt werden). MySQL ist (zu Recht) ziemlich zimperlich; Wenn die Datenbank einige beschädigte Tabellen enthält, stürzt mysqld ab und lässt mysqldump nicht beenden, um die Datenbankintegrität zu schützen.

DR_
quelle