MySQL 复制临时表填充磁盘,如何删除临时文件?

MySQL 复制临时表填充磁盘,如何删除临时文件?

最安全的清理方法是什么?

Debian 8 上的 MySQL 服务器 5.5.62-0 没有复制。

我犯了一个错误,在 26GB 的表上创建了一个新列。SHOW PROCESSLIST显示 MySQL 正在以 100% 的 CPU 占用率将数据复制到临时表中。

+-----------+------+-----------+--------+---------+------+-------------------+------------------+
| Id        | User | Host      | db     | Command | Time | State             | Info             |
+-----------+------+-----------+--------+---------+------+-------------------+------------------+
| 145904211 | root | localhost | huge   | Query   |  160 | copy to tmp table | ALTER TABLE ...  |
| 145905739 | root | localhost | NULL   | Query   |    0 | NULL              | show processlist |
+-----------+------+-----------+--------+---------+------+-------------------+------------------+

几分钟后,主分区已满,CPU 降至 0。我systemctl stop mysql希望它能清理临时文件。服务也不会重新启动。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        79G   75G 1000K 100% /

$ sudo systemctl start mysql
Job for mysql.service failed. See 'systemctl status mysql.service' and 'journalctl -xn' for details.

我关闭了 VPS 并扩展了磁盘。服务器重新启动正常,我能够启动 MySQL 进程并连接到它。一切似乎都在运行。

然而自 20 分钟前的事件发生以来,磁盘使用量并没有减少。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       158G   75G   75G  50% /

管家服务会启动吗?还是我应该手动清理我弄乱的东西?最安全的方法是什么?

答案1

首先,从 mysql 命令行工具:

kill 145904211;

应该清理一下。如果没有,请四处寻找以 开头的文件#sql...。其中一个文件很大,带有ALTER运行时的时间戳。只需将其删除即可。

为了安全起见ALTER,至少在 5.5 天内,应像这样工作:

  1. 创建一个与现有表类似的新的空表。
  2. 更改架构(根据您的情况添加一列)
  3. 将现有表中的所有数据复制到新表。(较慢的部分)
  4. 对一些表进行重命名。
  5. 删除旧表。

您可能在第 3 步中间停滞了。

唯一有风险的时候是第 4 步,速度非常快,在此之前,旧表还好好的,在此之后,新表已经取代了它。

相关内容