Optimale Möglichkeit, MySQL-Backups für relativ große Datenbanken (MyISAM / InnoDB) zu erstellen

8

Derzeit haben wir eine leistungsstarke MySQL-Datenbank, in der einige stark frequentierte Django-basierte Websites sowie einige E-Commerce-Websites von angemessener Größe ausgeführt werden. Infolgedessen verfügen wir über eine große Anzahl großer Datenbanken, die sowohl InnoDB- als auch MyISAM-Tabellen verwenden.

Leider sind wir vor kurzem aufgrund des Datenverkehrs an eine Wand gestoßen, daher habe ich einen anderen Master-Server eingerichtet, um Lese- und Sicherungsvorgänge zu vereinfachen.

Im Moment benutze ich einfach mysqldump mit ein paar Argumenten und es hat sich als gut erwiesen. Bis jetzt. Offensichtlich ist mysqldump eine langsame, schnelle Methode, aber ich glaube, wir sind ihrer Verwendung entwachsen. Ich brauche jetzt eine gute Alternative und habe versucht, das Dienstprogramm mat -parallel-dump von Maatkits oder eine LVM-Snapshot-Lösung zu verwenden.

Kurze Kurzfassung:

  • Ich habe eine ziemlich große MySQL-Datenbank, die ich sichern muss
  • Die derzeitige Methode mit mysqldump ist ineffizient und langsam (verursacht Probleme).
  • Schauen Sie sich etwas wie mk-parallel-dump oder LVM-Snapshots an

Alle Empfehlungen oder Ideen wären willkommen - da ich neu machen muss, wie wir Dinge tun, lasse ich es lieber richtig / am effizientesten machen :).

WinkyWolly
quelle

Antworten:

5

Ich hatte gute Erfolge mit der MySQL-Replikation und den nächtlichen Tarballs. Für kleinere Datenbanken, die MySQL-Datenbank und das Schema verwende ich eine Kombination von Skripten, die für die Verwendung von Mysqlhotcopy und MySQLldump entwickelt wurden.

InnoDB Hot Backup ist ein großartiges kommerzielles Produkt, aber ich bin mir nicht sicher, wie es mit gemischten Tabellen in derselben Datenbank umgeht. Die Empfehlung von pQd für XtraBackup ist möglicherweise gut zu vergleichen.

Andere mögen LVM-Schnappschüsse und ich würde sagen, das ist definitiv etwas zu beachten. Letztendlich wäre eine Kombination von Lösungen wahrscheinlich am besten.

Es ist auch bemerkenswert, dass dies ein altes Thema ist. Zwischen dem High Performance MySQL- Buch, dem MySQL-Handbuch und früheren ServerFault-Fragen ist dies allgemein erschöpft. Sehen:

Warner
quelle
+1; Mit myisam wissen Sie nie, ob Sie ein logisch konsistentes Backup haben [von lvm / mysqldump / from lave] oder nicht. Wenn Sie Ihre Anwendung nur während der Geschäftszeiten ändern - ansonsten können Sie sie sicher in der Nacht ablegen -, sind Sie sich möglicherweise nie sicher und es hilft keine Methode.
pQd
Ich denke, Sie haben Recht mit dem Mischen von Lösungen. Wie unter der Antwort von pQd erwähnt, werde ich wahrscheinlich die LVM-Snapshots machen und mir das Dienstprogramm xtrabackup ansehen (sagt, es kann gemischte Tabellen verarbeiten). Ich habe mir InnoDBs Hot Backup angesehen, bin aber immer einer für Open Source-Projekte. Vielen Dank für die Referenzen, ich habe 2 von untersucht, aber die Antworten sind ziemlich allgemein gehalten / behandeln nicht die Probleme, die ich habe / sie beziehen sich auf "normalere" und "weltlichere" Datenbanken.
WinkyWolly
4

xtrabackup - zumindest für innodb.

