![MySQL 复制临时表填充磁盘,如何删除临时文件?](https://linux22.com/image/747393/MySQL%20%E5%A4%8D%E5%88%B6%E4%B8%B4%E6%97%B6%E8%A1%A8%E5%A1%AB%E5%85%85%E7%A3%81%E7%9B%98%EF%BC%8C%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6%EF%BC%9F.png)
最安全的清理方法是什么?
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 天内,应像这样工作:
- 创建一个与现有表类似的新的空表。
- 更改架构(根据您的情况添加一列)
- 将现有表中的所有数据复制到新表。(较慢的部分)
- 对一些表进行重命名。
- 删除旧表。
您可能在第 3 步中间停滞了。
唯一有风险的时候是第 4 步,速度非常快,在此之前,旧表还好好的,在此之后,新表已经取代了它。