2012-03-30 41 views
5

Tôi đang làm việc trên một dự án mà chúng tôi bắt buộc phải sử dụng "ghi nhật ký giao dịch" trong DBMS (MySQL) của chúng tôi. Chúng tôi đã chuyển sang sử dụng InnoDB để sử dụng các giao dịch cho một yêu cầu khác. Tôi đang cố gắng hiểu được nhật ký giao dịch là gì. Tôi đã tìm kiếm hơn một ngày nay, bao gồm đọc qua tài liệu MySQL. Có lẽ tôi chỉ không tìm kiếm các từ khóa đúng, tôi không chắc chắn. Hoặc có thể "ghi nhật ký giao dịch" là thuật ngữ không phù hợp.Ghi nhật ký giao dịch MySQL

Từ những gì tôi hiểu, nhật ký giao dịch cơ sở dữ liệu tương tự như hệ thống tệp nhật ký trong những thay đổi được thực hiện cho một tạp chí trước khi chúng được cam kết với hệ thống tệp. Từ những gì tôi đã đọc, có vẻ như động cơ InnoDB lưu trữ các giao dịch trong một số loại tạp chí trước khi chúng được cam kết vào đĩa. Điều này có chính xác không? Nếu vậy, đâu là nhật ký giao dịch? Có phải ib_logfile0 và ib_logfile1 không?

Trả lời

9

Bạn chắc chắn đang đi đúng hướng ở đây.

Bất cứ khi nào InnoDB thực hiện một giao dịch phải được cam kết, nó được thực hiện như một cam kết hai pha. Giao dịch được viết trong các nhật ký này trước tiên. Sau đó, họ cam kết từ đó.

Điều này giúp ích rất nhiều trong trường hợp xảy ra sự cố hoặc sự cố máy chủ MySQL.

Khi bạn khởi động lại mysql, tất cả các mục bị giam trong ib_logfile0 và ib_logfile1 được tái hiện lại như một phần của sự phục hồi sụp đổ của InnoDB để mang lại InnoDB sang trạng thái hài hòa (Đây là Phù hợp và các bộ phận Durable của ACID Compliance)

Nếu bạn xóa ib_logfile0 và ib_logfile1 và bắt đầu mysql, bất kỳ giao dịch không được cam kết nào mà các tệp đó chứa bị mất. Trong chu kỳ khôi phục sự cố, nếu các tệp nhật ký bị thiếu, chúng sẽ được tạo lại dựa trên cài đặt innodb_log_file_size.

Vui lòng xem MySQL Documentation for a detailed explanation of InnoDB.

@karatedog phần MVCC của InnoDB xảy ra trong vùng bảng hệ thống, tốt hơn được gọi là ibdata1. Bất kỳ dữ liệu nào xuất hiện trước khi bắt đầu giao dịch được ghi lại để cho phép những người khác truy cập vào các hàng cần thiết để có chế độ xem dữ liệu trước khi bất kỳ cập nhật nào được áp dụng. Điều này cho phép những gì được gọi là một REPEATABLE-READ. Điều này nằm dưới I của ACID tuân thủ, tôi có nghĩa là cô lập. Tôi đã viết bài về điều này trong DBA StackExchange liên quan đến các kịch bản khác nhau, nơi cô lập giao dịch là tốt, xấu, hoặc xấu xí.

Đối với MyISAM, crash recovery is not automatic. It crashes rather easily. Đó là lý do tại sao lệnh SQL REPAIR TABLE tồn tại. Đó cũng là lý do tại sao tiện ích MySQL myisamchk có tùy chọn -r để thực hiện REPAIR TABLE cho các bảng MyISAM không trực tuyến.

MariaDB and Aria đã cố gắng tạo một công cụ lưu trữ an toàn cho sự cố để thay thế cho MyISAM.

+0

Tôi hiểu rằng các tệp nhật ký này dành cho khôi phục sự cố nhưng cơ chế MVCC không chịu trách nhiệm về "giao dịch" xảy ra đúng khi không xảy ra sự cố? MyISAM có một số mức độ phục hồi sự cố trong khi nó không có giao dịch nào cả. – karatedog

+0

Cảm ơn bạn đã phản hồi chi tiết và kịp thời. Tôi hơi bối rối về việc phát lại các mục nhập trong nhật ký.Nếu có sự thất bại ở giữa giao dịch, trước khi giao dịch được phát hành, tôi cho rằng bạn sẽ không muốn phát lại các mục nhập vì giao dịch là tất cả hoặc không có gì (bạn sẽ không muốn một phần giao dịch được cam kết). Hoặc là bạn nói rằng họ sẽ được phát lại chỉ khi có một cam kết, nhưng sự thất bại xảy ra trước khi giao dịch được cam kết với cơ sở dữ liệu, nhưng sau khi nó được lưu trong các tệp nhật ký? – alfredough

Các vấn đề liên quan