我们有一个应用程序,其中只有一个表将增长到数百万行,而其余的将略低于一百万行。那么我们应该使用 innodb_file_per_table 还是保留一个 .ibd 的建议是什么?我读过一些文章说不要使用它,因为在执行连接时您需要更多磁盘访问权限?为了报告生成目的,我们将在此表和其他表之间进行连接。
Rol*_*DBA 24
您必须使用innodb_file_per_table并且您需要使用 InnoDB 的当前基础架构进行一些清理。
我见过许多数据库托管客户端设置 MySQL 并将 InnoDB 保留在其默认状态。这会导致系统表空间(更好地称为 ibdata1)疯狂增长。
即使您切换到 innodb_file_per_table,也必须从 ibdata1 中提取 .ibd 文件,并且 ibdata 永远不会缩小。例如,如果您有一个名为 mydb.mytable 的表,该表位于 ibdata1 中,占用了 2GB,要提取它,您必须执行以下操作:
步骤 01) 将此添加到 /etc/my.cnf
[mysqld]
innodb_file_per_table
Run Code Online (Sandbox Code Playgroud)
步骤 02) service mysql restart
步骤 03) ALTER TABLE mydb.mytable ENGINE=InnoDB;
这将使文件 /var/lib/mysql/mydb/mytable.ibd
不幸的是,更改前表占用的 2GB 空间无法回收。我过去写过关于如何以及为什么清理 InnoDB 基础设施的帖子:
一旦你做了这个重大改变,不要忘记增加innodb_open_files (default 300)。否则,磁盘访问非常有限。
关于连接,请确保您拥有支持连接标准的正确索引。
在全新安装中使用 innodb_file_per_table 会导致 ibdata1 增长非常缓慢,因为所有 DDL 都是在 ibdata 外部完成的。您可以像我之前提到的那样缩小任何 InnoDB 表:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)
在备份方面,制作 .ibd 文件的副本时要格外小心。为什么?
每个 .ibd 文件中都有一个特殊的值,称为 tablespace_id。ibdata1 中有一个 tablespace_id 值列表。如果您曾经执行需要删除和重新创建表的表维护,则 tablespace_id 将变得不同。如果您还制作了 ibdata1 的副本,则制作此类 .ibd 文件的副本只能重新插入数据库以供使用。这会危及所有其他 InnoDB 表的 tablespace_id。鉴于此,最好执行 mysqldump 备份,因为 mysqldump 是数据的逻辑副本。换句话说,备份独立于 ibdata1 的时间点,您可以自由重新加载而不会出现可操作性问题。
小智 7
同意@RolandoMySQLDBA 的观点,他没有提到:备份。
如果您的 MySQL 备份机制已经全部制定完毕,并且您没有将其 .ibd 文件包含在您的文件系统备份策略中,那么这不是那么重要。但是考虑到向任何 innodb 表添加 ONE BYTES 将导致 .ibd 表的增量备份,否则您会发现备份存储很快就会用完。
| 归档时间: |
|
| 查看次数: |
17976 次 |
| 最近记录: |