Làm thế nào tôi nên di chuyển một cơ sở dữ liệu MySQL lớn sang RDS?


8

Tôi đã xem xét điều này một chút. Tôi nhận thấy có những câu hỏi tương tự trên Stack Overflow và chính Amazon cũng có một tài liệu hữu ích đưa ra lời khuyên ở đây:

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

Mối quan tâm của tôi là như sau:

Amazon khuyên bạn mysqldumpchỉ nên sử dụng cho "số lượng nhỏ dữ liệu" mà họ xác định là dưới 1GB. Cơ sở dữ liệu tôi dự định di chuyển là hơn 20GB.

Một điều đó là tốt đẹp về mysqldump, tuy nhiên, là nó có --single-transactioncờ, cho phép tôi để đảm bảo tình trạng DB đó là phù hợp với một điểm duy nhất trong thời gian.

Đối với lượng dữ liệu lớn hơn, khuyến nghị của Amazon là xuất cơ sở dữ liệu thành các tệp phẳng (ví dụ: CSV) và sau đó sử dụng mysqlimportđể nhập dữ liệu đó vào RDS. Cách tốt nhất mà tôi biết làm thế nào để làm điều này , tuy nhiên, là thông qua SELECT ... INTO OUTFILElệnh, chỉ hoạt động một bảng mỗi lần. Tất nhiên, nhược điểm của nó là không đảm bảo tính nhất quán --single-transaction.

Tôi cho rằng tôi có thể đảm bảo tính nhất quán bằng cách tạm thời lấy toàn bộ DB; nhưng tôi muốn tránh điều đó nếu có thể.

  1. Cách tốt nhất để đưa cơ sở dữ liệu lớn (> 20GB) của tôi vào các tệp phẳng để sau đó tôi có thể sử dụng là mysqlimportgì?
  2. Nếu nó thực sự là SELECT ... INTO OUTFILElệnh, làm thế nào để tôi xuất tất cả các bảng trong cơ sở dữ liệu (tốt nhất là không phải thực hiện cùng một lúc)?
  3. Có cách nào tốt để đảm bảo tính nhất quán trong tất cả điều này không?

1
Đây có lẽ là một sự phù hợp tốt hơn cho ServerFault; đã bình chọn để di chuyển

1
Bạn đã thử nó - chỉ tự hỏi? Tôi vừa xử lý cơ sở dữ liệu 40G bằng mysqldump vào ngày khác - chỉ mất một chút thời gian. Nhưng --optlà mặc định, làm tăng tốc mọi thứ. Tôi nghĩ rằng chúng tôi đã mất 6 giờ để tải lại vào một máy chủ mạnh, nhưng quá trình chuyển đổi là chuyển đổi ... :)
gahooa

@gahooa: Câu hỏi hay. Tôi chưa thử nó, chủ yếu là vì dường như từ tài liệu của Amazon không được khuyến nghị. Nhưng tôi có thể đi trước và làm điều đó.

Câu trả lời:


5

Gần đây tôi đã dành rất nhiều thời gian để cố gắng tìm ra quá trình chuyển đổi 15 GB sang RDS. Cuối cùng tôi đã tìm thấy một kịch bản trên một trong những diễn đàn amazon mà tôi đã sửa đổi theo cách sử dụng của riêng tôi và dường như hoạt động tốt. Tôi không chắc liệu bạn có thể thực hiện giao dịch đơn lẻ hay không, nhưng bản thân kết xuất rất nhanh so với chuyển khoản thực tế. Tôi nghĩ rằng 15 GB chỉ khiến tôi mất 12 phút để kết xuất, vì vậy ngay cả khi nó không có tùy chọn giao dịch duy nhất, tôi không nghĩ rằng bạn có một khoảng thời gian rất dài để xảy ra mâu thuẫn. Tôi không chắc là nó có đủ tốt cho bạn không, nhưng tôi thấy giải pháp này duyên dáng hơn nhiều so với phương pháp tập tin phẳng.

#!/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 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.