pQd
quelle
Interessant ist jedoch, dass ich eine elegantere Lösung hätte, um mir keine Sorgen um meine Mischung aus InnoDB / MyISAM-Tabellen zu machen.
WinkyWolly
xtrabackup enthält ein Skript, mit dem Sie auch Backups von Myisams erstellen können. Überprüfen Sie jedoch meinen Kommentar unter Warners Beitrag
pQd
Danke, es sieht so aus, als würde ich in diese Richtung gehen und LVM-Schnappschüsse für ein gutes Maß einmischen. Es gibt an, dass es MyISAM-Tabellen auch über das Skript "innobackupex" "verarbeiten" kann. Ich nehme an, ich werde das versuchen und genau sehen, was passiert.
WinkyWolly
3

Die häufigste Methode zur Lösung dieses Problems besteht darin, einen anderen MySQL-Server einzurichten, der sich sogar auf demselben Computer befinden kann, und die Master / Slave-Replikation auszuführen. Sie können dann die Sicherung auf dem Slave durchführen, ohne dass dies Auswirkungen auf den Master hat.

John Gardeniers
quelle
0

Auf EC2 EBS verwende ich gerade xfs_freeze. Ich möchte möglicherweise irgendwann auf xtrabackup umsteigen, aber als ich es zum ersten Mal testete, war es sehr, sehr CPU-hungrig.

user5336
quelle
Leider verwende ich XFS derzeit nur auf Medienservern, daher ist dies keine Option. Welche Art von Erfahrung (abgesehen von CPU-Hunger, vielleicht mehr Details?) Hatten Sie mit xtrabackup? Haben Sie reine InnoDB-Tabellen oder eine Mischung gesichert?
WinkyWolly
Mein größtes Zögern war, dass die CPU nach Abschluss etwa 30 Minuten lang gekaut wurde (Sicherung einer Datenbank mit etwa 35 GB Daten), wodurch der DB-Server nur geringfügig funktionsfähig wurde - sicherlich nicht etwas, das ich wahrscheinlich auf einem Produktionsmaster ausführen würde . Zu diesem Zweck hatte ich meine verbleibenden MyISAM-Tabellen bereits teilweise in InnoDB konvertiert. Ich denke, es wäre wahrscheinlich in Ordnung, auf einem Slave zu laufen, solange die Replikation dadurch nicht wesentlich zurückfällt.
user5336
0

Wenn Sie die Replikation einer Datenbank ausführen, die für mehrere Anwendungen gemeinsam genutzt wird, stellt sich offensichtlich die Frage, ob Sie die Leistung vieler Dinge, einschließlich Sicherungen, verbessern können, indem Sie Datenbankserver Apps zuweisen. Geteilt ist schön, bis es nicht mehr ist.

Justin Alan Ryan
quelle
0

Wenn Sie Ihre MyISAM-Tabellen nur aus älteren Gründen aufbewahren (Sie haben sich nicht die Mühe gemacht, sie zu ändern), verwende ich Folgendes, um dies einfach zu beheben:

    mysql -u root --password=<password> --database=db_name -B -N -e "SHOW TABLES" | awk '!/not_this_db/ && !/or_this_one/ && /^[a-z]/ {print "ALTER TABLE", $1, "ENGINE=INNODB;"}' | mysql -u root --password=<password> --database=db_name

Sie können Datenbanken mit dem regulären Ausdruck awk ausschließen und einschließen, z. B. nur dbs, die in meinem obigen Beispiel mit einem Kleinbuchstaben beginnen. Dadurch werden die Tabellen natürlich während der Änderung gesperrt.

Verwenden Sie dann xtrabackup, um die gesamte Datenbank direkt auf einen anderen Server zu kopieren, ohne Tabellen zu sperren oder zu viel Festplatten-E / A zu verwenden (nach dem Einrichten von ssh rsa-Schlüsseln):

innobackupex --throttle=500 --compress --stream=xbstream /doesntneedtoexist | ssh user@otherhost "xbstream -x -C /root/backup/"

Anschließend können Sie den Schritt zum Anwenden des Protokolls vollständig trennen und Speicherplatz, E / A und CPU auf dem Produktionsserver sparen.

Perconas HowTO's für die Verwendung von xtrabackup

Brad
quelle