各位用户为了找寻关于MySQL kill指令使用指南的资料费劲了很多周折。这里教程网为您整理了关于MySQL kill指令使用指南的相关资料,仅供查阅,以下为您介绍关于MySQL kill指令使用指南的详细内容
? 1KILL [
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 2Connection 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 42public
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