Câu trả lời:
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_shutdown
nế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 TABLES
lệnh (với LOCAL
từ 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 ...
UNLOCK TABLES;
)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 shutdown
theo sau là khởi động lại thủ công.
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à:
mysql> STOP SLAVE;
.mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;
.mysql> SHOW PROCESSLIST;
, giết chúng mysql> kill thread_id;
hoặc đợi cho đến khi chúng kết thúc.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!
innodb_fast_shutdown = 1
thự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?).