newbie14 Asked: 2012-04-01 19:44:49 +0800 CST2012-04-01 19:44:49 +0800 CST 2012-04-01 19:44:49 +0800 CST innodb_file_per_table 是否可取? 772 我们有一个应用程序,其中只有一个表将增长到数百万行,而其余的将略低于一百万。那么我们应该使用 innodb_file_per_table 还是保留一个 .ibd 的建议是什么?我读过一些文章说不要使用它,因为在执行连接时需要更多的磁盘访问权限?我们将在此表和其他表之间连接以生成报告。 mysql innodb 3 个回答 Voted Best Answer RolandoMySQLDBA 2012-04-01T20:18:44+08:002012-04-01T20:18:44+08:00 您必须使用innodb_file_per_table并且需要使用 InnoDB 的当前基础架构进行一些清理。 我见过许多数据库托管客户端设置 MySQL 并将 InnoDB 保留在默认状态。这会导致系统表空间(更好地称为 ibdata1)急剧增长。 即使您切换到 innodb_file_per_table,.ibd 文件也必须从 ibdata1 中提取,并且 ibdata 永远不会缩小。例如,如果您在 ibdata1 中有一个名为 mydb.mytable 的表占用 2GB,那么要提取它,您必须执行以下操作: 步骤 01) 将此添加到 /etc/my.cnf [mysqld] innodb_file_per_table 步骤 02)service mysql restart 步骤 03)ALTER TABLE mydb.mytable ENGINE=InnoDB; 这将使文件 /var/lib/mysql/mydb/mytable.ibd 遗憾的是,更改前该表占用的 2GB 空间无法回收。我写过关于如何以及为什么清理 InnoDB 基础设施的帖子: 为什么 InnoDB 将所有数据库存储在一个文件中? MySQL InnoDB 中表的计划优化 ERROR 1114 (HY000) at line 6308 in file & The table user_analysis is full 我在 StackOverflow 中的原始帖子 一旦你做出这个重大改变,不要忘记增加innodb_open_files (default 300)。否则,磁盘访问非常有限。 关于连接,请确保您有支持连接条件的适当索引。 更新 2012-04-02 11:30 EDT 在全新安装中使用 innodb_file_per_table 会导致 ibdata1 增长非常缓慢,因为所有 DDL 都是在 ibdata 外部完成的。您可以像我之前提到的那样收缩任何 InnoDB 表: ALTER TABLE mydb.mytable ENGINE=InnoDB; 更新 2012-04-02 16:50 EDT 在备份方面,制作 .ibd 文件的副本时要格外小心。为什么? 在每个 .ibd 文件中都有一个特殊的值,称为 tablespace_id。ibdata1 中有一个 tablespace_id 值列表。如果您曾经执行需要删除和重新创建表的表维护,tablespace_id 将变得不同。如果您还制作了 ibdata1 的副本,则制作此类 .ibd 文件的副本只能集成回数据库以供使用。这会危及所有其他 InnoDB 表的 tablespace_id。鉴于此,最好执行 mysqldump 备份,因为 mysqldump 是数据的逻辑副本。换句话说,备份独立于 ibdata1 的时间点,您可以自由地重新加载而不会出现可操作性问题。 Jan Steinman 2012-04-03T10:09:20+08:002012-04-03T10:09:20+08:00 同意@RolandoMySQLDBA,因为他没有提到:备份。 如果您的 MySQL 备份机制已全部解决,并且您没有在文件系统备份策略中包含它的 .ibd 文件,那么这并不是那么重要。但考虑到向任何 innodb 表添加 ONE BYTES 会导致 .ibd 表的增量备份,否则您会发现备份存储很快就会用完。 glglgl 2012-04-04T00:00:26+08:002012-04-04T00:00:26+08:00 我有一个应用程序正好遇到这种情况:一些大表和一些小表。 我决定把小的放在ibdata1一边,把大的放在自己的文件里。 我这样做innodb_file_per_table是默认打开的,只是暂时关闭它以将表格移动到ibdata1with ALTER TABLE。
您必须使用innodb_file_per_table并且需要使用 InnoDB 的当前基础架构进行一些清理。
我见过许多数据库托管客户端设置 MySQL 并将 InnoDB 保留在默认状态。这会导致系统表空间(更好地称为 ibdata1)急剧增长。
即使您切换到 innodb_file_per_table,.ibd 文件也必须从 ibdata1 中提取,并且 ibdata 永远不会缩小。例如,如果您在 ibdata1 中有一个名为 mydb.mytable 的表占用 2GB,那么要提取它,您必须执行以下操作:
步骤 01) 将此添加到 /etc/my.cnf
步骤 02)
service mysql restart
步骤 03)
ALTER TABLE mydb.mytable ENGINE=InnoDB;
这将使文件 /var/lib/mysql/mydb/mytable.ibd
遗憾的是,更改前该表占用的 2GB 空间无法回收。我写过关于如何以及为什么清理 InnoDB 基础设施的帖子:
一旦你做出这个重大改变,不要忘记增加innodb_open_files (default 300)。否则,磁盘访问非常有限。
关于连接,请确保您有支持连接条件的适当索引。
更新 2012-04-02 11:30 EDT
在全新安装中使用 innodb_file_per_table 会导致 ibdata1 增长非常缓慢,因为所有 DDL 都是在 ibdata 外部完成的。您可以像我之前提到的那样收缩任何 InnoDB 表:
更新 2012-04-02 16:50 EDT
在备份方面,制作 .ibd 文件的副本时要格外小心。为什么?
在每个 .ibd 文件中都有一个特殊的值,称为 tablespace_id。ibdata1 中有一个 tablespace_id 值列表。如果您曾经执行需要删除和重新创建表的表维护,tablespace_id 将变得不同。如果您还制作了 ibdata1 的副本,则制作此类 .ibd 文件的副本只能集成回数据库以供使用。这会危及所有其他 InnoDB 表的 tablespace_id。鉴于此,最好执行 mysqldump 备份,因为 mysqldump 是数据的逻辑副本。换句话说,备份独立于 ibdata1 的时间点,您可以自由地重新加载而不会出现可操作性问题。
同意@RolandoMySQLDBA,因为他没有提到:备份。
如果您的 MySQL 备份机制已全部解决,并且您没有在文件系统备份策略中包含它的 .ibd 文件,那么这并不是那么重要。但考虑到向任何 innodb 表添加 ONE BYTES 会导致 .ibd 表的增量备份,否则您会发现备份存储很快就会用完。
我有一个应用程序正好遇到这种情况:一些大表和一些小表。
我决定把小的放在
ibdata1
一边,把大的放在自己的文件里。我这样做
innodb_file_per_table
是默认打开的,只是暂时关闭它以将表格移动到ibdata1
withALTER TABLE
。