Wie kann man eine riesige MySQL-Innodb-Datenbank effizient sichern?


8

Ich habe einen MySQL-Datenbankserver für die Ubuntu 10.04-Produktion, bei dem die Gesamtgröße der Datenbank 260 GB beträgt, während die Größe der Root-Partition selbst 300 GB beträgt, in der die Datenbank gespeichert ist. Dies bedeutet im Wesentlichen, dass etwa 96% von / voll sind und kein Speicherplatz mehr zum Speichern von Dump / Backup vorhanden ist usw. Derzeit ist keine andere Festplatte an den Server angeschlossen.

Meine Aufgabe ist es, diese Datenbank auf einen anderen Server zu migrieren, der sich in einem anderen Rechenzentrum befindet. Die Frage ist, wie dies mit minimalen Ausfallzeiten effizient durchgeführt werden kann.

Ich denke in der Schlange von:

  • Fordern Sie an, ein zusätzliches Laufwerk an den Server anzuschließen und einen Speicherauszug auf diesem Laufwerk zu erstellen. [EDIT: Es ist jetzt nicht möglich.]
  • Übertragen Sie den Speicherauszug auf einen neuen Server, stellen Sie ihn wieder her und erstellen Sie einen neuen Server-Slave des vorhandenen Servers, um die Daten synchron zu halten
  • Wenn eine Migration erforderlich ist, unterbrechen Sie die Replikation, aktualisieren Sie die Slave-Konfiguration, um Lese- / Schreibanforderungen zu akzeptieren, und machen Sie den alten Server schreibgeschützt, damit keine Schreibanforderungen auftreten, und weisen Sie die App-Entwickler an, die Konfiguration mit der neuen IP-Adresse für db zu aktualisieren.

Was sind Ihre Vorschläge, um diesen oder einen anderen besseren Ansatz für diese Aufgabe zu verbessern?

Antworten:


9

Wenn Sie erwägen , mit der exakt gleichen Version von MySQL auf einem anderen DB - Server migrieren, können Sie wollen rsyncdie datadirvom alten Server auf den neuen Server.

Dies funktioniert unabhängig vom InnoDB-Dateilayout oder sogar vom Vorhandensein von MyISAM-Tabellen.

  1. Installieren Sie dieselbe Version von MySQL auf ServerB wie ServerA
  2. Führen Sie auf ServerA aus, RESET MASTER;um alle Binärprotokolle vor dem rsycn-Prozess zu löschen. Wenn die binäre Protokollierung nicht aktiviert ist, können Sie diesen Schritt überspringen.
  3. Führen Sie auf ServerA SET GLOBAL innodb_max_dirty_pages_pct = 0;etwa 10 Minuten lang MySQL aus.
  4. rsync / var / lib / mysql von ServerA nach / var / lib / mysql auf ServerB
  5. Wiederholen Sie Schritt 3, bis eine Synchronisierung weniger als 1 Minute dauert
  6. service mysql stop auf ServerA
  7. Führen Sie eine weitere Synchronisierung durch
  8. scp ServerA: /etc/my.cnf zu ServerB: / etc /.
  9. service mysql start auf ServerB
  10. service mysql start auf ServerA (optional)

Im Wesentlichen ist hier, was ein solches Skript dies möchte

mysql -u... -p... -e"RESET MASTER;"
mysql -u... -p... -e"SET GLOBAL innodb_max_dirty_pages_pct = 0;"
RSYNCSTOTRY=10
cd /var/lib/mysql
X=0
while [ ${X} -lt ${RSYNCSTOTRY} ]
do
    X=`echo ${X}+1|bc`
    rsync -r * targetserver:/var/lib/mysql/.
    sleep 60
done
service mysql stop
rsync -r * targetserver:/var/lib/mysql/.
service mysql start

Ein Mitglied des DBA StackExchange sagte, ich sollte mich von FLUSH TABLES WITH READ LOCK;etwas in mysqlperformanceblog.com fernhalten

Ich habe durchgelesen und gelernt, dass SELECTs gegen InnoDB-Tabellen in der Mitte von a FLUSH TABLES WITH READ LOCK;immer noch Schreibvorgänge auf irgendeine Weise ermöglichen können. Wie in dem Kommentar von Arlukin erwähnt , würde LVM problemlos mit FLUSH TABLES WITH READ LOCKInnoDB zusammenarbeiten (+1 für seinen Kommentar).

Für alle Nicht-LVM-Benutzer ist eine All-MyISAM-Datenbank zur Verwendung mit in Ordnung FLUSH TABLES WITH READ LOCK;. --single-tranactionHalten Sie sich für InnoDB bitte an die Verwendung in mysqldumps.


