MySQL kill指令使用指南

吾爱主题 阅读:137 2024-04-02 07:58:40 评论:0
?
1 KILL [ CONNECTION | QUERY] processlist_id

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

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

  • KILL CONNECTION ,KILL与无修饰符相同 :终止与给定关联的连接 processlist_id,在终止该连接正在执行的任何语句之后。
  • KILL QUERY终止连接当前正在执行的语句,但保持连接本身不变。

使用show processlist 查看所有id

Kill 指令使用

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

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

?
1 2 -- 数据库锁住acctno=13记录 然后执行如下更新语句 update test set acctname = '12' where acctno=13

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

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

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

?
1 2 Connection connection = getConnection(); ((MysqlConnection)connection).getSession().getThreadId();

Statement cancel方法

我们使用JDBC编程方式对数据库进行操作时,可以也可以使用Statement对象的cancel方法进行取消,Mysql驱动内部也是发送Kill query threadId 指令,Mysql驱动cancel方法源码

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 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,很强大。

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

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

原文链接:https://juejin.cn/post/6910870242122661896

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容