Có an toàn không khi sử dụng innodb_flush_log_at_trx_commit = 2


54

Tôi quay lại innodb_flush_log_at_trx_commit = 2và nhận được một tốc độ viết rất nhanh. Nhưng nó có an toàn được sử dụng trong trang web sản xuất?

Câu trả lời:


57

Bạn có thể mất tới một giây giao dịch. Giá trị mặc định là 1, giúp tuân thủ InnoDB ACID .

Theo Tài liệu MySQL trên innodb_flush_log_at_trx_commit

Nếu giá trị của innodb_flush_log_at_trx_commit là 0, bộ đệm nhật ký được ghi ra tệp nhật ký một lần mỗi giây và thao tác xả vào đĩa được thực hiện trên tệp nhật ký, nhưng không có gì được thực hiện tại một cam kết giao dịch. Khi giá trị là 1 (mặc định), bộ đệm nhật ký được ghi ra tệp nhật ký tại mỗi lần giao dịch và thao tác tuôn ra đĩa được thực hiện trên tệp nhật ký. Khi giá trị là 2, bộ đệm nhật ký được ghi ra tệp tại mỗi lần xác nhận, nhưng thao tác tuôn ra đĩa không được thực hiện trên nó. Tuy nhiên, việc xả vào tệp nhật ký cũng diễn ra một lần mỗi giây khi giá trị là 2. Lưu ý rằng việc xả một lần mỗi giây không được đảm bảo 100% xảy ra mỗi giây, do các vấn đề lập lịch xử lý.

Giá trị mặc định là 1 là bắt buộc để tuân thủ ACID đầy đủ. Bạn có thể đạt được hiệu suất tốt hơn bằng cách đặt giá trị khác với 1, nhưng sau đó bạn có thể mất tối đa một giây giao dịch trong một vụ tai nạn. Với giá trị 0, bất kỳ sự cố quá trình mysqld nào cũng có thể xóa giây cuối cùng của giao dịch. Với giá trị là 2, chỉ một sự cố hệ điều hành hoặc mất điện mới có thể xóa đi giây cuối cùng của giao dịch. Phục hồi sự cố của InnoDB hoạt động bất kể giá trị.

Để có độ bền và tính nhất quán cao nhất có thể trong thiết lập sao chép bằng InnoDB với các giao dịch, hãy sử dụng innodb_flush_log_at_trx_commit = 1 và sync_binlog = 1 trong tệp my.cnf của máy chủ chính của bạn.

Thận trọng

Nhiều hệ điều hành và một số phần cứng đĩa đánh lừa hoạt động tuôn ra đĩa. Họ có thể nói với mysqld rằng việc xả nước đã diễn ra, mặc dù điều đó không xảy ra. Sau đó, độ bền của các giao dịch không được đảm bảo ngay cả với cài đặt 1 và trong trường hợp xấu nhất, mất điện thậm chí có thể làm hỏng cơ sở dữ liệu InnoDB. Sử dụng bộ đệm đĩa được hỗ trợ bằng pin trong bộ điều khiển đĩa SCSI hoặc trong chính đĩa sẽ tăng tốc độ xả tệp và giúp thao tác an toàn hơn. Bạn cũng có thể thử sử dụng lệnh Unix hdparm để vô hiệu hóa bộ nhớ đệm của đĩa ghi trong bộ nhớ cache phần cứng hoặc sử dụng một số lệnh khác dành riêng cho nhà cung cấp phần cứng.

Dựa trên điều này, các giá trị khác 1 khiến InnoDB có nguy cơ mất các giao dịch trị giá 1 giây hoặc giá trị dữ liệu của một cam kết giao dịch.

Các tài liệu cũng nói sử dụng sync_binlog=1.

Theo Tài liệu MySQL trên sync_binlog

Giá trị 1 là lựa chọn an toàn nhất vì trong trường hợp xảy ra sự cố, bạn mất tối đa một tuyên bố hoặc giao dịch từ nhật ký nhị phân. Tuy nhiên, nó cũng là lựa chọn chậm nhất (trừ khi đĩa có bộ đệm được hỗ trợ bằng pin, giúp đồng bộ hóa rất nhanh).

Sự lựa chọn an toàn nhất của bạn là

[mysqld]
innodb_flush_log_at_trx_commit=1
sync_binlog=1

Nếu bạn không bận tâm đến việc mất dữ liệu (giá trị lên tới 1 giây) thì bạn có thể tự chịu rủi ro 0 hoặc 2 nếu phần thưởng (tốc độ ghi nhanh hơn) có giá trị.


3
Rolando: +1 cho vài dòng cuối cùng sync_binlog = 1 ...
Abdul Manaf

@AbdulManaf, Luôn luôn đảm bảo tính toàn vẹn dữ liệu hơn tốc độ. Nếu bạn muốn hy sinh tốc độ cho tính toàn vẹn dữ liệu, bạn sẽ thấy mình mất nhiều thời gian hơn để xử lý các vấn đề về dữ liệu.
Pacerier

