【问题标题】:MySQL query not going away after being killedMySQL查询在被杀死后不会消失
【发布时间】:2011-02-18 15:39:33
【问题描述】:

我有一个 MySQL 查询,它将数据从一个表复制到另一个表进行处理。由于某种原因,这个通常需要几秒钟的查询在一夜之间被锁定并运行了几个小时。今天早上登录时,我试图杀死查询,但它仍然列在进程列表中。

| Id      | User     | Host      | db   | Command | Time  | State        | Info                                                                                 |
+---------+----------+-----------+------+---------+-------+--------------+--------------------------------------------------------------------------------------+
| 1061763 | tb_admin | localhost | dw   | Killed  | 45299 | Sending data | INSERT INTO email_data_inno_stage SELECT * FROM email_data_test LIMIT 4480000, 10000 |
| 1062614 | tb_admin | localhost | dw   | Killed  |   863 | Sending data | INSERT INTO email_data_inno_stage SELECT * FROM email_data_test LIMIT 4480000, 10000 |

这可能是什么原因造成的,我怎样才能终止这个进程以便继续我的工作?

【问题讨论】:

  • 如果你想选择核选项,弹跳 mysql 会解决这个问题。

标签: mysql


【解决方案1】:

如果表 email_data_test 是 MyISAM 并且它被锁定,那将会阻止 INSERT。

如果表 email_data_test 是 InnoDB,那么很多 MVCC 数据正在写入 ib_logfiles,这可能还没有发生。

在这两种情况下,您都让 LIMIT 子句滚动了 4,480,000 行,只是为了达到插入实际需要的 10,000 行。

杀死查询只会导致 InnoDB 表 email_data_inno_stage 执行回滚。

【讨论】:

  • 谢谢。该表是innodb。我知道这可能不是一个理想的方法,但是如果我处理了包含 7000 万条记录的整个 email_data_test 表,如果数据库甚至可以处理它,那将需要很长时间,所以我将它作为 10k 条记录的批次来处理。
  • 我实际上遇到了类似的问题,但我的是select count(*) query.,在我杀死它之后它仍然显示在进程列表中。来自 innodb_trx 的 trx 操作状态为 Countng Reads。知道为什么它会卡住吗?奇怪的是它与过去 1 个月的状态相同:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2019-02-08
  • 2020-10-23
相关资源
最近更新 更多