时间:2021-05-02
? 1 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关闭
? 1 2 -- 数据库锁住acctno=13记录 然后执行如下更新语句 update test set acctname ='12' where acctno=13show 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
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
MYSQL初学者使用指南与介绍一、连接MYSQL。格式:mysql-h主机地址-u用户名-p用户密码1、例1:连接到本机上的MYSQL。首先在打开DOS窗口,然
javascript中setTimeout使用指南/*//方法1functionslows(){alert("15S后弹出!");}setTimeout("sl
这里我们使用dnsmasq对应的docker版本docker-dnsmasq。使用指南下载镜像dockerpulldocker-dnsmasq创建最简单的配置/
Docker-clientforpython使用指南:客户端初始化的三种方法importdockerdocker.api()docker.APIClient()
写好review,需要注意以下几点:测评对产品的包装、规格、结构整体性描述产品与众不同的亮点产品的缺点产品使用指南(来源:深圳拓扑)