mysql中的 kill_MySQL kill指令使用指南

KILL [CONNECTION | QUERY] processlist_id

在Mysql中每个连接都是单独线程运行,可以使用语句 KILL processlist_id statement.来终止语句执行。

KILL允许可选 CONNECTION或QUERY 修饰符:

KILL CONNECTION ,KILL与无修饰符相同 :终止与给定关联的连接 processlist_id,在终止该连接正在执行的任何语句之后。

KILL QUERY终止连接当前正在执行的语句,但保持连接本身不变。

使用show processlist 查看所有id

a62a9cbb52349eaa3438b149b0999e81.png

Kill 指令使用

如果我们应用执行SQL后,由于锁select for update或者数量太大,导致执行SQL卡在数据库,此时想取消该SQL怎么办?可以通过kill命令停止mysql线程或者是取消该SQL执行,此处需要到底是执行 kill threadId指令还是 kill query theadId指令?

kill与kill query 最大区别是是否取消该连接上执行的所有sql,即是否关闭该线程,如果关闭该线程即对应JDBC中statement关闭

-- 数据库锁住acctno=13记录 然后执行如下更新语句

update test set acctname ='12' where acctno=13

show processlist查看正在执行sql的线程id

ccac3be54bed7ca3179d98aa99a15de9.png

如果想取消该SQL执行,可以使用命令 kill query 407 取消SQL执行,执行后407线程并不会消失,如果该连接上有SQL执行会继续执行;但是如果使用kill 407 ,407线程会消失。使用时需要注意二者差异。

线程id除了通过show processlist查看,也可以使用编程的方式获取threadId

Connection connection = getConnection();

((MysqlConnection)connection).getSession().getThreadId();

Statement cancel方法

我们使用JDBC编程方式对数据库进行操作时,可以也可以使用Statement对象的cancel方法进行取消,Mysql驱动内部也是发送Kill query threadId 指令,Mysql驱动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() {

}

});

//驱动内部使用 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());

}

}

客户端工具执行

客户端工具执行SQL后取消执行,有些工具发 kill 命令 有些发kill query 指令,可以通过抓包工具验证下Navicat工具发送什么指令,抓包工具推荐Wireshark,很强大。

847a27dd7498fb10fdf8edf1731b1644.png

是kill 指令,对应的线程ID为407,也有部分工具是发送的kill query指令。

以上就是MySQL kill指令使用指南的详细内容,更多关于MySQL kill指令的资料请关注脚本之家其它相关文章!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值