¿Cómo debo migrar una gran base de datos MySQL a RDS?

8

Ya he investigado esto un poco. Me doy cuenta de que hay preguntas similares sobre Stack Overflow, y Amazon tiene un documento útil que da consejos aquí:

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

Mis preocupaciones son las siguientes:

Amazon recomienda usar mysqldumpsolo para "pequeñas cantidades de datos", que definen como menos de 1 GB. La base de datos que pretendo migrar tiene más de 20 GB.

mysqldumpSin embargo, una cosa que es agradable es que tiene la --single-transactionbandera, lo que me permite asegurar un estado de base de datos que sea consistente con un solo punto en el tiempo.

Para grandes cantidades de datos, la recomendación de Amazon es exportar la base de datos a archivos planos (por ejemplo, CSV) y luego usarlos mysqlimportpara importarlos a RDS. La mejor manera que sé cómo hacer esto , sin embargo, es a través del SELECT ... INTO OUTFILEcomando, que sólo opera una tabla a la vez. La desventaja de esto, por supuesto, es que no proporciona la garantía de consistencia --single-transaction.

Supongo que podría garantizar la coherencia eliminando todo el DB temporalmente; pero me gustaría evitar eso si es posible.

  1. ¿Cuál es la mejor manera de obtener mi gran base de datos (> 20 GB) en archivos planos para que luego pueda usar mysqlimport?
  2. Si es realmente el SELECT ... INTO OUTFILEcomando, ¿cómo exporto todas las tablas de la base de datos (preferiblemente sin tener que hacer una a la vez)?
  3. ¿Hay alguna buena manera de garantizar la coherencia en todo esto?
Dan Tao
fuente
1
Probablemente sea mejor para ServerFault; votó para migrar
1
¿Lo has probado? Acabo de lidiar con una base de datos 40G usando mysqldump el otro día, solo lleva algo de tiempo. Pero --optes predeterminado, lo que acelera las cosas. Creo que nos tomó 6 horas volver a cargar en un servidor potente, pero las transiciones son transiciones ... :)
gahooa
@gahooa: Buena pregunta. Todavía no lo he probado, principalmente porque en la documentación de Amazon parecía que no se recomendaba. Pero puedo seguir adelante y hacer eso.

Respuestas:

5

Recientemente, pasé mucho tiempo tratando de descubrir una transición de 15 GB a RDS. Terminé buscando un script en uno de los foros de Amazon que modifiqué para mis propios usos y parece funcionar bien. No estoy seguro de si puede hacer una sola transacción, pero el volcado en sí es muy rápido en comparación con la transferencia real. Creo que 15GB solo me tomó 12 minutos para volcar, por lo que incluso si no tiene una sola opción de transacción, no creo que tenga un período de tiempo muy largo para que ocurran inconsistencias. No estoy seguro de si eso es lo suficientemente bueno para usted, pero encontré la solución mucho más elegante que el método de archivo plano.

#!/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
fuente