HIỂN THỊ DANH SÁCH QUY TRÌNH trong lệnh MySQL: sleep


83

Khi tôi chạy SHOW PROCESSLIST trong cơ sở dữ liệu MySQL, tôi nhận được kết quả sau:

mysql> show full processlist;

+--------+------+-----------+--------+---------+-------+-------+-----------------------+
| Id     | User | Host      | db     | Command | Time  | State | Info                  |
+--------+------+-----------+-------+---------+-------+-------+-----------------------+
| 411665 | root | localhost | somedb | Sleep   | 11388 |       | NULL                  | 
| 412109 | root | localhost | somedb | Query   |     0 | NULL  | show full processlist | 
+--------+------+-----------+-------+---------+-------+-------+------------------------+

Tôi muốn biết quá trình "Ngủ" nằm trong Lệnh. Nó có nghĩa là gì? Tại sao nó chạy trong một thời gian dài và hiển thị NULL? Nó đang làm cho cơ sở dữ liệu chậm và khi tôi giết quá trình, sau đó nó hoạt động bình thường. Làm ơn giúp tôi.


nó không làm gì nó chỉ ngồi đó và "đợi" kết nối.
Rufinus

1
chúng ta có thể tìm thấy truy vấn nào đang chờ kết nối không? que của tôi có ý nghĩa gì không? ANd tại sao nó làm chậm cơ sở dữ liệu của tôi?
gthm

8
nó không phải là một truy vấn chờ kết nối. nó là một con trỏ kết nối đang chờ hết thời gian chờ. và nó không ảnh hưởng đến hiệu suất. Điều duy nhất mà nó sử dụng là một vài byte như mọi kết nối. Trường hợp thực sự tồi tệ nhất là sử dụng một kết nối của pool của bạn, nếu bạn kết nối nhiều lần qua ứng dụng console và chỉ đóng ứng dụng mà không đóng kết nối, bạn có thể sử dụng hết tất cả các kết nối của mình và phải đợi hết thời gian để có thể kết nối lại ... nhưng điều này là rất khó :-)
Rufinus

2
@Rufinus, tôi cũng có vấn đề tương tự. Tại sao bạn nói nhưng điều này rất khó xảy ra ? Và tham số nào liên quan đến cấu hình kết nối ngủ hết thời gian chờ trong my.cnf?
Hamidreza

Câu trả lời:


75

Nó không phải là một truy vấn chờ kết nối; nó là một con trỏ kết nối đang chờ thời gian chờ kết thúc.

Nó không ảnh hưởng đến hiệu suất. Điều duy nhất nó sử dụng là một vài byte như mọi kết nối.

Trường hợp thực sự tồi tệ nhất: Đó là sử dụng một kết nối của pool của bạn; Nếu bạn kết nối nhiều lần thông qua máy khách bảng điều khiển và chỉ đóng máy khách mà không đóng kết nối, bạn có thể sử dụng hết các kết nối của mình và phải đợi hết thời gian để có thể kết nối lại ... nhưng điều này rất khó xảy ra :-)

Xem MySql Proccesslist chứa đầy Mục nhập "Ngủ" dẫn đến "Quá nhiều kết nối"? /dba/1558/how-long-is-too-long-for-mysql-connections-to-sleep để biết thêm thông tin.


2
Vấn đề có thể là nếu bạn có kết nối hạn chế với cơ sở dữ liệu. Bởi vì ngay cả khi những kết nối đó không ảnh hưởng đến hiệu suất, chúng vẫn được tính là một kết nối.
mrded

25

Các kết nối trạng thái "ngủ" thường được tạo bởi mã duy trì các kết nối liên tục với cơ sở dữ liệu.

Điều này có thể bao gồm các nhóm kết nối được tạo bởi các khuôn khổ ứng dụng hoặc các công cụ quản trị cơ sở dữ liệu phía máy khách.

Như đã đề cập ở trên trong các nhận xét, thực sự không có lý do gì để lo lắng về những kết nối này ... tất nhiên trừ khi bạn không biết kết nối đến từ đâu.

(CAVEAT: Nếu bạn có một danh sách dài các loại kết nối này, có thể có nguy cơ hết các kết nối đồng thời.)


5

Tôi tìm thấy câu trả lời này ở đây: /dba/1558 . Tóm lại, sử dụng phần sau (hoặc trong my.cnf) sẽ loại bỏ vấn đề thời gian chờ.

SET GLOBAL interactive_timeout = 180; SET GLOBAL wait_timeout = 180;

Điều này cho phép các kết nối kết thúc nếu chúng vẫn ở trạng thái ngủ trong 3 phút (hoặc bất cứ điều gì bạn xác định).


0

Ngủ có nghĩa là chủ đề không làm gì cả. Thời gian quá lớn do truy vấn luồng anthor, nhưng không ngắt kết nối máy chủ, mặc định wait_timeout = 28800; vì vậy bạn có thể đặt các giá trị nhỏ hơn, ví dụ: 10. bạn cũng có thể hủy luồng.

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.