在生产服务器上,我更改了“innodb_file_per_table=ON”,我可以看到服务器上每个表的单独表空间文件。我对表使用了分区,因此每个分区都有一个单独的 .ibd 文件。
但我可以看到以前的 10 Gb 大小的“ibdata1”文件。我有点好奇删还是不删?
MySQL 是否仍然使用旧的共享表空间“ibdata”文件?
如果我删除共享表空间文件“ibdata1”,会对服务器产生任何影响吗?它会引起任何问题吗?
在生产服务器上,我更改了“innodb_file_per_table=ON”,我可以看到服务器上每个表的单独表空间文件。我对表使用了分区,因此每个分区都有一个单独的 .ibd 文件。
但我可以看到以前的 10 Gb 大小的“ibdata1”文件。我有点好奇删还是不删?
MySQL 是否仍然使用旧的共享表空间“ibdata”文件?
如果我删除共享表空间文件“ibdata1”,会对服务器产生任何影响吗?它会引起任何问题吗?
很好的问题,也是一个非常普遍的问题。
当您将服务器配置更改为 时
innodb_file_per_table = 1
,表仍然存在于公共表空间中。您仍然必须重新创建那些使用ALTER TABLE ENGINE=InnoDB
(或强制重新创建表空间的任何其他操作)。一旦你这样做了,为什么 MySQL 仍然有一个巨大的 ib_data1?事实上,InnoDB 不能真正收缩(碎片整理)它的表空间文件。在大多数情况下,这不是一个大问题,因为每个文件中的可用空间都可以被其他数据、索引等页面使用,并且一旦开始使用
innodb_file_per_table
,您总是可以单独重新创建每个单独的表空间以释放文件系统空间。然而,公共表空间是特殊的。即使它不包含任何表或索引信息,它始终是强制性的,因为它存储公共数据,如数据字典、更改缓冲区等。因此,如果删除它,最终将导致 mysql 安装完全无法使用。回答你的问题:1)是的,它仍在使用,2)如果删除它,你将无法再次重新启动 mysql。但是,很明显,大部分 ibdata1 文件都是空的,只是很难移动页面地址。
这是 InnoDB 架构的图示,因此您可以看到 ibdata1 的内容
那么,您是否必须永远忍受 10GB 的文件?好吧,这当然是有可能的,但是有一些方法可以摆脱它,具体取决于服务器版本和您对可用性的需求:
这是一个非常常见的操作,我曾被问及并执行过 MySQL DBA。希望这可以帮助。