默认情况下,MySQL InnoDB 将所有数据库的所有表存储在一个全局文件中。您可以通过在配置中设置 innodb_file_per_table 来更改这一点,然后为每个表创建一个数据文件。
我想知道为什么innodb_file_per_table默认情况下不启用。使用它有什么缺点吗?
Rol*_*DBA 36
我对这个有完整的答案。
一旦innodb_file_per_table就位,新的 InnoDB 表就可以收缩使用ALTER TABLE <innodb-table-name> ENGINE=InnoDB';这将收缩新.ibd文件保证。
如果您ALTER TABLE <innodb-table-name> ENGINE=InnoDB';在使用 innodb_file_per_table 之前创建的 InnoDB 表上运行,它将从 ibdata1 文件中拉出该表的数据和索引并将其存储在一个.ibd文件中,这将在 ibdata1 中留下一个永远无法重用的永久鸽子整体.
该ibdata1文件通常包含四种类型的信息
Pictorial Representation of ibdata1这是几乎永远缩小 ibdata1 文件的有保证的方法......
STEP 01) MySQLDump 所有数据库到一个 SQL 文本文件中(称之为 SQLData.sql)
STEP 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
Run Code Online (Sandbox Code Playgroud)
旁注:无论您为 innodb_buffer_pool_size 设置什么,请确保 innodb_log_file_size 是 innodb_buffer_pool_size 的 25%。
此时,/var/lib/mysql中应该只有mysql模式
这将在 10MB 处重新创建 ibdata1(不配置选项),ib_logfile0 和 ib_logfile1 分别为 1G
ibdata1 会增长但只包含表元数据和间歇性 MVCC 数据。
每个 InnoDB 表都将存在于 ibdata1
假设您有一个名为 mydb.mytable 的 InnoDB 表。如果您进入/var/lib/mysql/mydb,您将看到代表表的两个文件
mytable.frm (存储引擎标题)mytable.ibd(表数据和表索引的主页mydb.mytable)ibdata1 将不再包含 InnoDB 数据和索引。
使用innodb_file_per_table选项/etc/my.cnf,您可以运行OPTIMIZE TABLE mydb.mytableORALTER TABLE mydb.mytable ENGINE=InnoDB;并且文件/var/lib/mysql/mydb/mytable.ibd实际上会缩小。
在我作为 MySQL DBA 的职业生涯中,我已经多次这样做了,此后没有任何问题。事实上,我第一次这样做时,我将一个 50GB 的 ibdata1 文件压缩成 50MB。
试一试。如果您对此有更多疑问,请给我发电子邮件。相信我。这将在短期和长期内奏效。
在这方面我有一个警告,我在我的其他帖子中进行了更新,但我错过了这一点:我正在使用innodb_fast_shutdown更新我的答案,因为我曾经重新启动 mysql 并停止 mysql 来执行此操作。现在,这一步至关重要,因为每个未提交的事务可能在 InnoDB 事务日志内部和外部都有其他移动部分(请参阅 InnoDB 基础架构)。
请注意,将innodb_fast_shutdown设置为 2 也会清除日志,但更多活动部件仍然存在,并在 mysqld 启动期间在崩溃恢复中被选中。最好设置为 0。
| 归档时间: |
|
| 查看次数: |
26822 次 |
| 最近记录: |