我删除了几 GB 的 MySQL 数据,但这些数据还没有返回到文件系统。我的磁盘快满了,我该怎么办?所有数据都在 ibdata1 文件中,因为它是 InnoDB。
我已经尝试过 mysqloptimize -A -o,但没有帮助。
编辑:服务器版本:5.0.51a-24+lenny2+spu1(Debian)
答案1
因为您似乎有一个整体的 innodb 文件 - 所以您无法缩小它。
如果您可以承受停机时间,请执行以下操作:
- 停止 mysql。
- 对 mysql 数据目录 [包括 ibdata 和 innodb 日志文件] 中的所有文件/目录进行基于文件的备份。
- 启动 mysql,运行mysqldump -uroot -ppass -A > 文件.sql
- 再次停止 mysql
- 重新配置 mysql 以使用每张表一个文件对于 innodb [ 添加到 my.cnf innodb_file_per_table ]
- 删除数据库的 innodb ibdata/log 文件/目录
- 启动 mysql 并从第 3 点的备份中恢复数据 -cat 文件.sql|mysql -uroot -ppass
将来,您将能够备份和删除单个表,然后恢复它 - 这要归功于每个表一个文件选项。
删除数据后(步骤 6),您需要使用“mysqld --skip-grant-tables”进行启动,否则 mysqld 将无法启动,因为没有授权表。
答案2
如果您已innodb_file_per_table
启用,请按照以下说明操作。但是,如果尚未使用,则需要完全重新创建架构才能释放空间。
使用 InnoDB,您需要alter
表。较新版本的 MySQL 也具有同样的功能optimize table
。
对于大型表格要小心,因为这些命令会锁定表格。
答案3
当你将数据放入允许扩展的表中时,其大小会增加。当你从表中删除数据时,其大小保持不变。
您可以做以下几件事:
1) 按照华纳建议的那样,修改表格,以减小尺寸。
2) 优化表格(如果支持的话)。这应该也能减少尺寸。
3)备份表,删除表,然后将数据重新导入新表。
在任何情况下,您都应该先备份数据。如果您定期删除数据,则应该定期运行 cronjob 来优化或更改。无论您运行的是 MySQL、MSSQL 还是 Oracle,情况都是如此。它们都需要维护。
@Warner:嗯,主要是个人偏好。首先我要说的是,我不会将 MySQL 用于任何性能至关重要的事情,如果我要使用它,我会进行优化,然后修改表以使其更大,这样就不会出现扩展损失。
对我来说,它 100% 是自动化和易于维护。运行优化可使一切保持整洁。