mysqldumps với InnoDB và MyISAM cùng được coi là loại trừ lẫn nhau. Đây là lý do tại sao:
Nếu bạn có thể đăng nhập vào mysql trong khi tiến hành mysqldump, bạn sẽ thấy một cái gì đó như thế này:
SELECT /* SQL_NO_CACHE */ * FROM tblname
Theo mặc định, mysqldump sẽ làm như sau:
- Mọi cơ sở dữ liệu được kết xuất theo thứ tự bảng chữ cái
- Mỗi bảng được đổ cho mỗi cơ sở dữ liệu được kết xuất theo thứ tự bảng chữ cái (bất kể công cụ lưu trữ)
Điều này sẽ tốt cho Trường hợp MySQL không có hoạt động cơ sở dữ liệu khác. Các bảng InnoDB và các bảng MyISAM không ảnh hưởng lẫn nhau.
Việc sử dụng --single-transaction
đối với Trường hợp MySQL toàn InnoDB tạo ra một điểm kiểm tra và kết xuất tất cả các bảng từ cùng một thời điểm. Khi gặp bảng MyISAM, tất cả các cược đã tắt. Nó có thể khiến tất cả các bảng InnoDB sau MyISAM bị đổ từ một thời điểm khác.
Để có kết xuất theo thời gian nhất quán cho hỗn hợp InnoDB và MyISAM, bạn có các tùy chọn
LỰA CHỌN 1
Khởi động lại mysql để không ai khác có thể đăng nhập qua TCP / IP và sau đó mysqldump
service mysql restart --skip-networking --skip-grant-tables
mysqldump --routines --triggers --all-databases > MySQLData.sql
service mysql restart
LỰA CHỌN 2
Nếu tất cả các bảng MyISAM chỉ để đọc, chỉ cần mysqldump sử dụng --single-giao dịch
TÙY CHỌN # 3
Nếu bất kỳ bảng MyISAM nào đang được viết, - giao dịch đơn lẻ là không đủ
Bạn sẽ làm như sau:
mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)"
sleep 30
mysqldump --routines --triggers --all-databases > MySQLData.sql
Ngay sau khi hoàn thành mysqldump, đăng nhập vào mysql và làm show processlist;
. Tìm truy vấn SELECT SLEEP(86400)
, tìm ID tiến trình và chạyKILL <procidnumn>;