Tägliches Sichern einer MySQL-Datenbank mit 22 GB

28

Im Moment kann ich die Sicherung mit mysqldump durchführen. Aber ich muss den Webserver herunterfahren UND es dauert ungefähr 5 Minuten, um die Sicherung durchzuführen. Wenn ich den Webserver nicht herunterfahre, dauert es ewig und wird nie beendet. Während des Backups kann nicht mehr auf die Website zugegriffen werden.

Gibt es eine schnellere / bessere Möglichkeit zum Sichern meiner 22 GB großen und wachsenden Datenbank?

Alle Tabellen sind MyISAM.

anon
quelle
Werfen
Charles Faiga

Antworten:

28

Ja.

Richten Sie die Replikation auf einem zweiten Computer ein. Wenn Sie eine Sicherung durchführen müssen, können Sie den sekundären Computer sperren, mysqlhotcopy oder mysqldump ausführen und dann entsperren. Es holt Ihren Master wieder ein und Sie müssen den Master nie offline schalten.

Sie können dies sogar auf demselben Computer ausführen, wenn Sie nichts dagegen haben, die Schreib-E / A zu verdoppeln. Idealerweise sollten Sie sie jedoch in Echtzeit auf einem zweiten physischen Server sichern und Ihre Snapshot-Backups so oft erstellen, wie Sie möchten ohne Ihren Produktionsserver zu stören.

Es ist theoretisch auch möglich, eine Datenbank mit einem bekannten Status und Binlogs wiederherzustellen. Ich habe es noch nie getan, bitte untersuchen Sie es zuerst, aber Sie könnten einen bekannten Status Ihrer Datenbank sichern, dann einfach alle neuen Binlogs sichern und sie wiedergeben, falls Sie jemals eine Wiederherstellung benötigen. Da Binlogs linear geschrieben werden, ist das Synchronisieren neuer Binlogs mit einem Remotecomputer sehr schnell.

Bearbeiten: In der Tat sieht es so aus, als ob die Verwendung von Binlogs für die Sicherung dokumentiert ist.

Diese Frage ist sehr verwandt

John Douthat
quelle
Ja, das funktioniert großartig und würde meine Antwort sein. Der einzige große Nachteil ist, dass Sie täglich sicherstellen müssen, dass die Replikation ordnungsgemäß funktioniert. Wir machen während der Geschäftszeiten Snapshots unserer Slave-Datenbank und machen jede Nacht ein Backup vom Master.
5

Verzeihen Sie mir, dass ich davon ausgehe, dass das Betriebssystem Linux ist. Wenn Sie LVM nicht verwenden, sollten Sie dies tun. Wenn ja, ist dies eine sehr einfache Möglichkeit, Backups per Snapshot zu erstellen.

# Define these vars to meet your needs. These meet mine.
lvol="/dev/VolGroup03/lvol0"
snap_name="nightly_snapshot"
snap_vol="$(dirname $lvol)/$snap_name"
snap_path="/mnt/$snap_name"
snap_size="10g" # Not the size of your data, anticipated data changes during the backup
backup_path="/backups/$snap_name"

/usr/bin/time -f 'Databases were locked for %E' -- \
mysql <<- MYSQL
# based on http://pointyhair.com/tiki-view_blog_post.php?blogId=1&postId=5
FLUSH TABLES WITH READ LOCK;
\! lvcreate --size $snap_size --snapshot --name $snap_name $lvol
UNLOCK TABLES;
MYSQL
mount $snap_vol $snap_path
rsync -av --delete $snap_path/mysql $backup_path/
umount $snap_path
lvremove -f $snap_vol

Auf diese Weise können Sie nächtliche Sicherungen durchführen, ohne einen Slave-Server hinzufügen zu müssen. Ich bin sehr dafür, einen Slave-Server für Hochverfügbarkeit zu haben, aber ich möchte nicht, dass Sie glauben, dass Sie nicht weiterkommen, bis Sie diesen Slave erstellen können.

Bruno Bronosky
quelle
2

SPÜLTISCHE MIT LESESPERRE ist etwas, das Sie nicht regelmäßig (oder sogar halb regelmäßig) in einem Produktionssystem ausführen möchten. Es sollte nur ein letzter Ausweg sein.

