Làm cách nào tôi có thể dừng truy vấn MySQL đang chạy?


258

Tôi kết nối mysqltừ vỏ Linux của tôi. Thỉnh thoảng tôi chạy một SELECTtruy vấn quá lớn. Nó in và in và tôi đã biết đây không phải là ý tôi. Tôi muốn dừng truy vấn.

Đánh Ctrl+C(một vài lần) sẽ giết chết mysqlhoàn toàn và đưa tôi trở lại vỏ, vì vậy tôi phải kết nối lại.

Có thể dừng một truy vấn mà không mysqltự giết mình?


1
Điều đáng nói là MySQL 5.7 hỗ trợ thời gian chờ câu lệnh CHỌN phía máy chủ. Thông tin thêm về điều này tại đây: mysqlserverteam.com/server-side-select-statement-timeouts
Morgan Tocker

Câu trả lời:


462
mysql>show processlist;

mysql> kill "number from first col";

1
Thanx, tôi chỉ biết làm thế nào trong phpmyadmin!
Zilverdistel

5
nhưng mysqlđang in ... Tôi không thể thấy lời nhắc
David B

34
Tôi đồng ý với phương pháp cơ bản này, nhưng tôi nghĩ rằng việc sử dụng KILL QUERYlà hơi thích hợp hơn KILLcho trường hợp này. Bằng cách đó, truy vấn bị giết, nhưng không phải là kết nối.
Ike Walker

3
một mẹo hữu ích nếu danh sách quy trình của bạn đang cuộn qua bộ đệm của bạn là để đặt máy nhắn tin. Chỉ cần nhập '\ P thêm' tại dấu nhắc. Xem thêm về mẹo này tại đây dbasapes.com/2012/03/11/iêu
Scott

1
Nếu sử dụng MySQL trên AWS RDS, bạn sẽ không được phép chạy KILL, nhưng bạn có thể chạy:CALL mysql.rds_kill(12345)
Kip

70

Chỉ cần thêm

KILL QUERY **Id** Id là id kết nối từ đâu show processlist

sẽ thích hợp hơn nếu bạn không muốn tắt kết nối thường khi chạy từ một số ứng dụng.

Để biết thêm chi tiết, bạn có thể đọc tài liệu mysql tại đây


Một câu hỏi tôi có liên quan đến vấn đề này, liệu kết nối chỉ hồi sinh hay việc hủy kết nối cuối cùng dẫn đến kích thước nhóm quá nhỏ để ứng dụng chạy?
Chú Iroh

48

Kết nối với mysql

mysql -uusername -p  -hhostname

hiển thị danh sách quá trình đầy đủ:

mysql> show full processlist;
+---------+--------+-------------------+---------+---------+------+-------+------------------+
| Id      | User   | Host              | db      | Command | Time | State | Info             |
+---------+--------+-------------------+---------+---------+------+-------+------------------+
| 9255451 | logreg | dmin001.ops:37651 | logdata | Query   |    0 | NULL  | show processlist |
+---------+--------+-------------------+---------+---------+------+-------+------------------+

Giết các truy vấn cụ thể. Ở đây id = 9255451

mysql> kill 9255451;

Nếu bạn bị từ chối cấp phép, hãy thử SQL này:

CALL mysql.rds_kill(9255451)

13
Lưu ý: Truy vấn cuối cùng là bắt buộc nếu sử dụng ví dụ AWS RDS.
Kip

13

Sử dụng mysqladminđể giết truy vấn chạy trốn:

Chạy các lệnh sau:

mysqladmin -uusername -ppassword pr

Sau đó ghi lại id quá trình.

mysqladmin -uusername -ppassword kill pid

Truy vấn chạy trốn không còn tiêu tốn tài nguyên.


9

Nếu bạn có mysqladminsẵn, bạn có thể nhận được danh sách các truy vấn với:

> mysqladmin -uUSERNAME -pPASSWORD pr

+-----+------+-----------------+--------+---------+------+--------------+------------------+
| Id  | User | Host            | db     | Command | Time | State        | Info             |
+-----+------+-----------------+--------+---------+------+--------------+------------------+
| 137 | beet | localhost:53535 | people | Query   | 292  | Sending data | DELETE FROM      |
| 145 | root | localhost:55745 |        | Query   | 0    |              | show processlist |
+-----+------+-----------------+--------+---------+------+--------------+------------------+

Sau đó, bạn có thể dừng quá trình mysql đang lưu trữ truy vấn chạy dài:

> mysqladmin -uUSERNAME -pPASSWORD kill 137

6

Bạn cần chạy lệnh sau để giết tiến trình.

> show processlist;  
> kill query processId;

Tham số truy vấn xác định rằng chúng ta cần phải giết quá trình lệnh truy vấn.

Cú pháp cho quá trình kill như sau

GIẾT [KẾT NỐI | QUERY] processlist_id

Vui lòng tham khảo liên kết này để biết thêm thông tin.


1

Tác giả của câu hỏi này đề cập rằng thường chỉ sau khi MySQL in kết quả đầu ra, anh ta mới nhận ra rằng truy vấn sai đã được thực thi. Như đã lưu ý, trong trường hợp này, Ctrl-Ckhông giúp được gì. Tuy nhiên, tôi nhận thấy rằng nó sẽ hủy bỏ truy vấn hiện tại - nếu bạn bắt được nó trước khi bất kỳ đầu ra nào được in. Ví dụ:

mysql> select * from jos_users, jos_comprofiler;

MySQL bận rộn khi tạo Sản phẩm Cartesian của hai bảng trên và bạn sẽ sớm nhận thấy rằng MySQL chưa in bất kỳ đầu ra nào ra màn hình (trạng thái quá trình là Gửi dữ liệu ) để bạn nhập Ctrl-C:

Ctrl-C -- sending "KILL QUERY 113240" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted

Ctrl-Ctương tự có thể được sử dụng để dừng một UPDATEtruy vấn.

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.