Đối với nhiều người, gót chân của MySQL Achilles là cam kết ngầm.
Theo trang 3, đoạn 3 của cuốn sách
các lệnh sau có thể và sẽ phá vỡ một giao dịch
ALTER TABLE
BEGIN
CREATE INDEX
DROP DATABASE
DROP INDEX
DROP TABLE
RENAME TABLE
TRUNCATE TABLE
LOCK TABLES
UNLOCK TABLES
SET AUTOCOMMIT = 1
START TRANSACTION
GỢI Ý
Khi nói đến MySQL, mọi công việc liên tục (CI) / Tự phục vụ mà bạn xây dựng phải luôn tạo các công việc Giao dịch và tập lệnh DDL loại trừ lẫn nhau.
Điều này cho bạn cơ hội để tạo ra các mô hình mà sẽ
- hỗ trợ các giao dịch được cách ly đúng cách với
START TRANSACTION/COMMIT
các khối
- kiểm soát DDL bằng cách tự viết kịch bản DDL, chạy DDL như là hàm tạo hoặc hàm hủy
- Trình xây dựng: DDL để tạo bảng với thiết kế mới
- Destructor: DDL để làm cho các bảng hoàn nguyên trở lại thiết kế trước đó
- không bao giờ kết hợp các hoạt động này dưới một công việc
CẢNH BÁO: Nếu bạn đang sử dụng MyISAM cho bất kỳ điều này, bạn có thể (không) vui lòng thêm MyISAM vào danh sách những điều có thể phá vỡ giao dịch, có thể không phải là về cam kết ngầm, nhưng chắc chắn về mặt thống nhất dữ liệu nên được khôi phục cần thiết
TẠI SAO KHÔNG LVM?
Ảnh chụp nhanh LVM là tuyệt vời và khôi phục toàn bộ phiên bản cơ sở dữ liệu mà không phải thực hiện xử lý SQL nặng là lý tưởng. Tuy nhiên, khi nói đến MySQL, bạn phải tính đến hai công cụ lưu trữ: InnoDB và MyISAM.
Cơ sở dữ liệu All-InnoDB
Nhìn vào Kiến trúc của InnoDB (Hình ảnh lịch sự của Percona CTO Vadim Tkachenko)
InnoDB có nhiều bộ phận chuyển động
- Không gian bảng hệ thống
- Từ điển dữ liệu
- Double Write Buffer (hỗ trợ tính nhất quán dữ liệu; được sử dụng cho Crash Recovery)
- Chèn bộ đệm (Bộ đệm thay đổi thành chỉ mục không duy nhất thứ cấp)
- Phân đoạn rollback
- Hoàn tác không gian (nơi tăng trưởng không kiểm soát nhất có thể xảy ra)
- Bể đệm InnoDB
- Trang dữ liệu bẩn
- Trang chỉ mục bẩn
- Thay đổi chỉ mục NonUnique
- Bộ nhớ cache quan trọng khác
Chụp ảnh nhanh LVM của cơ sở dữ liệu toàn bộ InnoDB với các thay đổi không được cam kết trôi nổi trong Bộ đệm và bộ nhớ đệm sẽ mang lại một bộ dữ liệu yêu cầu khôi phục sự cố InnoDB khi LUN được khôi phục và mysqld bắt đầu.
BỀN VỮNG CHO TẤT CẢ-InnoDB
Nếu bạn có thể tắt MySQL trước khi chụp ảnh
- Chạy
SET GLOBAL innodb_fast_shutdown = 0;
- Chạy
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- Chạy
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- Lặp lại Bước 3 cho đến khi Innodb_buffer_pool_pages_denty bằng 0 hoặc càng gần 0 càng tốt
service mysql stop
- Chụp ảnh nhanh LVM
service mysql stop
Nếu bạn không thể tắt máy nhưng hãy chụp nhanh với MySQL Live
- Chạy
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- Chạy
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- Lặp lại Bước 2 cho đến khi Innodb_buffer_pool_pages_denty bằng 0 hoặc càng gần 0 càng tốt
- Chụp ảnh nhanh LVM
- Chạy
SET GLOBAL innodb_max_dirty_pages_pct = 75;
Cơ sở dữ liệu All-MyISAM hoặc InnoDB / MyISAM Mix
MyISAM, khi được truy cập, sẽ duy trì số lượng tệp xử lý mở đối với nó. Nếu MySQL gặp sự cố, bất kỳ bảng MyISAM nào có số lần xử lý tệp mở> 0 sẽ được đánh dấu là sự cố và cần sửa chữa (ngay cả khi không có gì sai với dữ liệu).
Chụp ảnh chụp nhanh LVM của cơ sở dữ liệu có các bảng MyISAM đang sử dụng sẽ có một hoặc nhiều bảng MyISAM cần sửa chữa khi ảnh chụp nhanh được khôi phục và mysqld bắt đầu.
TUYỆT VỜI CHO All-MyISAM hoặc InnoDB / MyISAM Mix
Nếu bạn có thể tắt MySQL trước khi chụp ảnh
- Chạy
SET GLOBAL innodb_fast_shutdown = 0;
- Chạy
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- Chạy
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- Lặp lại Bước 3 cho đến khi Innodb_buffer_pool_pages_denty bằng 0 hoặc càng gần 0 càng tốt
service mysql stop
- Chụp ảnh nhanh LVM
service mysql stop
Nếu bạn không thể tắt máy nhưng hãy chụp nhanh với MySQL Live
Bạn có thể thực thi một số bảng InnoDB nhất định
- Chạy
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- Chạy
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- Lặp lại Bước 2 cho đến khi Innodb_buffer_pool_pages_denty bằng 0 hoặc càng gần 0 càng tốt
- Chạy
FLUSH TABLES innodb_tbl1,... FOR EXPORT;
trên các bảng InnoDB quan trọng
- Chạy
FLUSH TABLES WITH READ LOCK;
- Chụp ảnh nhanh LVM
- Chạy
UNLOCK TABLES;
- Chạy
SET GLOBAL innodb_max_dirty_pages_pct = 75;
Bản sao MySQL có thể giúp?
Mặc dù bạn có thể khôi phục một ảnh chụp nhanh LVM cho hai máy chủ và thiết lập Bản sao Master / Slave của MySQL, nhưng đó sẽ trở thành một nguồn bổ sung cho việc lưu trữ khi khôi phục các ảnh chụp nhanh.
Nếu bạn chạy các công việc CI trên Master và những công việc đó nhỏ, nhân rộng có thể là một công cụ tiết kiệm thời gian trong những trường hợp nhất định. Bạn chỉ có thể chạy STOP SLAVE;
trên Slave, khởi động các công việc CI trên Master và chạy START SLAVE;
trên Slave khi dữ liệu của Master được chứng nhận.
Nếu công việc CI cảnh báo quá nhiều dữ liệu, bạn có thể khôi phục ảnh chụp nhanh LVM và thiết lập sao chép từ đầu. Nếu bạn thấy mình làm điều này thường xuyên, có lẽ bạn có thể làm với việc thiết lập Bản sao MySQL.
Ý TƯỞNG CUỐI CÙNG
- Tốt nhất là sử dụng nhiều Máy chủ DB (3 hoặc nhiều hơn) để thực hiện khôi phục và kiểm tra hồi quy.
- Chuyển đổi các bảng MyISAM còn lại thành InnoDB nếu các bảng đó không cần duy trì MyISAM.
- Nếu nội dung dữ liệu của bạn nhạy cảm, bạn nên thực hiện công việc CI để xóa dữ liệu sau khi khôi phục ảnh chụp nhanh trước khi bắt đầu bất kỳ thử nghiệm nào. Thay vào đó, bạn có thể muốn chụp ảnh nhanh MySQL với dữ liệu đã được xóa.