1
@RolandoMySQLDBA, Bằng cách "mất giá trị giao dịch thứ hai", bạn có nghĩa là một thành công commit thực sự có thể bị mất?
Pacerier

1
Pacerier, vâng. Dữ liệu chỉ được đảm bảo ghi vào đĩa sau khi được "xóa vào đĩa". Cho đến lúc đó nó chỉ có thể trong bộ nhớ RAM.
Emil Vikström

2
@RolandoMySQLDBA bạn là người đàn ông, nghiêm túc. Nếu bạn làm bất cứ điều gì khác ngoài hợp đồng tư vấn mysql toàn thời gian, bạn có thể nên thay đổi con đường sự nghiệp của mình.
sjas

25

Các innodb_flush_log_at_trx_commitđược sử dụng với mục đích như ..

Nếu giá trị innodb_flush_log_at_trx_commit là 0, bộ đệm nhật ký được ghi ra tệp nhật ký một lần mỗi giây và thao tác tuôn ra đĩa được thực hiện trên tệp nhật ký, nhưng không có gì được thực hiện tại một cam kết giao dịch.

Khi giá trị là 1 (mặc định), bộ đệm nhật ký được ghi ra tệp nhật ký tại mỗi lần giao dịch và thao tác tuôn ra đĩa được thực hiện trên tệp nhật ký.

Khi giá trị là 2, bộ đệm nhật ký được ghi ra tệp tại mỗi lần xác nhận, nhưng thao tác tuôn ra đĩa không được thực hiện trên nó. Tuy nhiên, việc xả vào tệp nhật ký cũng diễn ra một lần mỗi giây khi giá trị là 2. Lưu ý rằng việc xả một lần mỗi giây không được đảm bảo 100% xảy ra mỗi giây, do các vấn đề lập lịch xử lý.

Giá trị mặc định là 1 là bắt buộc để tuân thủ ACID đầy đủ. Bạn có thể đạt được hiệu suất tốt hơn bằng cách đặt giá trị khác với 1, nhưng sau đó bạn có thể mất tối đa một giây giao dịch trong một vụ tai nạn. Với giá trị 0, bất kỳ sự cố quá trình mysqld nào cũng có thể xóa giây cuối cùng của giao dịch. Với giá trị là 2, chỉ một sự cố hệ điều hành hoặc mất điện mới có thể xóa đi giây cuối cùng của giao dịch. Phục hồi sự cố của InnoDB hoạt động bất kể giá trị.

Theo ý kiến ​​của tôi, sử dụng innodb_flush_log_at_trx_commitđến 2 không phải là một vấn đề. Nhưng để sử dụng 1 là an toàn nhất.


3
Tôi chỉ nhận thấy rằng bạn trả lời chỉ 18 giây sau tôi với câu trả lời cơ bản giống nhau. +1 !!!
RolandoMySQLDBA

24

Ý kiến ​​của tôi khác với khác. innodb_flush_log_at_trx_commit = 0 nếu: đó là máy tính phát triển của tôi hoặc cơ sở dữ liệu nhỏ tại nhà không có dữ liệu nhạy cảm.

innodb_flush_log_at_trx_commit = 2 nếu: đó là blog / thống kê / thương mại điện tử (với ~ 100x cửa hàng trong ngày), v.v.

innodb_flush_log_at_trx_commit = 1 nếu: bạn có rất nhiều khách hàng hoặc bạn cần phải làm việc với giao dịch tiền như ngân hàng. vì vậy lần này bạn nên phân chia luồng dữ liệu của mình giữa một số máy chủ để có tốc độ và an toàn.

Tôi thích 2, vì nó có tốc độ ghi nhanh hơn ~ 75 lần và CHỈ bị lỗi nếu phần cứng bị lỗi.

Dù sao, bạn nên biết những gì bạn cần nhiều hơn tốc độ viết hoặc lên đến 1 giây thông tin?


1
+1 cho75x faster write speed and it fails ONLY if hardware fails.
Naman Gala

3
Nhanh hơn 75 lần? Cần dẫn nguồn.
Pacerier

5
Điểm chuẩn của riêng tôi: 5000 UPDATEvới innodb_flush_log_at_trx_commit = 1: 179 giây. Với innodb_flush_log_at_trx_commit = 2: 1,12 giây. Đó là tốc độ ghi nhanh hơn 160 lần trong trường hợp của tôi.
Kevin

Câu trả lời tốt. Một điều cần nghĩ là - nếu máy của bạn gặp sự cố sau khi giao dịch thành công, rất có thể giao dịch đó không được ghi vào đĩa với innodb_flush_log_at_trx_commit = 2, và thành công đã được chỉ ra cho ứng dụng của bạn (ví dụ: mysqld quản lý để gửi gói mạng thành công với người lái xe trong ứng dụng của bạn), cơ hội đó rất thấp
Vladislav Vaintroub

bạn có thể giới thiệu câu trả lời của mình bằng cách chỉ định tài liệu có nghĩa là gìcrash
shareef 20/03/18

2

Tôi đang cố gắng trả lời, mục đích của innodb_flush_log_at_trx_commit?

