Hướng dẫn show processlist mysql sleep - hiển thị danh sách xử lý mysql sleep

Khi các bạn sử dụng mysql server 1 thời gian, trong trường hợp có nhiều kết nối đến server, một trong những tình huống bạn hay gặp phải đó là khi show proccesslist, các bạn sẽ thấy có nhiều process đang có trạng thái sleep.

Những process này có trang thái sleep vì những clinet kết nối đến mysql server, thực hiện truy vấn, và quên không đóng lại connections đến database. Do không đóng nên những connection đó vẫn ở lại và vẫn được mở, và nó được set command là status. Về cơ bản mysql server sẽ tự đóng các connection này khi nó quá timeout (mỗi connection tới mysql đều có timeout). Nhưng các bạn lại muốn tự dọn dẹp những connection như này và ở bài viết này mình sẽ hướng dẫn các bạn.

Đầu tiên các bạn login vào mysql dùng câu lệnh sau


B2 :Tiếp theo các bạn gõ show processlist để xem những connections nào đang được mở


B3: Sau đó xem đường dẫn lưu file mà mysql cho phép :

SHOW VARIABLES LIKE "secure_file_priv";


Ở trường hợp của mình, kết quả sẽ là


B4:Tiếp theo các bạn extract các process đang sleep vào 1 file nằm ở thư mục các bạn tìm thấy ở bước 3Ví dụ mình sẽ xuất ra file sau : ‘/var/lib/mysql-files/a.txt’; thì câu lệnh sẽ là
Ví dụ mình sẽ xuất ra file sau : ‘/var/lib/mysql-files/a.txt’; thì câu lệnh sẽ là

select concat('KILL ',id,';') from information_schema.processlist where Command='Sleep' into outfile '/var/lib/mysql-files/a.txt';

Các bạn có thể mở thử file a.txt để xem, cơ bản nó sẽ có format như này:

abc và def là các processid trong mysql

B5: Các bạn mở file a.txt và nó sẽ tự kill các proccess đang sleep

source /var/lib/mysql-files/a.txt;


Vậy thôi, bây giờ các bạn có thể check lại các proccess sleep đã được xóa đi chưa.

Bonus:Cơ chế dọn dẹp là việc thường xuyên phải làm, ví vậy các bạn nên làm 1 file bash script như sau để nó tự động quá trình bên trên

mysql -u root -p -e "select concat('KILL ',id,';')  into outfile '/var/lib/mysql-files/a.txt' from information_schema.processlist where Command = 'Sleep'"
mysql -u root -p -e "source /var/lib/mysql-files/a.txt"
rm -rf /var/lib/mysql-files/a.txt

103

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Khi tôi chạy Hiển thị Danh sách xử lý trong cơ sở dữ liệu MySQL, tôi nhận được đầu ra này:

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 "giấc ngủ" theo lệnh. Nó có nghĩa là gì? Tại sao nó chạy từ 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, thì nó hoạt động bình thường. Làm ơn giúp tôi.

Jyelton

34,7K25 Huy hiệu vàng127 Huy hiệu bạc188 Huy hiệu đồng25 gold badges127 silver badges188 bronze badges

Hỏi ngày 30 tháng 8 năm 2012 lúc 9:53Aug 30, 2012 at 9:53

Hướng dẫn show processlist mysql sleep - hiển thị danh sách xử lý mysql sleep

7

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 khung ứ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 bình luận, thực sự không có lý do gì để lo lắng về các kết nối này ... trừ khi tất nhiên bạn không biết kết nối đến từ đâu.

.

Đã trả lời ngày 3 tháng 1 năm 2013 lúc 20:12Jan 3, 2013 at 20:12

Đã vẽDrew

5,8734 Huy hiệu vàng42 Huy hiệu bạc43 Huy hiệu đồng4 gold badges42 silver badges43 bronze badges

Tôi đã tìm thấy câu trả lời này ở đây: https://dba.stackexchange.com/questions/1558. Tóm lại bằng cách sử dụng các mục sau (hoặc trong My.cnf) sẽ xóa vấn đề về 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 ở trong trạng thái ngủ trong 3 phút (hoặc bất cứ điều gì bạn xác định).

Đã trả lời ngày 12 tháng 3 năm 2018 lúc 11:36Mar 12, 2018 at 11:36

AntonyantonyAntony

3.43027 Huy hiệu bạc28 Huy hiệu đồng27 silver badges28 bronze badges

Giấc ngủ có nghĩa là chủ đề đó không làm gì cả. Thời gian là quá lớn Beacuse Anthor Thread Truy vấn, nhưng không ngắt kết nối máy chủ, mặc định Wait_TimeOut = 28800; để bạn có thể đặt các giá trị nhỏ hơn, ví dụ 10. Ngoài ra, bạn cũng có thể giết được luồng.

Đã trả lời ngày 23 tháng 5 năm 2013 lúc 3:22May 23, 2013 at 3:22