Bitnami环境下/opt/bitnami/mysql/data目录持续扩容问题求助
问题分析与解决方案
核心原因解释
ls -l显示的是目录本身的元数据占用空间(存储文件名、inode等信息的磁盘块大小),只要目录的元数据没超出当前分配的磁盘块(你这里是12KB),显示的大小就会固定;而du -b统计的是目录下所有文件的已分配磁盘空间,包括那些已经被删除但仍被MySQL进程占用的文件——这类文件在文件系统中已不可见(ls无法找到),但磁盘空间不会被操作系统回收,直到持有文件句柄的进程释放它。
你的场景中,空间持续增长的最可能原因是:
- MySQL运行中产生的临时文件、二进制日志(binlog)或中继日志被手动删除,但MySQL进程仍持有这些文件的句柄,导致磁盘空间无法释放;
- InnoDB的共享表空间(
ibdata1)不断膨胀(比如频繁创建/删除表、写入数据),且InnoDB不会自动将未使用的空间归还操作系统,只会标记为内部可复用。
排查与解决步骤
1. 定位被进程占用的已删除文件
执行以下命令,找出MySQL进程持有的已删除文件:
sudo lsof | grep '/opt/bitnami/mysql/data' | grep deleted
如果输出结果中有相关文件,说明这些文件就是占用空间的“隐形”文件。
2. 清理MySQL二进制日志(若涉及binlog)
如果排查到是二进制日志被占用,不要手动删除binlog文件,而是用MySQL自带命令清理:
-- 清理某个时间点之前的binlog PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00'; -- 或者保留最近7天的binlog PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);
同时修改MySQL配置文件(/opt/bitnami/mysql/my.cnf),设置自动清理:
# 自动清理7天前的binlog expire_logs_days = 7
修改后重启MySQL服务生效:
sudo /opt/bitnami/ctlscript.sh restart mysql
3. 释放被占用的磁盘空间
如果确认是进程持有已删除文件导致的空间占用,最直接的方式是重启MySQL服务,让进程释放文件句柄,操作系统会自动回收空间:
sudo /opt/bitnami/ctlscript.sh restart mysql
注意:请在业务低峰期操作,避免影响服务可用性。
4. 检查InnoDB共享表空间(可选)
如果是ibdata1持续膨胀,可通过以下SQL查看数据库实际数据大小:
SELECT table_schema AS '数据库', SUM(data_length + index_length) / 1024 / 1024 AS '实际占用(MB)' FROM information_schema.tables GROUP BY table_schema;
如果实际数据大小远小于du统计的data目录大小,说明ibdata1中有大量未释放的空间。这种情况需要导出数据、重建InnoDB表空间才能彻底释放空间,步骤如下:
- 导出所有数据库数据;
- 停止MySQL服务;
- 删除
ibdata1、ib_logfile*文件; - 修改
my.cnf添加innodb_file_per_table=1(确保新表使用独立表空间); - 重启MySQL服务,重新导入数据。
内容的提问来源于stack exchange,提问作者XRRX
相关产品推荐
相关产品推荐

