MySQL 5.7 与 5.5 以及 .ibd 文件

MySQL 5.7 与 5.5 以及 .ibd 文件

我们最近在两台不同的服务器上从 MySQL 5.5 迁移到 MySQL 5.7。对于迁移,我们使用了主从复制。旧数据库 (5.5) 设置为主数据库,新数据库设置为从数据库 (5.7)。

一切顺利,迁移成功。DB很大,大约600G数据。

我们现在遇到的问题是,在新数据库上,有一个 82G 的大 .ibd 文件。假设数据库名称为 my_database。此文件位于:/var/lib/mysql/my_database:

-rw-r----- 1 mysql mysql 82G Apr 20 10:28 articles.ibd

文章表很大,但是为什么在新的 MySQL 服务器上有这么大的 ibd 文件,而在旧的服务器上却没有。

由于我们现在有一些存储限制(SSD),我们想以某种方式删除此文件。如何做以及为什么在 MySQL5.7 上创建此文件?

据我们检查,这是由于https://dev.mysql.com/doc/refman/5.7/en/innodb-multiple-tablespaces.htmlSET GLOBAL innodb_file_per_table = OFF;,但是禁用此选项并删除 .ibd 文件并重新启动 MySQL是否安全?

答案1

因为在进行复制时 innodb_file_per_table 已启用,所以它会为每个表创建 .ibd 文件,如果禁用 per_table,则不会创建每个表的 .ibd 文件,数据将存储在名为 ibdata1 的单个文件中,但由于您已经复制并且数据已创建,因此您无法删除单个 .ibd 文件,这样做将删除表中的所有数据

建议您创建一个新的复制副本并禁用 per_table,或者您可以从表中删除/存档一些旧数据,然后优化表.这将恢复/减少 .ibd 文件的大小并节省一些磁盘空间

您可以尝试使用以下方式进行备份Percona Xtrabackup如果你不想再次转储或复制 mysql,可以使用这个工具

答案2

能够找到一个解决方案,它是关于使用 SET GLOBAL innodb_file_per_table = OFF; 禁用 innodb_file_per_table,或者在 my.cnf 文件中进行设置,然后通过运行以下命令删除 ibd 文件:

ALTER TABLE [TABLENAME] ENGINE=InnoDB ALGORITHM=COPY;

感谢这个答案:https://stackoverflow.com/a/49939925/1165041

相关内容