mysql中杀进程占用时间长的内部原因

Nan*_*nne 6 mysql innodb process

我复制了一个大表的结构(顺便说一句,它是一个InnoDB表)

CREATE TABLE tempTbl LIKE realTbl 
Run Code Online (Sandbox Code Playgroud)

然后我更改了一个索引,并填充它以便我可以运行一些测试。使用以下方法填充它:

INSERT INTO  `tmpTbl` 
SELECT *
FROM `realTbl`
Run Code Online (Sandbox Code Playgroud)

这花了太长时间,所以我想停止这个测试。1

我在处于“发送数据”状态时终止了该进程:它现在已“终止”,并且仍处于“正在发送数据”状态。

我知道一些被杀死的进程需要恢复更改,因此与它们运行的​​时间相比可能需要(同样?)很长时间才能杀死,但我无法想象为什么现在会出现这种情况:需要清空整个表。

我很好奇正在发生的事情需要停止/终止这样一个简单的查询很长时间。给你一些数字:插入运行了一个小时或 3 个小时,现在杀死接近5 7。看起来它几乎DELETE每次都运行一次INSERT,并且删除比插入花费的时间更长?这甚至合乎逻辑吗?

(如果有人知道如何将我的测试服务器恢复原状也很好,因为它正在消耗一些资源,但目前这并不重要:))


1) 我还不知道为什么(它是一个大表,10M 行,但它应该需要那么长时间?),但这是另一件事/不是这个问题的一部分:)。可能是我的测试本可以更聪明或更快速,但这也不是现在的问题:D

Der*_*ney 13

kill 花费这么长时间的原因很可能是由于 innodb 事务发出的回滚。来自InnoDB 性能提示

小心大量插入的大回滚:InnoDB 使用插入缓冲区来保存插入中的磁盘 I/O,但在相应的回滚中没有使用这种机制。磁盘绑定回滚的执行时间可能是相应插入的 30 倍。终止数据库进程无济于事,因为回滚在服务器启动时再次启动。

编辑:InnoDB的强制恢复方法可能是使用的你(很高兴你这样做是在测试环境下)

您可以终止 mysqld 进程并将 innodb_force_recovery 设置为 3 以在不回滚的情况下启动数据库,然后删除导致失控回滚的表。

下一次,每次插入一小部分数据。插入 1000 万行不应该花那么长时间,但可能有多种原因。在不了解您的环境的情况下,我无法就此提供建议。