KILL [CONNECTION | QUERY] processlist_id

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

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

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

使用show processlist 查看所有id

MySQL kill指令使用指南

Kill 指令使用

如果我们应用执行SQL后,由于锁select for update或者数量太大,导致执行SQL卡在数据库,此时想取消该SQL怎么办"htmlcode">

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

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

MySQL kill指令使用指南

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

MySQL kill指令使用指南

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

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

广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。