在我的linux服务器上,今天早上我遇到了一个问题。我意识到在我杀死了整个晚上制作了大约200k数据库条目(大小为1GB)的所有后台任务之后,我的CPU使用率仍然是80%,这仅仅是因为MySQL。 重启或重启MySQL或nginx都不起作用。
“InnoDB将数据保存在正在更改的行中,并且应该使用仍在撤消日志中的数据透明地回答针对仍在回滚的更改的查询。”
我对这个主题不太熟悉,但似乎这就是为什么即使没有查询也会出现高CPU使用率的答案。当我SHOW PROCESSLIST
时,它显示三个连接,并在“状态”列中显示“复制到tmp表”。
我想现在我只需等待所有这些回滚过程完成,但为什么它们首先出现,我怎样才能避免这种情况再次发生?
答案 0 :(得分:1)
写入和索引更新是"延迟"。即使在所有查询完成后,这也可能导致I / O和CPU活动。
"复制到tmp表"在PROCESSLIST中暗示 仍然在运行。追查该查询。它可以通过更好的索引或重写来改进。杀死mysqld现在会导致代价高昂的回滚和/或重启mysqld。
在交易过程中终止某个流程会立即导致ROLLBACK
。更改应用程序以拦截' kill'并且优雅地等到事情处于关闭的良好位置。
UPDATEing
单个语句中的一百万行需要花费很长时间。也许你杀了那个(或类似的东西)?考虑使用PRIMARY KEY
上的1000行范围将这些内容分成几个块。