• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL kill指令使用指南
    KILL [CONNECTION | QUERY] processlist_id
    

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

    KILL允许可选 CONNECTION或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关闭

    -- 数据库锁住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

     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,很强大。

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

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

    您可能感兴趣的文章:
    • 详解MySQL kill 指令的执行原理
    • Mysql误删数据解决方案及kill语句原理
    • Mysql使用kill命令解决死锁问题(杀死某条正在执行的sql语句)
    • MySQL Slave 触发 oom-killer解决方法
    • MySQL OOM 系列三 摆脱MySQL被Kill的厄运
    • MySQL OOM 系统二 OOM Killer
    • percona-toolkit之pt-kill 杀掉mysql查询或连接的方法
    • 批量 kill mysql 中运行时间长的sql
    • MySQL kill不掉线程的原因
    上一篇:MySQL 索引的一些细节分享
    下一篇:mysql 5.7 的 /etc/my.cnf 参数介绍
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL kill指令使用指南 MySQL,kill,指令,使用指南,