Tất cả dữ liệu là InnoDB
Đây là những gì sẽ cung cấp cho bạn một ảnh chụp nhanh thời gian chính xác của dữ liệu:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
tạo một điểm kiểm tra cho phép bãi chứa để thu thập tất cả dữ liệu trước điểm kiểm tra trong khi nhận được các thay đổi đến. Những thay đổi đến không trở thành một phần của bãi chứa. Điều đó đảm bảo cùng một thời điểm cho tất cả các bảng.
--routines
bỏ tất cả các thủ tục được lưu trữ và các chức năng được lưu trữ
--triggers
bỏ tất cả các kích hoạt cho mỗi bảng có chúng
Tất cả dữ liệu là MyISAM hoặc Mix of InnoDB / MyISAM
Bạn sẽ phải áp dụng khóa đọc toàn cầu, thực hiện mysqldump và phát hành khóa toàn cầu
mysql -uuser -ppass -Ae"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" &
sleep 5
mysql -uuser -ppass -ANe"SHOW PROCESSLIST" | grep "SELECT SLEEP(86400)" > /tmp/proclist.txt
SLEEP_ID=`cat /tmp/proclist.txt | awk '{print $1}'`
echo "KILL ${SLEEP_ID};" > /tmp/kill_sleep.sql
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
mysql -uuser -ppass -A < /tmp/kill_sleep.sql
Hãy thử một lần !!!
CẬP NHẬT 2012-06-22 08:12 EDT
Vì bạn có <50 MB tổng dữ liệu nên tôi có một tùy chọn khác. Thay vì khởi chạy lệnh SLEEP vào nền để giữ khóa đọc toàn cầu trong 86400 giây (tức là 24 giờ) chỉ để lấy ID tiến trình và tiêu diệt bên ngoài, hãy thử đặt thời gian chờ 5 giây trong mysql thay vì trong HĐH:
SLEEP_TIMEOUT=5
SQLSTMT="FLUSH TABLES WITH READ LOCK; SELECT SLEEP(${SLEEP_TIMEOUT})"
mysql -uuser -ppass -Ae"${SQLSTMT}" &
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
Đây là một cách tiếp cận sạch hơn và đơn giản hơn cho các cơ sở dữ liệu rất nhỏ.