KILL [CONNECTION | QUERY] processlist_id
在Mysql中每個連接都是單獨(dú)線程運(yùn)行,可以使用語句 KILL processlist_id statement.來終止語句執(zhí)行。
KILL允許可選 CONNECTION或QUERY 修飾符:
- KILL CONNECTION ,KILL與無修飾符相同 :終止與給定關(guān)聯(lián)的連接 processlist_id,在終止該連接正在執(zhí)行的任何語句之后。
- KILL QUERY終止連接當(dāng)前正在執(zhí)行的語句,但保持連接本身不變。
使用show processlist 查看所有id
Kill 指令使用
如果我們應(yīng)用執(zhí)行SQL后,由于鎖select for update或者數(shù)量太大,導(dǎo)致執(zhí)行SQL卡在數(shù)據(jù)庫,此時想取消該SQL怎么辦?可以通過kill命令停止mysql線程或者是取消該SQL執(zhí)行,此處需要到底是執(zhí)行 kill threadId指令還是 kill query theadId指令?
kill與kill query 最大區(qū)別是是否取消該連接上執(zhí)行的所有sql,即是否關(guān)閉該線程,如果關(guān)閉該線程即對應(yīng)JDBC中statement關(guān)閉
-- 數(shù)據(jù)庫鎖住acctno=13記錄 然后執(zhí)行如下更新語句
update test set acctname ='12' where acctno=13
show processlist查看正在執(zhí)行sql的線程id
如果想取消該SQL執(zhí)行,可以使用命令 kill query 407 取消SQL執(zhí)行,執(zhí)行后407線程并不會消失,如果該連接上有SQL執(zhí)行會繼續(xù)執(zhí)行;但是如果使用kill 407 ,407線程會消失。使用時需要注意二者差異。
線程id除了通過show processlist查看,也可以使用編程的方式獲取threadId
Connection connection = getConnection();
((MysqlConnection)connection).getSession().getThreadId();
Statement cancel方法
我們使用JDBC編程方式對數(shù)據(jù)庫進(jìn)行操作時,可以也可以使用Statement對象的cancel方法進(jìn)行取消,Mysql驅(qū)動內(nèi)部也是發(fā)送Kill query threadId 指令,Mysql驅(qū)動cancel方法源碼
public void cancel() throws SQLException {
try {
if (this.query.getStatementExecuting().get()) {
if (!this.isClosed this.connection != null) {
JdbcConnection cancelConn = null;
Object cancelStmt = null;
try {
HostInfo hostInfo = this.session.getHostInfo();
String database = hostInfo.getDatabase();
String user = StringUtils.isNullOrEmpty(hostInfo.getUser()) ? "" : hostInfo.getUser();
String password = StringUtils.isNullOrEmpty(hostInfo.getPassword()) ? "" : hostInfo.getPassword();
NativeSession newSession = new NativeSession(this.session.getHostInfo(), this.session.getPropertySet());
newSession.connect(hostInfo, user, password, database, 30000, new TransactionEventHandler() {
public void transactionCompleted() {
}
public void transactionBegun() {
}
});
//驅(qū)動內(nèi)部使用 KILL QUERY + threadId 指令取消
newSession.sendCommand((new NativeMessageBuilder()).buildComQuery(newSession.getSharedSendPacket(), "KILL QUERY " + this.session.getThreadId()), false, 0);
this.setCancelStatus(CancelStatus.CANCELED_BY_USER);
} catch (IOException var13) {
throw SQLExceptionsMapping.translateException(var13, this.exceptionInterceptor);
} finally {
if (cancelStmt != null) {
((Statement)cancelStmt).close();
}
if (cancelConn != null) {
((JdbcConnection)cancelConn).close();
}
}
}
}
} catch (CJException var15) {
throw SQLExceptionsMapping.translateException(var15, this.getExceptionInterceptor());
}
}
客戶端工具執(zhí)行
客戶端工具執(zhí)行SQL后取消執(zhí)行,有些工具發(fā) kill 命令 有些發(fā)kill query 指令,可以通過抓包工具驗(yàn)證下Navicat工具發(fā)送什么指令,抓包工具推薦Wireshark,很強(qiáng)大。
是kill 指令,對應(yīng)的線程ID為407,也有部分工具是發(fā)送的kill query指令。
以上就是MySQL kill指令使用指南的詳細(xì)內(nèi)容,更多關(guān)于MySQL kill指令的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- 詳解MySQL kill 指令的執(zhí)行原理
- Mysql誤刪數(shù)據(jù)解決方案及kill語句原理
- Mysql使用kill命令解決死鎖問題(殺死某條正在執(zhí)行的sql語句)
- MySQL Slave 觸發(fā) oom-killer解決方法
- MySQL OOM 系列三 擺脫MySQL被Kill的厄運(yùn)
- MySQL OOM 系統(tǒng)二 OOM Killer
- percona-toolkit之pt-kill 殺掉mysql查詢或連接的方法
- 批量 kill mysql 中運(yùn)行時間長的sql
- MySQL kill不掉線程的原因