Как мне перенести большую базу данных MySQL в RDS?

8

Я уже немного разбирался в этом. Я понимаю, что есть похожие вопросы о переполнении стека, и у самих Amazon есть полезный документ, дающий советы здесь:

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

Мои опасения следующие:

Amazon рекомендует использовать mysqldumpтолько для «небольших объемов данных», которые они определяют как менее 1 ГБ. База данных, которую я собираюсь перенести, превышает 20 ГБ.

Однако хорошо то mysqldump, что у него есть --single-transactionфлаг, который позволяет мне обеспечить состояние БД, соответствующее одному моменту времени.

Для больших объемов данных Amazon рекомендует экспортировать базу данных в плоские (например, CSV) файлы и затем использовать их mysqlimportдля импорта в RDS. Лучший способ я знаю , как сделать это , однако, через SELECT ... INTO OUTFILEкоманду, которая работает только одна таблица , в то время. Недостатком этого, конечно, является то, что он не дает гарантии согласованности --single-transaction.

Я полагаю, что смог бы обеспечить согласованность, временно отключив всю БД; но я бы хотел этого избежать, если это вообще возможно.

  1. Какой лучший способ превратить мою большую (> 20 ГБ) базу данных в плоские файлы, чтобы я мог потом использовать mysqlimport?
  2. Если это действительно SELECT ... INTO OUTFILEкоманда, как мне экспортировать все таблицы в базе данных (желательно без необходимости делать по одной за раз)?
  3. Есть ли хороший способ обеспечить последовательность всего этого?
Дэн Тао
источник
1
Это, вероятно, лучше подходит для ServerFault; проголосовал за миграцию
1
Вы пробовали это - просто интересно? Я только что имел дело с базой данных 40G, используя mysqldump на днях - просто занимает некоторое время. Но --optэто по умолчанию, что ускоряет процесс. Я думаю, что нам потребовалось 6 часов для перезагрузки на мощный сервер, но переходы - это переходы ... :)
gahooa
@gahooa: Хороший вопрос. Я еще не пробовал, в основном потому, что из документации Amazon казалось, что это не рекомендуется. Но я могу просто пойти дальше и сделать это.

Ответы:

5

Я только недавно потратил много времени, пытаясь выяснить переход 15 ГБ в RDS. Закончилось поиском сценария на одном из форумов Amazon, который я модифицировал для своих собственных нужд и, похоже, работает хорошо. Я не уверен, что вы можете сделать одну транзакцию, но сам дамп очень быстрый по сравнению с фактическим переводом. Я думаю, что 15 ГБ заняло у меня всего 12 минут, чтобы создать дамп, поэтому, даже если у него нет единой опции транзакции, я не думаю, что у вас будет очень длительный промежуток времени для возникновения несоответствий. Я не уверен, достаточно ли это для вас, но я нашел решение более изящным, чем метод плоских файлов.

#!/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
источник