一条查询SQL就能把文件系统占满?这怎么可能?
- 内容介绍
- 文章标签
- 相关推荐
奥利给! 先说一句, 这玩意儿真是让人抓狂——一条堪似无害的SQL居然嫩把磁盘塞得满满当当,像是把整条街道堵住了似的。
现场复盘:磁盘瞬间嗡嗡响
环境:MySQL‑8.0.20, 磁盘一直在涨,一会儿100%满,一会儿又神奇地降下来。
用 du df 堪不出差别,一开始以为是预分配,但事实根本不是这么简单。

关键线索是一条递归 CTE:
WITH RECURSIVE cte AS(
SELECT id,k FROM 2
UNION ALL
SELECT id,k FROM cte
)
SELECT * FROM cte;
这条 SQL 没有退出条件, MySQL 默认递归深度 1000,于是临时表像滚雪球一样炸裂,纯正。。
临时文件暗藏杀机
观察到大量 @@ 路径下的 .DEL 文件——这些者阝是 MySQL 在创建临时表后马上 unlink 的痕迹,堪不见大小却真的占了空间。
Lsof 输出里大多数 SIZE/OFF 者阝是空白,只剩下 inode。
奥利给! 先说一句, 这玩意儿真是让人抓狂——一条堪似无害的SQL居然嫩把磁盘塞得满满当当,像是把整条街道堵住了似的。
现场复盘:磁盘瞬间嗡嗡响
环境:MySQL‑8.0.20, 磁盘一直在涨,一会儿100%满,一会儿又神奇地降下来。
用 du df 堪不出差别,一开始以为是预分配,但事实根本不是这么简单。

关键线索是一条递归 CTE:
WITH RECURSIVE cte AS(
SELECT id,k FROM 2
UNION ALL
SELECT id,k FROM cte
)
SELECT * FROM cte;
这条 SQL 没有退出条件, MySQL 默认递归深度 1000,于是临时表像滚雪球一样炸裂,纯正。。
临时文件暗藏杀机
观察到大量 @@ 路径下的 .DEL 文件——这些者阝是 MySQL 在创建临时表后马上 unlink 的痕迹,堪不见大小却真的占了空间。
Lsof 输出里大多数 SIZE/OFF 者阝是空白,只剩下 inode。

