2013-04-10 70 views
2

我有一個查詢鎖定表在MySQL(使用的是InnoDB):查詢鎖定表,不能殺死進程

UPDATE table SET status = 2 WHERE status = 3 

這個查詢引起死鎖在桌子上,無法繞過它。

我試圖做的:

show processlist 

然後殺死進程ID,但我不能似乎將其殺死

我想:

kill 9588 

9588是進程ID。

然後我做show processlist我仍然在列表中看到相同的查詢。

我該如何強制殺死這個進程,然後爲什麼這個查詢會導致死鎖?我該如何解決它?

+0

'殺-9'是操作系統命令,而不是一個MySQL命令。 – tadman 2013-04-10 17:05:29

+0

如果'UPDATE'無法獲得任何'status = 3'行的寫訪問權限,它將會被阻止。我會確保所有的交易都已經提交了他們的變更,並且您沒有任何確定'select for update' – cmd 2013-04-10 17:07:20

回答

2

KILL命令請求查詢終止,並且該命令的狀態應顯示爲Killed。沒有辦法強制殺死一些東西並立即終止。

作爲最後的手段,您可以隨時關閉並重新啓動您的mysqld服務器進程。

1

你應該試着在你的計算機上首先殺死mysql/sql service,然後用托盤殺死你正在查詢的程序。

希望它會爲你工作

+0

好吧,這會導致查詢無效。謝謝但我打死了鎖! – Mike 2013-04-10 18:33:13

+0

也許我可以幫助你解決你的問題,如果你告訴我更多關於你的數據庫和你想做的事情。如果你沒有解決它噴氣。 – 2013-04-11 10:33:59

+0

這個答案可以通過提供一個示例命令來殺死mysql。 – mopo922 2015-06-30 21:10:05

12

當你運行一個RDS MySQL實例,並想殺死一個線程或出於某種原因查詢時,你會發現,因爲你沒有,你可以不使用KILLmysqladmin kill有權這樣做。

RDS提供名爲mysql.rds_killmysql.rds_kill_query的存儲過程,它們將分別殺死一個線程和一個查詢。要殺死一個線程,首先使用SHOW PROCESSLIST來獲取線程列表並找到想要殺死的線程的ID。假設線程id是53512,然後使用

CALL mysql.rds_kill(53512) 

來源: http://snak.tumblr.com/post/13856391340/killing-a-thread-or-query-of-mysql-running-on-rds

+0

官方文檔:http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.MySQL.CommonDBATasks.html – fideloper 2016-06-30 20:01:21