我有几个问题要问那些更熟悉的人。尽管支持 Barracuda,但我的大多数实例都在运行 Antelope。
我正在寻找一些压缩 innodb 表。我的理解是这仅在梭子鱼格式下可用。
- 我看到 innodb_file_format 是动态的,所以我可以切换而不会反弹。我应该注意这样做是否有任何影响。我只能说这意味着将使用该格式创建新表或随后更改的表。这一切都正确吗?
- 我希望不必经历并转换我所有的表格。羚羊和梭子鱼表在同一个表空间中共存是否符合犹太教规?即使它有效,是否有任何需要注意的问题?
根据我阅读并从测试中收集的内容,答案是:是的。是的。我不确定。
更新
自从这篇文章以来,我一直在各种情况下运行一些动态表和一些压缩表,没有问题。 此外,我当时 忽略了阅读http://dev.mysql.com/doc/refman/5.5/en/innodb-file-format-identifying.html 。
启用给定的 innodb_file_format 后,此更改仅适用于新创建的表,而不适用于现有表。如果您确实创建了一个新表,则包含该表的表空间将使用表功能所需的“最早”或“最简单”文件格式进行标记。例如,如果您启用文件格式 Barracuda,并创建一个未压缩且不使用 ROW_FORMAT=DYNAMIC 的新表,则包含该表的新表空间将标记为使用文件格式 Antelope。
因此,即使您允许 Barracuda,表格也会被创建为 Antelope。除非您将每个表指定为 row_format 动态表或压缩表,否则混合是不可避免的。
没有迹象表明您应该在引入您的第一个梭子鱼表时进行完整的转储和重新加载(例如在升级 mysql 的主要版本时推荐)
所以我迟了将近 4 年才回答这个问题:
InnoDB 文件格式是在 InnoDB 独立于 MySQL 服务器时构思的(例如:MySQL 5.1 可以运行两个不同版本的 InnoDB)。
您不想运行 Barracuda(2012 年)的原因是它可能会降低 MySQL 降级的灵活性(即在升级失败后,您想回到无法读取更新格式的版本)。即羚羊更好的原因不应该是技术原因。
在 MySQL 5.7 中,该
innodb_file_format
选项已被弃用。由于 MySQL 和 InnoDB 不再独立,因此 InnoDB 可以使用 MySQL 的升级规则以及向后兼容的要求。无需混乱的设置!在 MySQL 5.7 中,默认切换到
Barracuda/DYNAMIC
. 由于所有当前支持的 MySQL 版本都可以读取这种格式,因此离开 Antelope 并仍然提供降级是安全的。在 MySQL 5.7 服务器上,Antelope 表将
Barracuda/DYNAMIC
在下一次表重建(OPTIMIZE TABLE 等)时升级。那是除非它们是专门用ROW_FORMAT=oldrowformat
.在 MySQL 8.0 中,该选项
innodb_file_format
被删除。MySQL 5.7 还引入了 option
innodb_default_row_format
,默认为 DYNAMIC。这解决了您更新中的问题。如果你真的想使用 Barracuda 格式来玩 InnoDB,你应该 mysqldump 一切到 /root/MySQLData.sql 之类的东西。这使得数据文件格式独立。
使用另一个带有新 ibdata1 和 innodb_file_per_table 的 MySQL 实例(可选,我个人偏好)。更改 ibdata1 为空的文件格式。然后,重新加载 /root/MySQLData.sql 并使用数据。
我听说过一些关于 PostgreSQL 不得不调整设置以使 8.2.4 数据库与 9.0.1 二进制文件一起工作的轻微恐怖故事。如果我们尝试让这两种文件格式驻留在相同的系统表空间 (ibdata1) 和/或
.ibd
文件中(如果我们知道此类设置),则同样的情况也适用。至于犹太教...
Antelope
和Barracuda
更新 2013-07-05 14:26 EDT
我刚刚在 ServerFault 中回答了这个问题:设置 MySQL INNODB 压缩 KEY_BLOCK_SIZE。这让我回顾了我在 DBA StackExchange 中回答的任何问题,讨论了
Barracuda
格式,我找到了我的这篇旧帖子。我将在这里放置相同的信息...根据 MySQL Documentation on InnoDB Compression for Barracuda
请注意,InnoDB 缓冲池必须加载读取的数据页和索引页才能完成查询。首次读取表及其索引时,必须将压缩页解压缩到 16K。这意味着您将在缓冲池中拥有两倍的数据内容,即压缩和未压缩的数据页。
如果缓冲池中发生这种数据内容的重复,则需要将innodb_buffer_pool_size增加新压缩率的一个小的线性因子。方法如下:
设想
key_block_size=8
8
是50.00%
_16
50.00%
8G
是_4G
innodb_buffer_pool_size
_12G
8G
4G
key_block_size=4
4
是25.00%
_16
25.00%
8G
是_2G
innodb_buffer_pool_size
_10G
8G
2G
key_block_size=2
2
是12.50%
_16
12.50%
8G
是_1G
innodb_buffer_pool_size
_9G
8G
1G
key_block_size=1
1
是06.25%
_16
06.25%
是( )8G
_0.5G
512M
innodb_buffer_pool_size
到8704M
(8G
(8192M
) +512M
)故事的寓意:InnoDB 缓冲池在处理压缩数据和索引页面时只需要额外的喘息空间。