Wie soll ich eine große MySQL-Datenbank auf RDS migrieren?

8

Ich habe das schon ein bisschen untersucht. Mir ist klar, dass es ähnliche Fragen zu Stack Overflow gibt, und Amazon selbst hat hier ein hilfreiches Dokument mit Ratschlägen:

http://aws.amazon.com/articles/2933

Meine Bedenken sind folgende:

Amazon empfiehlt, mysqldumpnur "kleine Datenmengen" zu verwenden, die als weniger als 1 GB definiert sind. Die Datenbank, die ich migrieren möchte, ist über 20 GB groß.

Eine nette Sache mysqldumpist jedoch, dass es das --single-transactionFlag hat, mit dem ich einen DB-Status sicherstellen kann, der mit einem einzelnen Zeitpunkt übereinstimmt.

Für größere Datenmengen empfiehlt Amazon, die Datenbank in flache (z. B. CSV) Dateien zu exportieren und diese dann mysqlimportin RDS zu importieren. Der beste Weg , ich weiß , wie zu tun , dies ist jedoch durch den SELECT ... INTO OUTFILEBefehl, der eine Tabelle nur zu einem Zeitpunkt arbeitet. Der Nachteil dabei ist natürlich, dass es nicht die Konsistenzgarantie von bietet --single-transaction.

Ich nehme an, ich könnte die Konsistenz sicherstellen, indem ich die gesamte Datenbank vorübergehend herunterfahre. aber ich würde das gerne vermeiden, wenn es überhaupt möglich ist.

  1. Was ist der beste Weg, um meine große Datenbank (> 20 GB) in flache Dateien umzuwandeln, damit ich sie dann verwenden kann mysqlimport?
  2. Wenn es sich tatsächlich um den SELECT ... INTO OUTFILEBefehl handelt, wie exportiere ich alle Tabellen in der Datenbank (vorzugsweise ohne jeweils eine ausführen zu müssen)?
  3. Gibt es eine gute Möglichkeit, die Konsistenz zu gewährleisten?
Dan Tao
quelle
1
Dies passt wahrscheinlich besser zu ServerFault. stimmte für die Migration
1
Haben Sie es versucht - fragen Sie sich nur? Ich habe mich neulich mit mysqldump mit einer 40G-Datenbank befasst - es dauert nur einige Zeit. Ist --optaber Standard, was die Dinge beschleunigt. Ich denke, wir haben 6 Stunden
gebraucht
@gahooa: Gute Frage. Ich habe es noch nicht ausprobiert, hauptsächlich, weil es aus der Amazon-Dokumentation hervorgeht, dass es nicht empfohlen wurde. Aber ich kann einfach weitermachen und das tun.

Antworten:

5

Ich habe erst kürzlich viel Zeit damit verbracht, einen 15-GB-Übergang zu RDS herauszufinden. Am Ende fand ich ein Skript in einem der Amazon-Foren, das ich an meine eigenen Zwecke angepasst habe und das anscheinend gut funktioniert. Ich bin nicht sicher, ob Sie eine einzelne Transaktion durchführen können, aber der Speicherauszug selbst ist im Vergleich zur tatsächlichen Übertragung sehr schnell. Ich glaube, 15 GB haben nur 12 Minuten für den Speicherauszug benötigt. Selbst wenn es keine einzelne Transaktionsoption gibt, haben Sie wahrscheinlich keine sehr lange Zeitspanne, bis Inkonsistenzen auftreten. Ich bin mir nicht sicher, ob das für Sie gut genug ist, aber ich fand die Lösung viel eleganter als die Flatfile-Methode.

#!/bin/bash

declare -a dbs=(dbname1 dbname2 dbname3 dbname4);

j=0
while [ $j -lt 4 ];
#4 is the number of dbs
do

echo "Dumping ${dbs[$j]} DB"
time mysqldump --order-by-primary --host=sourcehost --user=sourceuser --password=sourcepass `echo ${dbs[$j]}` > /tmp/`echo ${dbs[$j]}`.sql
echo "Adding optimizations to ${dbs[$j]}"
awk 'NR==1{$0="SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;\n"$0}1' /tmp/`echo ${dbs[$j]}`.sql >> /tmp/`echo ${dbs[$j]}`X.sql
mv /tmp/`echo ${dbs[$j]}`X.sql /tmp/`echo ${dbs[$j]}`.sql
echo "SET unique_checks=1; SET foreign_key_checks=1; COMMIT;" >> /tmp/`echo ${dbs[$j]}`.sql
echo "Copy ${dbs[$j]} into RDS"
time mysql --host=yourrds.rds.amazonaws.com --user=rdsuser --password=rdspassword `echo ${dbs[$j]}` < /tmp/`echo ${dbs[$j]}`.sql &

j=$(($j+1))
done 
jchysk
quelle