MySQL InnoDB - innodb_file_per_table 缺点?

UpT*_*eek 36 mysql innodb

默认情况下,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文件通常包含四种类型的信息

这是几乎永远缩小 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%。

  • 步骤 05) 删除 ibdata1、ib_logfile0 和 ib_logfile1(删除前请参阅下面的更新!

此时,/var/lib/mysql中应该只有mysql模式

  • 步骤 06) 重启 mysql

这将在 10MB 处重新创建 ibdata1(不配置选项),ib_logfile0 和 ib_logfile1 分别为 1G

  • 步骤 07) 将 SQLData.sql 重新加载到 mysql

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。

试一试。如果您对此有更多疑问,请给我发电子邮件。相信我。这将在短期和长期内奏效。

更新 2013-07-02 15:08 EDT

在这方面我有一个警告,我在我的其他帖子中进行了更新,但我错过了这一点:我正在使用innodb_fast_shutdown更新我的答案,因为我曾经重新启动 mysql 并停止 mysql 来执行此操作。现在,这一步至关重要,因为每个未提交的事务可能在 InnoDB 事务日志内部和外部都有其他移动部分(请参阅 InnoDB 基础架构)。

请注意,将innodb_fast_shutdown设置为 2 也会清除日志,但更多活动部件仍然存在,并在 mysqld 启动期间在崩溃恢复中被选中。最好设置为 0。

  • **小心!** 必须在 MySQL 中设置 `innodb_fast_shutdown=0` 选项,然后关闭它以删除日志文件!(`ib_logfile0` 和 `ib_logfile1`) **否则,你可能会丢失数据!** (2认同)

alv*_*osu 12

请参阅错误

使用它有什么缺点吗?

  • 更多打开的文件
  • 打开/重新打开开销
  • .ibd 文件不收缩(见1 , 2

我总是在大型数据库上使用 innodb_file_per_table。


Ale*_*lex 10

在 MariaDB 中默认启用 innodb_file_per_table。