InnoDB thực hiện hầu hết các hoạt động của nó tại bộ nhớ ( InnoDB Buffer Pool). Al dữ liệu đã sửa đổi được ghi vào InnoDB transaction log filevà sau đó xóa (ghi) để lưu trữ lâu bền (đĩa cứng).

Để an toàn dữ liệu ( Durability from ACID), InnoDB phải lưu trữ dữ liệu đã sửa đổi của từng giao dịch vào một bộ lưu trữ vĩnh viễn. Đồng thời, cam kết vào đĩa cho mỗi giao dịch là quá trình tốn kém.

Đĩa I / O là một quá trình chặn và nó rất chậm, nó là một đĩa chậm, hơn nữa nó sẽ làm giảm số lượng InnoDB transaction per seconds(Thông lượng đĩa).

InnoDB cung cấp, innodb_flush_log_at_trx_commitbiến để kiểm soát tần suất của hoạt động tuôn ra này. Dựa trên giá trị, hoạt động tuôn ra của InnoDB hoạt động khác nhau.

(Đã được giải thích trong các câu trả lời khác)

0 - Ghi vào tệp nhật ký và xóa vào đĩa mỗi giây (dữ liệu nằm trong vùng đệm không được ghi vào tệp nhật ký - để đạt được hiệu suất). 1 - Xả vào đĩa khi giao dịch được thực hiện - mặc định (Vì an toàn dữ liệu - Tuân thủ ACID) 2 - ghi vào tệp nhật ký cho mỗi giao dịch và xả vào đĩa mỗi giây. (Để đạt được hiệu suất)

Tùy thuộc vào yêu cầu ứng dụng ( Performance Vs data safety), bạn có thể đặt biến này. Sự khác biệt giữa 0 và 2 - cả hai sẽ tăng hiệu suất, giá trị 2 lưu trữ dữ liệu trong tệp giao dịch và có thể phục hồi được, trong trường hợp gặp sự cố hoặc thất bại, nhưng không phải là 0.

Trong nhiều trường hợp, tuôn ra đĩa là phương tiện, dữ liệu được ghi từ InnoDB buffer pool (memory) to Operating systems cachekhông thực sự được ghi vào đĩa lưu trữ (lưu trữ vĩnh viễn). Trong trường hợp thất bại, trong trường hợp xấu nhất, bạn có thể mất dữ liệu tối đa một giây)

Hiệu suất đạt được phụ thuộc vào môi trường và bạn có thể điểm chuẩn và xác định. Trong một môi trường nhân rộng, để đảm bảo an toàn và nhất quán dữ liệu, hãy đặt innodb_flush_log_trx_commit = 1sync_binlog=1.

Nếu hiệu suất là mục tiêu chính của ứng dụng, InnoDB cung cấp một biến để kiểm soát tần suất xả nhật ký - innodb_flush_log_at_timeout- cho phép bạn đặt dải tần số xả nhật ký từ 1 to 2700 seconds, theo mặc định, đó là 1.

Xin lưu ý, khi bạn tăng khoảng thời gian xả lên tới N giây, hiệu suất đạt được đi kèm với sự thỏa hiệp về an toàn dữ liệu lên đến N giây. Ví dụ: nếu bạn đặt xả nước xảy ra cứ sau 5 giây - mức tăng thông lượng rất cao, nhưng trong trường hợp mất điện hoặc sự cố hệ thống, bạn sẽ mất dữ liệu trị giá 5 giây.

Bài viết này thảo luận về hoạt động xả rửa và giao dịch cam kết của InnoDB .

Bạn có thể thay đổi sau khi bạn thực hiện chế độ 2 trên aws rds:

có thể thay đổi sau khi bạn thực hiện chế độ 2 trên aws

xem trước

Không thể thay đổi trong một số trường hợp như nếu bạn có bản sao đa az:

FYI không thể thay đổi trong một số trường hợp


1

Nếu phần cứng của bạn bị lỗi, bạn có thể mất tất cả dữ liệu của mình, vì vậy tôi sử dụng param = 2 mà không phải lo lắng gì. Dù sao, bạn có thể phân chia dữ liệu nhạy cảm (thứ tự, tiền ảo, ...) và dữ liệu thông thường (thống kê, giỏ hàng, ...) giữa 2 máy chủ db và giữ chúng an toàn và nhanh chóng. Đối với các giao dịch giữa các cơ sở dữ liệu, bạn có thể sử dụng http://dev.mysql.com/doc/refman/5.7/en/xa.html


"Mất tất cả dữ liệu của bạn", hoặc bạn có nghĩa là các giao dịch đã được truy vấn trong vài giây qua hoặc lâu hơn?
NiCk Newman

1
Lỗi phần cứng có thể có nghĩa là mất toàn bộ ổ cứng, do đó "mất tất cả dữ liệu của bạn". Vì vậy, trừ khi bạn có một thiết lập sao chép, dữ liệu của bạn không được chú ý về mức độ thường xuyên bạn thực hiện sao lưu, vì vậy điểm mà câu trả lời này đưa ra là một hoặc hai dữ liệu bị mất không có gì đáng lo ngại khi so sánh
thomasrutter
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.