32 | 为什么还有kill不掉的语句?
32 | 为什么还有kill不掉的语句?
讲述:林晓斌
时长13:38大小12.46M
收到 kill 以后,线程做什么?
另外两个关于客户端的误解
小结
上期问题时间
赞 51
提建议
精选留言(48)
- Leon📷置顶2019-01-30kill connection本质上只是把客户端的sql连接断开,后面的执行流程还是要走kill query的,是这样理解吧
作者回复: 这个理解非常到位👍 额外的一个不同就是show processlist的时候,kill connection会显示“killed” 这两句加起来可以用来替换我们文中的描述👍
112 - learn more2019-12-26老师好,文中 set global innodb_thread_concurrency=2的那个例子,前面 Session A 和 Session B 已经占用了两个线程了,那为什么我们还可以在一个新的Session中执行 Kill 或 show full processlist 命令呢?
作者回复: 执行kill的时候没进InnoDB,不受这个参数限制的
88 - 钱2019-08-04kill不掉 1:kill命令被堵了,还没到位 2:kill命令到位了,但是没被立刻触发 3:kill命令被触发了,但执行完也需要时间 和猜测较近,估计所有的kill命令,kill不掉时都是这么个原因共 1 条评论52
- Mr.sylar2019-01-25老师,我想问下这些原理的"渔"的方法除了看源码,还有别的建议吗
作者回复: 不同的知识点不太一样哈, 有些可以看文档; 有些可以自己验证; 还有就是看其他人文章,加验证;(就是我们这个专栏的方法^_^)
共 2 条评论22 - 夹心面包2019-01-25对于结尾的问题,我觉得肯定是等待,即便是mysql重启,也是需要对未提交的事务进行回滚操作的,保证数据库的一致性21
- wjz19912019-02-13老师,之前也是有遇到程序问题导致cpu爆满,临时先把innodb_thread_concurrency设置为16(降低cpu避免影响同机器实例),然后不断去kill,后面程序人员修复了这个问题后,一堆的killed的语句不释放,设置innodb_thread_concurrency=0,等了半个月都没释放,后面还是安排主从切换,强制重启解决,请问老师,这是为什么?
作者回复: 如果是因为这个原因的,应该是设置innodb_thread_concurrency=0就会退出的。。 你这个情况可能卡在别的地方了,下次如果再出现,要重启之前,用pstack保留个现场哦
共 2 条评论19 - Lukia2019-02-19请教老师,删除中间列和修改末尾列这两种DDL的差别在什么地方呢? 作者回复: 对,其实只有 改索引、 加最后一列、删最后一列 其他的大多数不行,比如删除中间一列这种
作者回复: 删除中间列,就没办法用切换的那个方案。 MySQL的备库比主库多一个字段或少一个字段,这时候日志还是可以应用成功的(但如果少的是中间一个字段,字段就会对应错了)
共 3 条评论16 - 7002019-01-25老师,请教。 1)文中开头说“当然如果这个线程有语句正在执行,也是要先停止正在执行的语句的”。我个人在平时使用中就是按默认的执行,不管这个线程有无正在执行语句。不知这样会有什么潜在问题? 2)文中说“实际上,执行 Ctrl+C 的时候,是 MySQL 客户端另外启动一个连接,然后发送一个 kill query 命令“。这个怎么解释呢? 我开启 general log 的时候执行 Ctrl+C 或 Ctrl+D 并没有看到有另外启动一个连接,也没有看到 kill query 命令。general log 中仅看到对应线程 id 和 Quit。 3)MySQL 为什么要同时存在 kill query 和 kill connection,既然 kill query 有无效的场景,干嘛不直接存在一个 kill connection 命令就好了?那它俩分别对应的适用场景是什么,什么时候考虑 kill query,什么时候考虑 kill connection?我个人觉得连接如果直接被 kill 掉大不了再重连一次好了。也没啥损失。 4)小小一个总结,不知对否? kill query - 会出现无法 kill 掉的情况,只能再次执行 kill connection。 kill connection - 会出现 Command 列显示成 Killed 的情况。展开
作者回复: 1. 一般你执行kill就是要停止正在执行的语句,所以问题不大😋 2. 不应该呀, KILL QUERY 是大写哦,你再grep一下日志; 3. 多提供一种方法嘛。kill query是指你只是想停止这个语句,但是事务不会回滚。一般kill query是发生在客户端执行ctrl+c的时候啦。平时紧急处理确实直接用kill + thread_id。 好问题 4. 对,另外,在kill query无效的时候,其实kill connection也是无效的
共 6 条评论12 - HuaMax2019-01-26课后题。我认为需要看当时的业务场景。重启会导致其他的连接也断开,返回给其他业务连接丢失的错误。如果有很多事务在等待该事务的锁,则应该重启,让其他事务快速重试获取锁。另外如果是RR的事务隔离级别,长事务会因为数据可见性的问题,对于多版本的数据需要找到正确的版本,对读性能是不是也会有影响,这时候重启也更好。个人理解,请老师指正。
作者回复: 有考虑到对其他线程的影响,这个👍 其实这种时候往往是要先考虑切换(当然重启也是切换的) 如果只看恢复时间的话,等待会更快
11 - gaohueric2019-01-26老师您好,一个表中 1个主键,2个唯一索引,1个普通索引 4个普通字段,当插入一条全部字段不为空的数据时,此时假设有4个索引文件,分别对应 主键 唯一性索引,普通索引,假设内存中没有这个数据页,那么server是直接调用innodb的接口,然后依次校验 (读取磁盘数据,验证唯一性)主键,唯一性索引,然后确认无误A时刻之后,吧主键和唯一性索引的写入内存,再把普通索引写入change buffer?那普通数据呢,是不是跟着主键一块写入内存了?展开
作者回复: 1. 是的,如果普通索引上的数据页这时候没有在内存中,就会使用change buffer 2. “那普通数据呢,是不是跟着主键一块写入内存了?” 你说的是无索引的字段是吧,这些数据就在主键索引上,其实改的就是主键索引。
10 - 7002019-01-27老师,您好。客户端版本如下: mysql Ver 14.14 Distrib 5.7.24, for linux-glibc2.12 (x86_64) using EditLine wrapper 老师,再请教另一个问题。并非所有的 DDL 操作都可以通过主从切换来实现吧?不适用的场景有哪些呢?
作者回复: 对,其实只有 改索引、 加最后一列、删最后一列 其他的大多数不行,比如删除中间一列这种
9 - 千年孤独2019-01-27可能不是本章讨论的问题,我想请问老师“MySQL使用自增ID和UUID作为主键的优劣”,基于什么样的业务场景用哪种好?
作者回复: 后面会有文章会提到这个问题哈:)
4 - Geek_a678652019-01-26也遇到@发条橙子一样的问题,例如队列两个消息同时查询库存,发现都不存在,然后就都执行插入语句,一条成功,一条报唯一索引异常,这样程序日志会一直显示一个唯一索引报错,然后重试执行更新,我暂时是强制查主库
作者回复: “我暂时是强制查主库” 从这就看你是因为读是读的备库,才出现这个问题的是吧。 发条橙子的问题是,他都是操作主库。 其实如果索引有唯一键,就直接上insert。 然后碰到违反唯一键约束就报错,这个应该就是唯一键约束正常的用法吧😆
4 - 杜嘉嘉2019-01-25我想请问下老师,一个事务执行很长时间,我去kill。那么,执行这个事务过程中的数据会不会回滚?
作者回复: 这个事务执行过程中新生成的数据吗? 会回滚的
4 - 似水流年2019-03-13老师,请问我直接在操作系统层面用kill命令掉会话的进程,这个会话的事物应该会回滚,除此外有不良影响吗?
作者回复: 就是回滚的影响,没有其他的了
共 2 条评论3 - think_wtw2019-02-13老师如果正在执行ddl 比如删除一列或者创建一个索引,执行kill query也是事物进行回滚的是吗?内部会做什么操作? 来得晚还没追上课程。谢谢解答!
作者回复: 对,进行回滚 取决于做到什么程度了,总之效果就是中间生成的数据全部清理掉,恢复到未执行ddl之前的状态
3 - undifined2019-01-25如果此时仅有一个事务在执行,可以重启,此时 redo log 没有被fsync 到磁盘,重新启动恢复的时候也不会提交该事务 如果有其他事务在执行,就应该等待执行完成 老师这样理解对吗,谢谢老师
作者回复: 这个事务现在是处于回滚状态, 即使有其他事务在执行,重启后也是要回滚的,跟有没有其他事务在并行执行是没关系的哦
3 - 茶没喝完2021-02-25kill只是修改了线程状态+发出中断信号 具体被中断的线程在收到中断信号怎么处理,由它自己决定。 直接杀死线程是不安全的,线程占用的资源没法释放,回滚操作没完成等等。1
- 斜面镜子 Bill2019-01-28“采用不缓存的方式时,如果本地处理得慢,就会导致服务端发送结果被阻塞,因此会让服务端变慢” 这个怎么理解?
作者回复: 堵住了不就变慢了😆
2 - Geek_a678652019-01-26老师好,我猜发条橙子的问题 因为很多日志监控会统计error日志,这样并不很优雅,觉得他是想有什么办法规避这种并发引起的问题,
作者回复: 嗯嗯 不过我也确实没有想到更好的方法 毕竟两个线程要同时发起一个insert操作,这个服务端也拦不住呀😆
1