默认情况下,MySQL InnoDB 将所有数据库的所有表存储在一个全局文件中。您可以通过在配置中设置 innodb_file_per_table 来更改此设置,然后为每个表创建一个数据文件。
我想知道为什么innodb_file_per_table
默认情况下不启用。使用它有什么缺点吗?
答案1
我对这个问题有完整的答案。
一次表 1. innodb_file_per_table已到位,并且可以使用ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
这将缩小新的 InnoDB 表,保证会缩小新.ibd
文件。
如果您ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
在使用 innodb_file_per_table 之前创建的 InnoDB 表上运行,它会从 ibdata1 文件中提取该表的数据和索引并将其存储在文件中.ibd
,这会在 ibdata1 中留下一个永久的、永远无法重复使用的鸽子。
该ibdata1
文件通常包含四类信息
- 表数据
- 表索引
- MVCC(多版本并发控制)数据
- 回滚段
- 撤消空间
- 表元数据(数据字典)
- 双写入缓冲区(后台写入以防止依赖操作系统缓存)
- 插入缓冲区(管理非唯一二级索引的更改)
- 查看
Pictorial Representation of ibdata1
这是永久缩小 ibdata1 文件的保证方法......
步骤 01)MySQLDump 所有数据库到一个 SQL 文本文件中(称之为 SQLData.sql)
步骤 02)删除所有数据库(mysql、information_schema 和 performance_schema 模式除外)
步骤 03)关闭 mysql
步骤 04)将以下行添加到 /etc/my.cnf
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
innodb_data_file_path=ibdata1:10M:autoextend
旁注:无论您对 innodb_buffer_pool_size 设置什么,请确保 innodb_log_file_size 是 innodb_buffer_pool_size 的 25%。
- 步骤 05) 删除 ibdata1、ib_logfile0 和 ib_logfile1(删除之前请参阅下面的更新!)
此时,/var/lib/mysql 中应该只有 mysql 模式
- 步骤 06)重新启动 mysql
这将重新创建 10MB 的 ibdata1(不配置选项),以及 1G 的 ib_logfile0 和 ib_logfile1
- 步骤 07)将 SQLData.sql 重新加载到 mysql
ibdata1
将会增长但仅包含表元数据和间歇性 MVCC 数据。
每个 InnoDB 表将存在于ibdata1
假设您有一个名为 mydb.mytable 的 InnoDB 表。如果您进入/var/lib/mysql/mydb
,您将看到两个代表该表的文件
mytable.frm
(存储引擎头)mytable.ibd
(的表数据和表索引主页mydb.mytable
)
ibdata1
将不再包含 InnoDB 数据和索引。
随着表 1. innodb_file_per_table选项中/etc/my.cnf
,您可以运行OPTIMIZE TABLE mydb.mytable
OR ALTER TABLE mydb.mytable ENGINE=InnoDB;
,文件/var/lib/mysql/mydb/mytable.ibd
实际上会缩小。
在我担任 MySQL DBA 的职业生涯中,我曾多次这样做,从那以后从未遇到过任何问题。事实上,我第一次这样做时,将 50GB 的 ibdata1 文件压缩为 50MB。
试试吧。如果您对此有其他问题,请给我发电子邮件。相信我。这在短期和长期内都会有效。
更新时间 2013-07-02 15:08 EDT
我在这方面有一个警告,我在其他帖子中更新过,但我错过了这一点:我正在用以下方法更新我的答案innodb_fast_shutdown因为我以前会重启 mysql 并停止 mysql 来执行此操作。现在,这一步至关重要,因为每个未提交的事务可能在 InnoDB 事务日志 (查看 InnoDB 基础设施)。
请注意设置innodb_fast_shutdown设置为 2 也会清除日志,但仍然存在更多移动部件,并在 mysqld 启动期间被选为崩溃恢复。设置为 0 是最佳选择。
答案2
答案3
innodb_file_per_table 在 MariaDB 中默认启用。
答案4
只是想补充一点信息
从 mysql 5.6.6 开始,它默认启用