• 欢迎访问IT乐园(o゚▽゚)o
  • 推荐使用最新版火狐浏览器和Chrome浏览器访问本网站。

mysql 中批量使用 kill 解决表死锁

编程开发 fhy 7年前 (2017-11-17) 5086次浏览 0个评论

查看死锁

SHOW OPEN TABLES WHERE In_use > 0;
SHOW PROCESSLIST

以下内容来自 mysql 手册:

13.5.5.3. KILL 语法
KILL [CONNECTION | QUERY] thread_id
每个与 mysqld 的连接都在一个独立的线程里运行,您可以使用 SHOW PROCESSLIST 语句查看哪些线程正在运行,并使用 KILL thread_id 语句终止一个线程。

KILL 允许自选的 CONNECTION 或 QUERY 修改符:

· KILL CONNECTION 与不含修改符的 KILL 一样:它会终止与给定的 thread_id 有关的连接。

· KILL QUERY 会终止连接当前正在执行的语句,但是会保持连接的原状。

如果您拥有 PROCESS 权限,则您可以查看所有线程。如果您拥有 SUPER 权限,您可以终止所有线程和语句。否则,您只能查看和终止您自己的线程和语句。

您也可以使用 mysqladmin processlist 和 mysqladmin kill 命令来检查和终止线程。

注释:您不能同时使用 KILL 和 Embedded MySQL Server 库,因为内植的服务器只运行主机应用程序的线程。它不能创建任何自身的连接线程。

当您进行一个 KILL 时,对线程设置一个特有的终止标记。在多数情况下,线程终止可能要花一些时间,这是因为终止标记只会在在特定的间隔被检查:

· 在 SELECT, ORDER BY 和 GROUP BY 循环中,在读取一组行后检查标记。如果设置了终止标记,则该语句被放弃。

· 在 ALTER TABLE 过程中,在每组行从原来的表中被读取前,检查终止标记。如果设置了终止标记,则语句被放弃,临时表被删除。

· 在 UPDATE 或 DELETE 运行期间,在每个组读取之后以及每个已更行或已删除的行之后,检查终止标记。如果终止标记被设置,则该语句被放弃。注意,如果您正在使用事务,则变更不会被 回滚。

· GET_LOCK()会放弃和返回 NULL。

· INSERT DELAYED 线程会快速地刷新(插入)它在存储器中的所有的行,然后终止。

· 如果线程在表锁定管理程序中(状态:锁定),则表锁定被快速地放弃。

· 如果在写入调用中,线程正在等待空闲的磁盘空间,则写入被放弃,并伴随”disk full”错误消息。

· 警告:对 MyISAM 表终止一个 REPAIR TABLE 或 OPTIMIZE TABLE 操作会导致出现一个被损坏的没有用的表。对这样的表的任何读取或写入都会失败,直到您再次优化或修复它(不中断)。

通过 information_schema.processlist 表中的连接信息生成需要处理掉的 MySQL 连接的语句临时文件,然后执行临时文件中生成的指令:

mysql> select concat('KILL ',id,';') from information_schema.processlist where user='root';
+------------------------+
| concat('KILL ',id,';') 
+------------------------+
| KILL 3101;             
| KILL 2946;             
+------------------------+
2 rows in set (0.00 sec)

mysql>select concat('KILL ',id,';') from information_schema.processlist where user='root' into outfile '/tmp/unlock.txt';
Query OK, 2 rows affected (0.00 sec)

mysql>source /tmp/unlock.txt;
Query OK, 0 rows affected (0.00 sec)

IT 乐园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:mysql 中批量使用 kill 解决表死锁
喜欢 (10)
关于作者:
九零后挨踢男
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址