Khách hàng hết thời gian, trong khi truy vấn MySQL vẫn chạy?


9

Chúng tôi gặp phải sự cố trong đó truy vấn chỉ đọc, chạy qua bàn làm việc của MySQL, đã hết thời gian từ phối cảnh UI của người dùng và vẫn chạy trên máy chủ (và dường như tiêu tốn ngày càng nhiều tài nguyên) cho đến khi chúng tôi bị cúp điện.

Câu hỏi

  • Có cách nào chuẩn để xử lý vấn đề này trong MySQL không?
  • Có một nguyên nhân cơ bản mà chúng ta cần phải tránh?

Câu trả lời:


11

Bạn cần xem xét những giá trị mặc định nào được đặt ra cho thời gian chờ:

mysql> show variables like '%timeout';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| connect_timeout            | 10    |
| delayed_insert_timeout     | 300   |
| innodb_lock_wait_timeout   | 50    |
| innodb_rollback_on_timeout | OFF   |
| interactive_timeout        | 60    |
| net_read_timeout           | 30    |
| net_write_timeout          | 60    |
| slave_net_timeout          | 3600  |
| table_lock_wait_timeout    | 50    |
| wait_timeout               | 60    |
+----------------------------+-------+
10 rows in set (0.00 sec)

Thông thường, tôi xem một số biến thời gian chờ. Điều này là rất bắt buộc nếu bạn sử dụng MySQL từ xa từ MySQL Workbench, máy khách mysql hoặc ứng dụng PHP trên máy chủ ứng dụng liên hệ với MySQL trên Máy chủ DB.

Đây là những gì Tài liệu MySQL nói về một trong các cài đặt này:

  • Wait_timeout (Mặc định 28800 [8 giờ]): Số giây máy chủ chờ hoạt động trên kết nối không tương tác trước khi đóng. Thời gian chờ này chỉ áp dụng cho các kết nối tệp socket TCP / IP và Unix, không áp dụng cho các kết nối được thực hiện bằng cách sử dụng các đường dẫn có tên hoặc bộ nhớ dùng chung. Khi khởi động luồng, giá trị Wait_timeout phiên được khởi tạo từ giá trị Wait_timeout toàn cầu hoặc từ giá trị tương tác toàn cầu, tùy thuộc vào loại máy khách (như được xác định bởi tùy chọn kết nối CLIENT_INTERACTIVE với mysql_real_connect ()). Xem thêm tương tác_timeout.
  • interactive_timeout (Mặc định 28800 [8 giờ]): Số giây chờ đợi máy chủ cho hoạt động trên một kết nối tương tác trước khi đóng cửa nó. Một máy khách tương tác được định nghĩa là một máy khách sử dụng tùy chọn CLIENT_INTERACTIVE để mysql_real_connect (). Xem thêm Wait_timeout.
  • net_read_timeout (Mặc định 30): Số giây chờ thêm dữ liệu từ một kết nối trước khi hủy đọc. Khi máy chủ đang đọc từ máy khách, net_read_timeout là giá trị hết thời gian kiểm soát khi hủy bỏ. Khi máy chủ ghi vào máy khách, net_write_timeout là giá trị hết thời gian kiểm soát khi hủy bỏ. Xem thêm Slave_net_timeout.
  • net_write_timeout (Mặc định 60): Số giây chờ một khối được ghi vào kết nối trước khi hủy ghi. Xem thêm net_read_timeout.

Vui lòng đảm bảo rằng các thời gian chờ này được đặt đủ cao để phù hợp với các truy vấn có thể chạy trong một thời gian rất dài, có thể bao gồm:

  • Khối lượng UPDATEs
  • Khối lượng DELETEs
  • ENABLE KEYS trên một MyISAM lớn

Để xử lý các truy vấn tiếp tục chạy sau khi bạn mất liên lạc với nó, bạn phải chạy KILL đối với ID tiến trình của truy vấn chạy dài. Ngay cả với lệnh KILL, bạn sẽ phải chờ bất kỳ truy vấn nào ở giữa các bước sử dụng nhiều đĩa hoặc có các đột biến nội bộ đang diễn ra.


Có một cách tiêu chuẩn, mạnh mẽ để chạy KILL chống lại các quy trình đã chạy trong một thời gian dài, hay nó thường được thực hiện thông qua một công việc bash script / cron?
asthasr

Tôi thực sự đã viết một bài đăng vào tháng 5 năm 2011 về cách khởi chạy một tập lệnh bằng cách sử dụng information_schema để giết một loạt các kết nối DB: dba.stackexchange.com/a/2637/877
RolandoMyQueryDBA

"Hãy đảm bảo rằng các thời gian chờ này được đặt đủ cao để chứa các truy vấn có thể chạy trong một thời gian rất dài, có thể bao gồm: CẬP NHẬT hàng loạt ..." ví dụ: php + mysql tôi phải chọn mọi bản ghi từ một cột trong bảng, vì vậy hãy tìm nạp hàng và sau đó làm một cái gì đó ... sau đó cập nhật một bản ghi khác với một giá trị mới. Đặt trường hợp kịch bản này cần khoảng hơn 5 phút. Một CHỌN ở đầu và một CẬP NHẬT đến cuối, tìm nạp các hàng và làm ... ở giữa. Bạn có thể giải thích những gì phải làm Wait_timeout với tình huống này không? Thực sự nó không rõ ràng đối với tôi ... thật là một giá trị an toàn cho Wait_timeout đối với tài nguyên miễn phí
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.