Quy trình làm việc DDL giao dịch cho MySQL


25

Tôi hơi ngạc nhiên khi phát hiện ra rằng các tuyên bố DDL ( alter table, create indexv.v.) hoàn toàn cam kết giao dịch hiện tại trong MySQL. Đến từ MS SQL Server, khả năng thực hiện thay đổi cơ sở dữ liệu trong giao dịch cục bộ (sau đó được khôi phục) là một phần quan trọng trong quy trình làm việc của tôi. Để tích hợp liên tục, rollback được sử dụng nếu di chuyển bị trục trặc vì bất kỳ lý do nào, do đó ít nhất chúng tôi không để cơ sở dữ liệu ở trạng thái nửa di chuyển.

Làm thế nào để mọi người giải quyết hai vấn đề này khi sử dụng MySQL với việc di chuyển và tích hợp liên tục?


Cross đăng từ SO. stackoverflow.com/q/28197013/614523 Không nhận được nhiều tình yêu ở đó.
sennett 2/2/2015

1
Để tích hợp liên tục, hãy xem Ảnh chụp nhanh LVM như một cách rất nhanh chóng tạo ra toàn bộ môi trường ở trạng thái đã biết.
Rick James

5
Bạn luôn có thể nâng cấp lên Postgres - nó hỗ trợ DDL giao dịch (SCNR).
a_horse_with_no_name

3
Tôi đồng ý với @a_horse_with_no_name, nếu đây là quy trình làm việc của bạn, hãy xem xét nghiêm túc việc sử dụng PosgreQuery, có DDL giao dịch cùng với nhiều tính năng hay khác.
Renzo

Câu trả lời:


9

Đố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

Hướng dẫn nghiên cứu chứng chỉ MySQL 5.0

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/COMMITcá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)

Hệ thống nước InnoDB

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

    1. Chạy SET GLOBAL innodb_fast_shutdown = 0;
    1. Chạy SET GLOBAL innodb_max_dirty_pages_pct = 0;
    1. Chạy SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
    1. 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
    1. service mysql stop
    1. Chụp ảnh nhanh LVM
    1. 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

    1. Chạy SET GLOBAL innodb_max_dirty_pages_pct = 0;
    1. Chạy SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
    1. 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
    1. Chụp ảnh nhanh LVM
    1. 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

    1. Chạy SET GLOBAL innodb_fast_shutdown = 0;
    1. Chạy SET GLOBAL innodb_max_dirty_pages_pct = 0;
    1. Chạy SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
    1. 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
    1. service mysql stop
    1. Chụp ảnh nhanh LVM
    1. 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

    1. Chạy SET GLOBAL innodb_max_dirty_pages_pct = 0;
    1. Chạy SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
    1. 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
    1. Chạy FLUSH TABLES innodb_tbl1,... FOR EXPORT;trên các bảng InnoDB quan trọng
    1. Chạy FLUSH TABLES WITH READ LOCK;
    1. Chụp ảnh nhanh LVM
    1. Chạy UNLOCK TABLES;
    1. 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.

4

Nếu bạn nói về tích hợp liên tục thì tôi cho rằng đó là môi trường phát triển. Trong trường hợp đó tôi sẽ nói rằng người thực hiện thay đổi cấu trúc phải kiểm tra chúng để đảm bảo không phá vỡ mọi thứ cho người khác, giống như cách ai đó cập nhật thư viện chung: Kiểm tra trong hộp cát của riêng bạn trước khi thực hiện các thay đổi đó.

Trong quy trình triển khai sản xuất, bạn thường sẽ trải qua các môi trường dev, QA hoặc thậm chí tiền sản xuất để kiểm tra các thay đổi của mình, giống như cách bạn thực hiện đối với bất kỳ thay đổi mã nào.

Lưu ý rằng đây không phải là cụ thể của MySQL: Cơ sở dữ liệu Oracle cũng sẽ ngầm thực hiện CAM KẾT khi ban hành 'bảng thay đổi', v.v.

Bây giờ nếu bạn muốn tự bảo vệ mình, tất nhiên bạn có thể thực hiện sao lưu trước hoặc chụp nhanh LVM hoặc hệ thống tập tin nếu hệ thống của bạn có thể làm điều đó. Bạn cũng có thể có một nô lệ mà bạn có thể trì hoãn / dừng làm bảo mật trước các hoạt động nhạy cảm.

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.