Comment dois-je migrer une grande base de données MySQL vers RDS?

8

J'ai déjà examiné un peu cela. Je me rends compte qu'il y a des questions similaires sur Stack Overflow, et Amazon eux-mêmes ont un document utile donnant des conseils ici:

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

Mes préoccupations sont les suivantes:

Amazon recommande de n'utiliser mysqldumpque pour "de petites quantités de données", qu'ils définissent comme inférieures à 1 Go. La base de données que j'ai l'intention de migrer fait plus de 20 Go.

Une chose qui est bien au sujet mysqldump, cependant, est qu'il a le --single-transactiondrapeau, ce qui me permet d'assurer un état DB qui est compatible avec un seul point dans le temps.

Pour de plus grandes quantités de données, la recommandation d'Amazon consiste à exporter la base de données dans des fichiers plats (par exemple, CSV), puis mysqlimportà les importer dans RDS. La meilleure façon , je sais comment faire cela , cependant, est à travers la SELECT ... INTO OUTFILEcommande, qui fonctionne une seule table à la fois. L'inconvénient de cela, bien sûr, est qu'il ne fournit pas la garantie de cohérence de --single-transaction.

Je suppose que je pourrais assurer la cohérence en supprimant temporairement la totalité de la base de données; mais j'aimerais éviter cela si possible.

  1. Quelle est la meilleure façon d'obtenir ma grande base de données (> 20 Go) dans des fichiers plats afin que je puisse ensuite l'utiliser mysqlimport?
  2. S'il s'agit bien de la SELECT ... INTO OUTFILEcommande, comment exporter toutes les tables de la base de données (de préférence sans avoir à en faire une à la fois)?
  3. Existe-t-il un bon moyen de garantir la cohérence dans tout cela?
Dan Tao
la source
1
C'est probablement un meilleur choix pour ServerFault; voté pour migrer
1
L'avez-vous essayé - vous vous demandez simplement? Je viens de traiter une base de données 40G en utilisant mysqldump l'autre jour - prend juste un peu de temps. Mais --optc'est par défaut, ce qui accélère les choses. Je pense que nous avons mis 6 heures pour recharger sur un serveur puissant, mais les transitions sont des transitions ... :)
gahooa
@gahooa: Bonne question. Je ne l'ai pas encore essayé, principalement parce qu'il semblait d'après la documentation d'Amazon qu'il n'était pas recommandé. Mais je peux simplement aller de l'avant et le faire.

Réponses:

5

Récemment, j'ai passé beaucoup de temps à essayer de comprendre une transition de 15 Go vers RDS. J'ai fini par trouver un script sur l'un des forums d'Amazon que j'ai modifié à mes propres fins et qui semble bien fonctionner. Je ne sais pas si vous pouvez effectuer une seule transaction, mais le vidage lui-même est très rapide par rapport au transfert réel. Je pense que 15 Go ne m'ont pris que 12 minutes pour vider, donc même s'il n'a pas d'option de transaction unique, je ne pense pas que vous auriez un très long laps de temps pour que des incohérences se produisent. Je ne sais pas si c'est assez bon pour vous, mais j'ai trouvé la solution beaucoup plus gracieuse que la méthode du fichier plat.

#!/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
la source