Thay đổi động thành innodb_flush_log_at_trx_commit


11

Điều này có liên quan đến câu hỏi này . Nó giúp có được hiệu suất tốt hơn cho các bảng InnoDB.

Theo hướng dẫn của MySQL , innodb_flush_log_at_trx_commitlà một biến động toàn cầu. Vì vậy, tôi có thể thay đổi nó bằng lệnh SET GLOBAL và nó dường như đang hoạt động.

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected

mysql> SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set

Nhưng, nó không làm cho thiết lập MySQL thực sự thay đổi. Khi tôi cập nhật my.cnf và khởi động lại máy chủ MySQL, nó đã hoạt động. Vì vậy, tôi không thể thay đổi biến toàn cầu trong thời gian chạy?

Tôi thích giá trị mặc định innodb_flush_log_at_trx_commit=1, nhưng tôi cần thay đổi nó thành 2 trước khi tôi chạy quy trình khôi phục cho cơ sở dữ liệu lớn để nhanh hơn. Nhưng khi quá trình thực hiện, tôi muốn thay đổi giá trị trở lại 1. Có thể làm điều này trong thời gian chạy không?

Tôi không có quyền truy cập vào my.cnf trên máy chủ lưu trữ được chia sẻ của mình.

Câu trả lời:


12

Mặc dù tôi đồng ý với đề nghị thay đổi của Rolando innodb_flush_method, tôi không rõ ràng 100% ý của bạn là gì:

nó không làm cho thiết lập MySQL thực sự thay đổi

Tôi muốn chỉ ra cảnh báo rằng việc thay đổi biến GLOBAL ảnh hưởng đến bất kỳ kết nối mới nào, nhưng không sửa đổi phiên hiện tại (nhấn mạnh của tôi):

Thay đổi biến toàn cục không ảnh hưởng đến biến phiên đối với bất kỳ máy khách nào hiện đang được kết nối ( thậm chí không phải là biến của máy khách phát hành câu lệnh SET GLOBAL ).

Vì vậy, để kiểm tra rằng:

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)


mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> connect;
Connection id:    6
Current database: *** NONE ***

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

2
Câu trả lời này có ý nghĩa. Tài liệu ( dev.mysql.com/doc/refman/5.5/en/ mẹo ) không nói rằng biến ở cấp phiên có thể được thay đổi, chỉ ở cấp toàn cầu. Tôi đã trải nghiệm rằng nhiều lần thay đổi max_connections bằng SET GLOBAL max_connections = 1000;và khi tôi chạy SHOW VARIABLES LIKE 'max_connections';để xem giá trị cũ sẽ điều khiển các hạt có nghĩa là cho đến khi tôi đăng xuất và quay lại. +1 cho quan điểm này được chấp nhận và thường bị lãng quên.
RolandoMySQLDBA

@Rolando tôi cũng vậy! Ngoài ra, rất vui khi tôi thấy rằng tôi có thể 'kết nối;' thay vì đăng xuất và đăng nhập lại. Tiết kiệm thời gian!
Derek Downey

Khái niệm chạy connectnày thực sự mới đối với tôi trong MySQL. Tôi đã làm điều đó một triệu lần trong PostgreSQL và Oracle. Tôi chưa bao giờ nghĩ về việc MySQL cho phép điều đó
RolandoMySQLDBA

@DTest, Cảm ơn câu trả lời của bạn. Theo thử nghiệm sâu sắc của tôi, nó đã làm việc năng động. Trong localhost của tôi, biến phiên đã được thay đổi mà không chạy kết nối (tôi gặp lỗi khi gặp sự cố connect). Với giá trị 2, việc nhập 2.241.319 bản ghi mất 27 phút 43 giây, trong khi mất khoảng 1 ngày với giá trị 1. Cài đặt dường như hoạt động trong phiên hiện tại nhưng nó đã khôi phục cài đặt gốc (từ my.cnf) sau khi khởi động lại.
Sithu

@DerekDowney, Đây có phải chỉ dành cho một số cài đặt nhất định innodb_flush_log_at_trx_commitkhông? Hoặc là cho tất cả các cài đặt, cài đặt globalsẽ không ảnh hưởng đến phiên hiện tại?
Pacerier

7

Bằng cách đặt innodb_flush_log_at_trx_commit , bạn có nguy cơ nhầm lẫn với khả năng tương tác của mysqld / OS. Tôi nói điều này bởi vì hệ điều hành đang được tin cậy để thực hiện tuôn ra.

Lưu ý sự thận trọng trong Tài liệu MySQL

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.

Điều này nói lên như sau: HĐH có thể nói dối như một người chồng lừa dối. HĐH cho biết nó sẽ tuôn ra đĩa và đơn giản là không làm điều đó. Do đó, ngay cả khi bạn đặt innodb_flush_log_at_trx_commit, bạn phải ly dị hệ điều hành tuôn ra đĩa từ việc tuôn ra mysqld vào đĩa.

Hãy thử đặt innodb_flush_method thành O_DIRECT nếu bạn chưa làm như vậy. Bạn có thể thấy một sự khác biệt bởi vì phương thức tuôn ra khác nhau rất nhiều (Xem Mar 04, 2011bài đăng Làm rõ của tôi về biến innodb_flush_method của MySQL ).

CAUPAT

Như bạn đã đề cập, bạn không có quyền truy cập my.cnf. Vui lòng liên hệ với SysAdmin tại nhà cung cấp của bạn và nhận innodb_flush_method thay đổi.

CẬP NHẬT 2012-12-10 12:45 EDT

Tôi hiện đang chạy MySQL 5.5.12 trên PC của tôi. Khi tôi kết nối và chạy, show variables like 'innodb_flush_method';tôi nhận được

mysql> show variables like 'innodb_flush_method';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_flush_method |       |
+---------------------+-------+
1 row in set (0.05 sec)

mysql>

Vì nó trống, nó chỉ cho biết rằng cài đặt mặc định được sử dụng. Vui lòng đọc bài đăng ngày 04 tháng 3 năm 2011 của tôi để làm rõ về biến innodb_flush_method của MySQL


Tôi đã thử nghiệm trong localhost của tôi đầu tiên. Tôi không thể tìm thấy innodb_flush_methodtrong my.ini(không my.cnf). Thông tin máy chủ - Apache 2.4.1, PHP 5.4.4, MySQL 5.5
Sithu

Tôi nhận thấy rằng bất kể phiên bản máy chủ hoặc ini / cnf, tệp cấu hình không có innodb_flush_methodcài đặt và SHOW VARIABLESkhông hiển thị nó.
Sithu

Cảm ơn CẬP NHẬT của bạn, tôi cũng đã nhận được nó, tôi chỉ tự hỏi tại sao chúng ta không thể thấy giá trị của nó. Vì tôi không thể tìm thấy nó trong my.inihoặc my.cnfnó không phải là một biến động, tôi không chắc làm thế nào tôi có thể định cấu hình nó.
Sithu
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.