Bagaimana saya bisa menghentikan permintaan MySQL yang sedang berjalan?

258

Saya terhubung mysqldari shell Linux saya. Sesekali saya menjalankan SELECTkueri yang terlalu besar. Mencetak dan mencetak dan saya sudah tahu ini bukan yang saya maksud. Saya ingin menghentikan kueri.

Memukul Ctrl+C(beberapa kali) membunuh mysqlsepenuhnya dan membawa saya kembali ke shell, jadi saya harus menyambung kembali.

Apakah mungkin untuk menghentikan permintaan tanpa membunuh mysqlsendiri?

David B
sumber
1
Perlu disebutkan bahwa MySQL 5.7 mendukung timeout pernyataan SELECT sisi server. Informasi lebih lanjut tentang ini di sini: mysqlserverteam.com/server-side-select-statement-timeouts
Morgan Tocker

Jawaban:

462
mysql>show processlist;

mysql> kill "number from first col";
baklarz2048
sumber
1
Thanx, saya hanya tahu bagaimana melakukannya di phpmyadmin!
Zilverdistel
5
tetapi mysqlsedang mencetak ... Saya tidak dapat melihat prompt
David B
34
Saya setuju dengan pendekatan dasar ini, tetapi saya pikir menggunakan KILL QUERYsedikit lebih disukai KILLuntuk kasus ini. Dengan cara itu permintaan terbunuh, tetapi tidak koneksi.
Ike Walker
3
tip yang berguna jika daftar proses Anda bergulir melewati buffer Anda adalah untuk mengatur pager. Cukup masukkan '\ P lagi' saat diminta. Lihat lebih lanjut tentang tip ini di sini dbasquare.com/2012/03/28/…
Scott
1
Jika menggunakan MySQL pada AWS RDS, Anda tidak akan memiliki izin untuk menjalankan KILL, tetapi Anda dapat menjalankan:CALL mysql.rds_kill(12345)
Kip
70

Hanya untuk menambahkan

KILL QUERY **Id** dari mana id adalah koneksi id show processlist

lebih disukai jika Anda tidak ingin mematikan koneksi biasanya ketika menjalankan dari beberapa aplikasi.

Untuk lebih jelasnya Anda dapat membaca dokumen mysql di sini

maaz
sumber
Sebuah pertanyaan yang saya miliki terkait dengan ini, apakah koneksi hanya respawn, atau apakah membunuh koneksi akhirnya mengakibatkan ukuran pool terlalu kecil untuk menjalankan aplikasi?
Paman Iroh
48

Terhubung ke mysql

mysql -uusername -p  -hhostname

tampilkan daftar proses lengkap:

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

Bunuh permintaan spesifik. Di sini id = 9255451

mysql> kill 9255451;

Jika Anda mendapat izin ditolak, coba SQL ini:

CALL mysql.rds_kill(9255451)
minhas23
sumber
13
Catatan: Permintaan terakhir itu diperlukan jika menggunakan AWS RDS instance.
Kip
13

Gunakan mysqladminuntuk membunuh kueri pelarian:

Jalankan perintah berikut:

mysqladmin -uusername -ppassword pr

Kemudian catat id proses.

mysqladmin -uusername -ppassword kill pid

Kueri pelarian seharusnya tidak lagi menggunakan sumber daya.

minhas23
sumber
9

Jika sudah mysqladmintersedia, Anda dapat memperoleh daftar pertanyaan dengan:

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

Kemudian, Anda dapat menghentikan proses mysql yang menampung permintaan yang sudah berjalan lama:

> mysqladmin -uUSERNAME -pPASSWORD kill 137
Rudy Lattae
sumber
6

Anda perlu menjalankan perintah berikut untuk mematikan proses.

> show processlist;  
> kill query processId;

Parameter kueri menentukan bahwa kita perlu membunuh proses perintah kueri.

Sintaks untuk proses kill sebagai berikut

BUNUH [SAMBUNGAN | QUERY] processlist_id

Silakan merujuk tautan ini untuk informasi lebih lanjut.

Shivam Kubde
sumber
1

Penulis pertanyaan ini menyebutkan bahwa biasanya hanya setelah MySQL mencetak hasilnya, ia menyadari bahwa kueri yang salah telah dieksekusi. Seperti disebutkan, dalam hal ini, Ctrl-Ctidak membantu. Namun, saya perhatikan bahwa itu akan membatalkan permintaan saat ini - jika Anda menangkapnya sebelum keluaran dicetak. Sebagai contoh:

mysql> select * from jos_users, jos_comprofiler;

MySQL sibuk membuat Produk Cartesian dari dua tabel di atas dan Anda segera melihat bahwa MySQL belum mencetak output apa pun ke layar (status proses adalah Mengirim data ) sehingga Anda mengetik Ctrl-C:

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

Ctrl-Cjuga dapat digunakan untuk menghentikan UPDATEkueri.

Anthony Geoghegan
sumber