2
So machen wir es, wenn wir ein Master-Slave-Setup manuell synchronisieren müssen. Funktioniert wirklich gut. Auf unseren neuesten Servern verwenden wir jedoch LVM-Snapshots, sodass wir den Server nicht stoppen müssen. Kurz vor dem LVM-Snapshot führen wir "FLUSH TABLES WITH READ LOCK" aus, damit die Dateien kopiert werden können. Der lvm-Snapshot ist auch sehr gut, wenn Sie alle Dateien zu Sicherungszwecken kopieren möchten. Richten Sie Ihren neuen Server mit LVM ein und fügen Sie zusätzlichen Speicherplatz hinzu, um Snapshots erstellen zu können.
Arlukin

Vielen Dank für die ausführliche Antwort. Was ist, wenn MySQL-Versionen unterschiedlich sind? Das ältere ist 5.1 mit Ubuntu 10.04, während ich in neueren Versionen bereit bin, 12.04 mit Standard 5.5 zu verwenden. Welchen Ansatz empfehlen Sie in einem solchen Fall? Das Anschließen eines zusätzlichen Laufwerks kommt jetzt nicht mehr in Frage, sodass Daten per Fernzugriff gesendet werden müssen, sei es per Dump / Rsync oder auf andere Weise.
Jagbir

1

Ein Speicherauszug und eine Wiederherstellung einer Datenbank dieser Größe würden Stunden dauern. Ich würde, abhängig von den Versionen von MySQL, solange die Versionsnummer erhöht wird und es keine Sprünge in der Hauptversionsnummer gibt. Sie sollten in der Lage sein, die unformatierten Datenbankdateien in / var / lib / mysql auf den neuen Server zu stellen, die Berechtigungen festzulegen und den Server mit dem Schalter --skip-grant-tables zu starten. Fügen Sie die erforderlichen Berechtigungen für Benutzer hinzu, die die neue IP-Adresse widerspiegeln, und starten Sie dann normal neu.

Ich würde auf die Größe Ihrer Datenbank eingehen, da diese zu groß ist, um effizient zu sein.


Es gibt 4 Datenbanken mit einer Größe von etwa 50 bis 90 GB, was einer Gesamtgröße von 260 GB entspricht. Es mag ineffizient sein, aber ich muss ab sofort damit leben. Auch die MySQL-Versionen sind unterschiedlich, was schlagen Sie in diesem Fall vor?
Jagbir

Wenn die MySQL-Versionen unterschiedlich sind, führen Sie zuerst einen Probelauf durch und testen Sie gründlich, solange die Versionsnummer auf dem neuen Server höher ist als die auf dem alten. Sie sollten in Ordnung sein. Wenn dies nicht erfolgreich ist, stecken Sie möglicherweise mit mysqldump && restore fest.
James Park-Watt

1

Sie können diese Schritte ausführen, um diese riesige InnoDB-Datenbank zu migrieren.

  • Installieren Sie SSHFS und hängen Sie die entsprechende Partition des Remote-Servers auf dem Produktionsserver an
  • Verwenden Sie Percona XtraBackup, um eine Hotcopy der InnoDB-Datenbank abzurufen und direkt im SSHFS-Verzeichnis zu speichern
  • Diese Aufgabe dauert mehrere Stunden. Um die Auswirkungen des Hotcopy-Skripts auf den Live-Server zu minimieren, legen Sie mit renice eine niedrige Priorität fest

    $ renice -n 5 -p <SCRIPT-PID>

  • Stellen Sie sicher, dass auf beiden Servern dieselbe Version des MySQL-Servers ausgeführt wird.
  • Sobald die Hotcopy abgeschlossen ist, können Sie sie auf dem neuen Server wiederherstellen und den Replikationsprozess starten

Während dieses Vorgangs kann es zu Langsamkeit kommen, aber definitiv zu keinen Ausfallzeiten. Percona XtraBackup erstellt eine Hotcopy, die im Vergleich zu mysqldump schneller und weniger ressourcenintensiv ist. Dies ist ideal für eine riesige InnoDB-Datenbank.

Abhängig von den Verwendungsmustern und Statistiken können Sie diesen Prozess ausführen, wenn auf dem Server nur minimaler Datenverkehr vorhanden ist. Vielleicht ist es eine gute Idee, dies über das Wochenende zu tun? Das Obige ist nur ein Überblick über den Prozess. Möglicherweise müssen Sie die Percona XtraBackup- und SSHFS-Dokumentation durchgehen.


1

Sie können die Datenbank einfach direkt auf den Remote-Server sichern ...

$ mysqldump | ssh user@server 'cat - > dumpfile.sql.gz'

... SQL sollte sich gut komprimieren lassen, damit Sie dies mit einer dieser Optionen viel schneller erledigen können, obwohl dies auch von der Menge an RAM abhängt, die Sie in der Box haben ...

$ mysqldump | ssh -C user@server 'cat - > dumpfile.sql.gz'
$ mysqldump | gzip -c | ssh user@server 'cat - > dumpfile.sql.gz'
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.