当前位置:数据库 > > 正文

mysql查询killed状态的进程(MySQL kill指令使用指南)

时间:2022-01-16 00:25:12类别:数据库

mysql查询killed状态的进程

MySQL kill指令使用指南
  • ?
  • 1
  • KILL [CONNECTION | QUERY] processlist_id
  • 在Mysql中每个连接都是单独线程运行,可以使用语句 KILL processlist_id statement.来终止语句执行。

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

    使用show processlist 查看所有id

    mysql查询killed状态的进程(MySQL kill指令使用指南)

    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

    mysql查询killed状态的进程(MySQL kill指令使用指南)

    如果想取消该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,很强大。

    mysql查询killed状态的进程(MySQL kill指令使用指南)

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

    以上就是MySQL kill指令使用指南的详细内容,更多关于MySQL kill指令的资料请关注开心学习网其它相关文章!

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

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