Como devo migrar um grande banco de dados MySQL para o RDS?

8

Eu já olhei para isso um pouco. Percebo que existem perguntas semelhantes sobre o Stack Overflow, e a própria Amazon tem um documento útil, dando conselhos aqui:

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

Minhas preocupações são as seguintes:

A Amazon recomenda usar mysqldumpapenas para "pequenas quantidades de dados", que eles definem como menos de 1 GB. O banco de dados que pretendo migrar tem mais de 20 GB.

Uma coisa interessante mysqldump, no entanto, é que ele possui a --single-transactionsinalização, o que me permite garantir um estado de banco de dados consistente com um único ponto no tempo.

Para grandes quantidades de dados, a recomendação da Amazon é exportar o banco de dados para arquivos simples (por exemplo, CSV) e depois usá mysqlimport-los para importá-los para o RDS. A melhor maneira de saber como fazer isso , porém, é através do SELECT ... INTO OUTFILEcomando, que opera apenas uma tabela por vez. A desvantagem disso, é claro, é que ele não fornece a garantia de consistência --single-transaction.

Suponho que eu poderia garantir consistência retirando temporariamente todo o banco de dados; mas gostaria de evitar isso, se possível.

  1. Qual é a melhor maneira de colocar meu banco de dados grande (> 20 GB) em arquivos simples para que eu possa usá-lo mysqlimport?
  2. Se é realmente o SELECT ... INTO OUTFILEcomando, como exportar todas as tabelas no banco de dados (de preferência sem precisar fazer uma de cada vez)?
  3. Existe alguma maneira de garantir consistência ao longo de tudo isso?
Dan Tao
fonte
11
Provavelmente, isso se encaixa melhor no ServerFault; votou na migração
11
Você já tentou - apenas pensando? Acabei de lidar com um banco de dados 40G usando o mysqldump no outro dia - apenas leva algum tempo. Mas --opté o padrão, o que acelera as coisas. Acho que levou 6 horas para recarregar em um servidor potente, mas transições são transições ... :)
gahooa
@gahooa: Boa pergunta. Ainda não tentei, principalmente porque parecia da documentação da Amazon que não era recomendado. Mas posso apenas fazer isso.

Respostas:

5

Recentemente, passei muito tempo tentando descobrir uma transição de 15 GB para o RDS. Acabei encontrando um script em um dos fóruns da Amazon que modifiquei para meus próprios usos e parece funcionar bem. Não tenho certeza se você pode fazer uma única transação, mas o despejo em si é muito rápido comparado à transferência real. Acho que 15 GB levaram apenas 12 minutos para despejar, portanto, mesmo se não houver uma opção de transação única, acho que você não terá muito tempo para que ocorram inconsistências. Não tenho certeza se isso é bom o suficiente para você, mas achei a solução muito mais elegante do que o método de arquivo simples.

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