Có một khởi động lại duyên dáng hoặc an toàn cho mysql như cho apache httpd không?


29

Tôi muốn khởi động lại mysql một cách duyên dáng giống như httpd nơi các luồng được phục vụ trước khi khởi động lại. Tôi không thích phá vỡ các truy vấn.

Câu trả lời:


37

Bất kỳ chuỗi tắt "được yêu cầu" nào trong MySQL (viết tắt kill -9) đều có phần duyên dáng , vì các giao dịch đang diễn ra (trên các bảng giao dịch) được khôi phục, nhưng đây là một số cách để khởi động lại sạch nhất có thể.

Lưu ý: nếu bạn đang tắt máy chủ để nâng cấp, thì đừng sử dụng quy trình này; thay vào đó, hãy làm theo quy trình chi tiết trong câu trả lời này .

Mặt khác, nếu bạn chỉ khởi động lại một máy chủ khỏe mạnh khác để bạn có thể thay đổi biến toàn cục chỉ đọc hoặc một cái gì đó tương tự, thì đây là một con đường duyên dáng:

Đầu tiên, kích hoạt innodb_fast_shutdownnếu nó chưa có. Điều này không liên quan trực tiếp đến sự duyên dáng của việc tắt máy, nhưng nó sẽ đưa máy chủ của bạn trở lại nhanh hơn.

mysql> SHOW VARIABLES LIKE 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_fast_shutdown | 0     |
+----------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_fast_shutdown = 1;
Query OK, 0 rows affected (0.01 sec)

Tiếp theo, hướng dẫn máy chủ đóng tất cả các bảng đang mở ngay khi không có truy vấn nào đang chạy đang tham chiếu chúng. Bước này cũng không liên quan gì đến việc tắt máy duyên dáng, nhưng nó sẽ làm cho bước tiếp theo diễn ra nhanh hơn:

mysql> FLUSH LOCAL TABLES;
Query OK, 0 rows affected (41.12 sec)

Câu FLUSH TABLESlệnh (với LOCALtừ khóa tùy chọn , tránh một luồng không cần thiết nhưng vô hại của bất kỳ nô lệ nào) sẽ chặn và lời nhắc của bạn sẽ không trở lại cho đến khi tất cả các bảng có thể được đóng lại. Khi mỗi bảng đã được "xóa" (đóng), nếu một truy vấn sau đó tham chiếu bảng, nó sẽ tự động được mở lại, nhưng không sao. Những gì chúng ta đang thực hiện với bước này là làm cho công việc ít hơn cho bước cuối cùng:

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (13.74 sec)

mysql>

Tuyên bố này tuôn ra tất cả các bảng (do đó lợi thế của việc loại bỏ một số điều đó ra khỏi cách ít gây gián đoạn với bước trước đó) và có được khóa chỉ đọc toàn cầu (toàn máy chủ) trên chúng.

Bạn không thể có khóa đọc toàn cầu cho đến khi mọi truy vấn "ghi" hiện đang chạy (nghĩa là khá nhiều thứ nhưng SELECT) được thực hiện. Việc đưa ra yêu cầu khóa sẽ cho phép các truy vấn hiện tại kết thúc nhưng sẽ không cho phép các truy vấn mới bắt đầu.

Lời nhắc của bạn không trở lại cho đến khi bạn giữ khóa toàn cầu này, vì vậy mọi truy vấn đang được tiến hành khi bạn yêu cầu khóa có thể kết thúc và bạn biết rằng họ đã kết thúc, bởi vì bạn nhận lại lời nhắc. Bất kỳ truy vấn tiếp theo nào cố gắng ghi bất cứ điều gì vào bất kỳ bảng nào sẽ bị đình trệ, không thay đổi dữ liệu, chờ khóa vô thời hạn, cho đến khi ...

  • bạn thay đổi ý định về việc khởi động lại và giải phóng khóa bằng tay ( UNLOCK TABLES;)
  • bạn khởi động lại máy chủ, hoặc
  • bạn vô tình hoặc cố ý ngắt kết nối máy khách dòng lệnh khỏi luồng này (vì vậy đừng làm vậy). Giữ cửa sổ này được kết nối và ngồi tại dấu nhắc mysql:

Chống lại sự cám dỗ để đóng này.

mysql>

Lời nhắc bảng điều khiển nhàn rỗi này là những gì đang giữ khóa toàn cầu cho bạn. Mất cái này, mất khóa.

Từ một cửa sổ giao diện điều khiển khác, khởi động lại MySQL theo cách bạn thường làm, bằng initscripts (ví dụ: biến thể cục bộ của bạn service mysql.server restart) hoặc mysqladmin shutdowntheo sau là khởi động lại thủ công.


Việc sử dụng có innodb_fast_shutdown = 1thực sự đảm bảo rằng MySQL khởi động nhanh hơn không? Nhìn vào các tài liệu, có vẻ như điều này cải thiện tốc độ tắt máy (với chi phí cho tốc độ khởi động?).
Chris

@Chris ý tưởng là nó giúp đảm bảo rằng toàn bộ tắt máy + khởi động nhanh như thực tế, nhưng nó có phần giai thoại vì số lượng công việc đang được thực hiện là giống nhau - chỉ chuyển sang phía bên kia của chuỗi - chưa vì một số lý do, nhìn chung nó luôn có vẻ nhanh hơn về tổng thể, như có lẽ có một số sự không hiệu quả trong cách nó xảy ra khi tắt máy không có khi khởi động. Khó nói.
Michael - sqlbot

2

Nói tóm lại, một số thực tiễn tốt nhất cần được xem xét trước khi tắt MySQL là:

  1. Xác nhận trường hợp bạn sẽ tắt máy để tránh dừng phiên bản khác do nhầm lẫn.
  2. Dừng sao chép nếu bạn định tắt một nô lệ mysql> STOP SLAVE;.
  3. Rửa sạch các trang bẩn trước để giảm thời gian tắt máy mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;.
  4. Kiểm tra các truy vấn chạy dài mysql> SHOW PROCESSLIST;, giết chúng mysql> kill thread_id;hoặc đợi cho đến khi chúng kết thúc.
  5. Kết xuất vùng đệm khi tắt máy mysql> SET GLOBAL innodb_buffer_pool_dump_at_shutdown = ON;và tải lại khi khởi động # vi /etc/my.cnf innodb_buffer_pool_load_at_startup = ON để khởi động vùng đệm.

Sau đó, sau khi xác nhận các điểm trước đó, bạn có thể khởi động lại MySQL một cách an toàn shell$ service mysql restart

Để biết thêm chi tiết, xem bài viết của tôi Kiểm tra những điều này trước khi tắt MySQL!


Tại sao điều này bị hạ thấp? Tôi không biết đủ để nhận ra lệnh nào là xấu, nhưng tôi muốn biết để tôi có thể tránh chúng.
Jon

Tôi không biết bất kỳ điều nào ở trên là một mệnh lệnh tồi. Tôi đang làm theo các bước trên và rất nhiều người làm. Chỉ nên thận trọng bước 4, bạn không nên giết bất kỳ truy vấn nào cho đến khi bạn chắc chắn về những gì bạn đang làm, nếu không, hãy đợi cho đến khi các truy vấn chạy dài kết thúc. Hãy thử và nếu nó giúp bạn, hãy nâng cấp nó, nếu không, hãy tải xuống!
Moll
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.