登录到我的 Webmin 控制面板后,我发现几乎所有磁盘空间都已满。我搜索了系统上最大的十个文件/目录,发现一个名为 ibdata1 的文件占用了大约 94GB 的空间。它位于我的 /var/lib/mysql 目录中。
ibdata1 有什么用?我可以安全地删除它吗?我的假设是它是某种转储,但这只是猜测。
答案1
该文件ibdata1
是 InnoDB 基础架构的系统表空间。
它包含几个对 InnoDB 至关重要的信息类
- 表格数据页
- 表索引页
- 数据字典
- MVCC 控制数据
- 撤消空间
- 回滚段
- 双写入缓冲区(在后台写入页面以避免操作系统缓存)
- 插入缓冲区(更改二级索引)
请注意 ibdata1 在 InnoDB Universe 中的位置(右侧)
您可以ibdata1
通过启用innodb_file_per_table
.这将导致任何新创建的 InnoDB 表将数据和索引页存储在外部.ibd
文件中。
例子
- 数据目录是
/var/lib/mysql
CREATE TABLE mydb.mytable (...) ENGINE=InnoDB;
,创建/var/lib/mysql/mydb/mytable.frm
innodb_file_per_table
已启用,数据/索引页存储在/var/lib/mysql/mydb/mytable.ibd
innodb_file_per_table
已禁用,数据/索引页存储在ibdata1
无论 InnoDB 表存储在何处,InnoDB 的功能都需要查找表元数据并存储和检索脉动循环控制电路支持信息ACID 合规性和事务隔离。
以下是我过去关于从 ibdata1 中分离表数据和索引的文章
Oct 29, 2010
:我在 StackOverflow 上的原始帖子Nov 26, 2011
: 错误 1114 (HY000) 位于文件第 6308 行 & 表 user_analysis 已满Feb 03, 2012
:MySQL InnoDB 中表的定期优化Mar 25, 2012
:为什么InnoDB将所有数据库存储在一个文件中?Apr 01, 2012
:innodb_file_per_table 是否可取?
接下来做什么
您可以继续ibdata1
存储所有内容,但这会使执行 LVM 快照变得非常繁琐(我个人的观点)。
你需要使用我的StackOverflow 帖子并永久缩小该文件。
请运行此查询:
SELECT
((POWER(1024,3)*94 - InnoDBDiskDataAndIndexes))/POWER(1024,3) SpaceToReclaim
FROM
(SELECT SUM(data_length+index_length) InnoDBDiskDataAndIndexes
FROM information_schema.tables WHERE engine='InnoDB') A;
这将告诉应用 InnoDB Cleanup 后可以回收多少浪费的空间。
答案2
该文件是ibdata1
,不是ibdatal
,它包含您所有的 InnoDB 数据库。如果您删除它,您将丢失所有数据。
有关如何处理它的想法,请参阅如何在 MySQL 中收缩/清除 ibdata1 文件。
答案3
如果你使用 innodb 作为 MySQL 引擎,默认情况下将存储全部将您的数据库放入 ibdata1。此外还有日志文件 ib_logfile0 和 ib_logfile1。不要删除这些文件。
答案4
似乎没有人提到innodb_undo_log_truncate
设置可能产生的影响。
看看我的回答如何在 MySQL 中收缩/清除 ibdata1 文件在 StackOverflow 中。