ฉันจะหยุดการสืบค้น MySQL ที่ทำงานอยู่ได้อย่างไร


258

ฉันเชื่อมต่อmysqlจากเชลล์ Linux ทุก ๆ ครั้งที่ฉันเรียกใช้SELECTแบบสอบถามที่มีขนาดใหญ่เกินไป มันพิมพ์และพิมพ์และฉันรู้แล้วว่านี่ไม่ใช่สิ่งที่ฉันหมายถึง ฉันต้องการหยุดการค้นหา

การกดปุ่มCtrl+C(สองสามครั้ง) ก็ฆ่าได้mysqlอย่างสมบูรณ์และพาฉันกลับไปที่กระสุนดังนั้นฉันต้องเชื่อมต่อใหม่

เป็นไปได้ไหมที่จะหยุดการสืบค้นโดยไม่ฆ่าmysqlตัวเอง


1
เป็นมูลค่าการกล่าวขวัญว่า MySQL 5.7 สนับสนุนการหมดเวลาคำสั่ง SELECT บนฝั่งเซิร์ฟเวอร์ ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่: mysqlserverteam.com/server-side-select-statement-timeouts
Morgan Tocker

คำตอบ:


462
mysql>show processlist;

mysql> kill "number from first col";

1
ขอบคุณมากฉันรู้วิธีทำใน phpmyadmin เท่านั้น!
Zilverdistel

5
แต่mysqlกำลังพิมพ์ ... ฉันไม่เห็นพรอมต์
David B

34
ฉันเห็นด้วยกับวิธีการพื้นฐานนี้ แต่ฉันคิดว่าการใช้KILL QUERYจะดีกว่าเล็กน้อยKILLสำหรับกรณีนี้ ด้วยวิธีนี้เคียวรีจะถูกฆ่า แต่ไม่ใช่การเชื่อมต่อ
Ike Walker

3
เคล็ดลับที่มีประโยชน์หากรายการกระบวนการของคุณเลื่อนผ่านบัฟเฟอร์ของคุณเพื่อกำหนดเพจเจอร์ เพียงป้อน '\ P more' ที่พรอมต์ ดูข้อมูลเพิ่มเติมเกี่ยวกับเคล็ดลับนี้ที่นี่dbasquare.com/2012/03/28/…
สกอตต์

1
หากใช้ MySQL บน AWS RDS คุณจะไม่ได้รับอนุญาตให้ทำงานKILLแต่คุณสามารถเรียกใช้:CALL mysql.rds_kill(12345)
Kip

70

เพียงเพิ่ม

KILL QUERY **Id** โดยที่ Id คือรหัสการเชื่อมต่อจาก show processlist

จะดีกว่าถ้าคุณไม่ต้องการฆ่าการเชื่อมต่อโดยปกติเมื่อเรียกใช้จากแอปพลิเคชันบางตัว

สำหรับรายละเอียดเพิ่มเติมคุณสามารถอ่าน mysql doc ได้ที่นี่


คำถามที่ฉันเกี่ยวข้องกับสิ่งนี้การเชื่อมต่อเพิ่งเกิดใหม่หรือการฆ่าการเชื่อมต่อในที่สุดส่งผลให้ขนาดของพูลนั้นเล็กเกินไปสำหรับแอปพลิเคชันที่จะเรียกใช้หรือไม่
ลุง Iroh

48

เชื่อมต่อกับ mysql

mysql -uusername -p  -hhostname

แสดงรายการกระบวนการทั้งหมด:

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

ทำลายแบบสอบถามที่เฉพาะเจาะจง ที่นี่ id = 9255451

mysql> kill 9255451;

หากคุณได้รับอนุญาตปฏิเสธลอง SQL นี้:

CALL mysql.rds_kill(9255451)

13
หมายเหตุ: จำเป็นต้องใช้แบบสอบถามสุดท้ายหากใช้อินสแตนซ์ AWS RDS
Kip

13

ใช้ mysqladminเพื่อฆ่าแบบสอบถามที่ควบคุมไม่ได้:

รันคำสั่งต่อไปนี้:

mysqladmin -uusername -ppassword pr

จากนั้นจดบันทึก id กระบวนการ

mysqladmin -uusername -ppassword kill pid

แบบสอบถามแบบควบคุมไม่ควรใช้ทรัพยากรอีกต่อไป


9

หากคุณมีmysqladminให้คุณอาจได้รับรายชื่อของแบบสอบถามด้วย:

> 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 |
+-----+------+-----------------+--------+---------+------+--------------+------------------+

จากนั้นคุณอาจหยุดกระบวนการ mysql ที่โฮสต์การสืบค้นที่ใช้เวลานาน:

> mysqladmin -uUSERNAME -pPASSWORD kill 137

6

คุณต้องเรียกใช้คำสั่งต่อไปนี้เพื่อฆ่ากระบวนการ

> show processlist;  
> kill query processId;

พารามิเตอร์การสืบค้นระบุว่าเราจำเป็นต้องฆ่ากระบวนการคำสั่งแบบสอบถาม

ไวยากรณ์สำหรับกระบวนการ kill ดังนี้

ฆ่า [เชื่อมต่อ | QUERY] processlist_id

โปรดอ้างอิงลิงค์นี้สำหรับข้อมูลเพิ่มเติม


1

ผู้เขียนคำถามนี้กล่าวว่าโดยปกติแล้วหลังจาก MySQL พิมพ์ผลลัพธ์ที่เขารู้ว่ามีการดำเนินการค้นหาที่ไม่ถูกต้อง ตามที่ระบุไว้ในกรณีนี้Ctrl-Cไม่ได้ช่วย อย่างไรก็ตามฉันสังเกตเห็นว่ามัน จะยกเลิกแบบสอบถามปัจจุบัน - ถ้าคุณจับมันก่อนที่จะพิมพ์ออกใด ๆ ตัวอย่างเช่น:

mysql> select * from jos_users, jos_comprofiler;

MySQL กำลังยุ่งอยู่กับการสร้างผลิตภัณฑ์คาร์ทีเซียนจากสองตารางข้างต้นและในไม่ช้าคุณจะสังเกตเห็นว่า MySQL ไม่ได้พิมพ์ผลลัพธ์ใด ๆ ไปยังหน้าจอ (สถานะกระบวนการกำลังส่งข้อมูล ) ดังนั้นคุณจึงพิมพ์Ctrl-C:

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

Ctrl-Cสามารถใช้ในการหยุดUPDATEแบบสอบถามได้ในทำนองเดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.