Các bảng InnoDB có bị khóa trong mysqldump khi trộn với MyISAM không?


9

Tôi đang tìm kiếm một giải pháp sao lưu cho các máy chủ mysql của mình và tôi cần càng ít thời gian chết càng tốt. Tôi có những điều sau đây:

  • Máy chủ MySQL
  • chúng không được nhân rộng
  • mỗi máy chủ là viết tắt của riêng nó

Con số này có thể tăng lên, vì vậy thiết lập một bản sao chính / nô lệ sẽ không phải là một ý tưởng hay.

Cách sao lưu dễ dàng nhất như tôi thấy là sử dụng mysqldump với một phần mềm như "automysqlbackup". Dữ liệu quan trọng nhất của tôi sử dụng InnoDB. Bảng InnoDB của tôi khá nặng.

Câu hỏi là: Nếu tôi thực hiện một mysqldump cho tất cả các cơ sở dữ liệu trong máy chủ, nó có khóa các bảng Innodb của tôi không?

Câu trả lời:


7

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>;


5

mysqldump --single-transactionkhông khóa bảng nhưng bảng MyISAM không được đảm bảo có các bãi phù hợp với tùy chọn này. Sử dụng tốt hơn mydumper, mydumperkhóa các bảng MyISAM và không khóa InnoDB để kết xuất phù hợp.


Wow, cảm ơn vì công cụ tuyệt vời này! Bạn có quen thuộc với một công cụ có thể tự động sao lưu hàng ngày, hàng tuần, hàng tháng với mydumper không? Một cái gì đó như "automysqlbackup", chỉ với mydumper? Cảm ơn.
tounano

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.