Bagaimana cara saya memigrasi database MySQL besar ke RDS?

8

Saya sudah melihat sedikit ini. Saya menyadari ada pertanyaan serupa tentang Stack Overflow, dan Amazon sendiri memiliki dokumen yang membantu memberi saran di sini:

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

Kekhawatiran saya adalah sebagai berikut:

Amazon merekomendasikan penggunaan mysqldumphanya untuk "sejumlah kecil data", yang mereka definisikan kurang dari 1GB. Basis data yang ingin saya migrasi lebih dari 20GB.

Satu hal yang menyenangkan tentang mysqldumpitu, adalah memiliki --single-transactionbendera, yang memungkinkan saya untuk memastikan status DB yang konsisten dengan satu titik waktu.

Untuk jumlah data yang lebih besar, rekomendasi Amazon adalah mengekspor database ke file datar (mis., CSV) dan kemudian menggunakannya mysqlimportuntuk mengimpornya ke RDS. Namun, cara terbaik yang saya tahu bagaimana melakukan ini adalah melalui SELECT ... INTO OUTFILEperintah, yang hanya mengoperasikan satu tabel pada satu waktu. Kelemahan dari ini, tentu saja, adalah tidak memberikan jaminan konsistensi --single-transaction.

Saya kira saya bisa memastikan konsistensi dengan menurunkan seluruh DB sementara; tapi saya ingin menghindari itu jika memungkinkan.

  1. Apa cara terbaik untuk mendapatkan basis data besar saya (> 20GB) ke dalam file datar sehingga saya dapat menggunakannya mysqlimport?
  2. Jika itu memang SELECT ... INTO OUTFILEperintah, bagaimana cara mengekspor semua tabel dalam database (lebih disukai tanpa harus melakukan satu per satu)?
  3. Apakah ada cara yang baik untuk memastikan konsistensi selama ini?
Dan Tao
sumber
1
Ini mungkin lebih cocok untuk ServerFault; memilih untuk bermigrasi
1
Sudahkah Anda mencobanya - hanya ingin tahu? Saya hanya berurusan dengan database 40G menggunakan mysqldump tempo hari - hanya membutuhkan waktu. Tapi --optdefault, yang mempercepat. Saya pikir kami butuh 6 jam untuk memuat ulang ke server yang kuat, tetapi transisi adalah transisi ... :)
gahooa
@ gahooa: Pertanyaan bagus. Saya belum mencobanya, terutama karena sepertinya dari dokumentasi Amazon itu tidak direkomendasikan. Tapi saya bisa saja melanjutkan dan melakukan itu.

Jawaban:

5

Saya baru-baru ini menghabiskan banyak waktu untuk mencari tahu transisi 15GB ke RDS. Akhirnya menemukan skrip di salah satu forum amazon yang saya modifikasi untuk saya gunakan sendiri dan tampaknya berfungsi dengan baik. Saya tidak yakin apakah Anda dapat melakukan transaksi tunggal, tetapi dump itu sendiri sangat cepat dibandingkan dengan transfer yang sebenarnya. Saya pikir 15GB hanya membutuhkan waktu 12 menit untuk dibuang, jadi meskipun tidak memiliki opsi transaksi tunggal, saya tidak berpikir Anda akan memiliki rentang waktu yang sangat lama untuk terjadinya inkonsistensi. Saya tidak yakin apakah itu cukup baik untuk Anda, tetapi saya menemukan solusinya jauh lebih anggun daripada metode flat file.

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