Richten Sie mindestens zwei Replikations-Slaves ein (hierfür sind natürlich FLUSH TABLES WITH READ LOCK erforderlich). Sobald sie eingerichtet sind, können Sie eine Sicherung entfernen, während die andere als Ersatzmaster synchronisiert bleibt.

Wenn einer Ihrer Slaves ausfällt, können Sie einen Snapshot daraus verwenden, um einen zweiten (oder dritten) Slave wiederherzustellen. Wenn alle Ihre Slaves ausfallen, kehren Sie zu FLUSH TABLES WITH READ LOCK zurück.

Denken Sie daran, immer einen Prozess zu haben, der regelmäßig prüft, ob die Daten synchron sind. Verwenden Sie dazu so etwas wie mk-table-checksum.

Da 22 GB relativ klein sind, werden Sie keine Probleme damit haben. Dies mit einer großen Datenbank zu tun, könnte problematischer sein.

MarkR
quelle
1

Die Lösung hier ist zweifach, wie oben beschrieben:

  1. Richten Sie die Replikation Ihres Servers auf einen Slave ein, den Sie offline schalten können. Der beste Weg, dies zu tun, besteht darin, einen Speicherauszug der Datenbank mit mysqldump und dem Parameter --master-data zu erstellen.
  2. Richten Sie nächtliche Backups auf dem Slave ein. Sie können mysqldump entweder mit den Flags --master-data --flush-logs und --single-transaction verwenden, oder Sie können den mysql-Server anhalten, die Datendateien auf die Festplatte kopieren und neu starten (die Replikation wird dort abrufen, wo sie sich befindet) es hat aufgehört).
  3. Führen Sie alle (z. B. 5, 10, 20 Minuten) ein Skript auf dem Slave aus, um zu überprüfen, ob MySQL noch repliziert. Ich habe dazu ein einfaches Python-Skript geschrieben , das Sie gerne verwenden können.

Beachten Sie, dass Sie, wenn Sie InnoDB für Ihre Tabellen verwenden, das Flag --single-transaction verwenden können, um zu vermeiden, dass Tabellensperren durchgeführt werden müssen, und trotzdem einen konsistenten Speicherauszug der Datenbank zu erhalten, auch auf dem Master, und damit Ihre Sicherungen ohne Server ausschalten. Die obige Lösung ist jedoch eine bessere.

Wenn Sie LVM unter Linux verwenden, können Sie auch einen LVM-Snapshot der Partition erstellen und diese anschließend sichern. LVM-Snapshots sind atomar. Wenn Sie also Tabellen mit Lesesperre leeren und anschließend Ihren Snapshot erstellen und entsperren, erhalten Sie einen konsistenten Snapshot.

Wenn Sie Bedenken haben, dass E / A-Konflikte dazu führen könnten, dass der Speicherauszug zu lange dauert, können Sie einen dritten Computer hinzufügen und mysqldump auf diesem Computer über das Netzwerk ausführen, um eine Überlastung Ihrer Festplatten zu vermeiden.

Dan Udey
quelle
0

Abhängig von Ihrer Umgebung sind Schnappschüsse normalerweise ein hervorragender Weg. Insbesondere, wenn Sie den Master aus irgendeinem Grund sichern müssen. Wir führen Master- und Slave-Paare aus und verwenden auf beiden Snapshot-Backups.

  1. FLUSH TABLES WITH READ LOCK;
  2. Erstellen Sie eine Momentaufnahme der Datenbank und protokollieren Sie die Dateisysteme.
  3. UNLOCK TABLES;
  4. Kopieren Sie Ihre Datendateien nach Belieben aus dem Snapshot.

Bei InnoDB-Tabellen sollten Sie ausführen, SET AUTOCOMMIT=0;bevor Sie die Lesesperre ausführen.

jasonjwwilliams
quelle
-1

Sie könnten eine schrittweise Sicherung durchführen. Sichern Sie stündlich 1/24 der Datensätze. Das einzige Problem bei diesem Ansatz ist, dass Sie von diesem Zeitpunkt bis zum Zeitpunkt des Absturzes nichts verlieren, wenn er in den ersten Stunden des Tages abstürzt. In jedem Fall gehen weniger als 24 Stunden an Aufzeichnungen verloren (ich weiß nicht, wie wichtig das für Sie ist).

Musikfreak
quelle