使用KEY_BLOCK_SIZE小于4的InnoDB压缩表可能导致数据损坏风险提醒

更新时间:
复制 MD 格式

问题说明

PolarDB MySQL采用自研的分布式文件系统,其最小原子写入单元为4KB。当使用InnoDB压缩表格式(ROW_FORMAT=COMPRESSED)且KEY_BLOCK_SIZE小于4(即1 KB2 KB)时,由于压缩块大小与底层文件系统的原子写入单位不匹配,可能导致数据损坏风险。为避免该风险对您的数据产生影响,建议您按照以下解决方案排查并处理。

受影响版本

数据库引擎版本

受影响的修订版本

PolarDB MySQL 5.6

小于等于5.6.1.0.46.1

PolarDB MySQL 5.7

小于等于5.7.1.0.40

PolarDB MySQL 8.0.1

小于等于8.0.1.1.53

PolarDB MySQL 8.0.2

小于等于8.0.2.2.33

说明

您可在PolarDB MySQL集群的配置与管理 > 版本管理中查看当前集群的数据库引擎版本。

解决方案

  1. 排查是否存在受影响的压缩表。

    请根据您的数据库引擎版本,执行以下SQL查询,检查是否存在KEY_BLOCK_SIZE小于4InnoDB压缩表:

    • PolarDB MySQL 5.65.7版本:

      SELECT * FROM information_schema.innodb_sys_tables WHERE ROW_FORMAT = 'Compressed' AND ZIP_PAGE_SIZE < 4096;
    • PolarDB MySQL 8.0.18.0.2版本:

      SELECT * FROM information_schema.innodb_tables WHERE ROW_FORMAT = 'Compressed' AND ZIP_PAGE_SIZE < 4096;

    若查询结果不为空,表示当前集群中存在受影响的表,请提交工单联系我们协助处理受影响的表。若查询结果为空,仍然建议升级至已修复版本以获得自动保护。

    警告

    在受影响的版本中,请避免创建KEY_BLOCK_SIZE小于4的压缩表。如需使用压缩表,请确保KEY_BLOCK_SIZE大于等于4。

  2. 升级数据库引擎至已修复版本。

    警告

    升级数据库引擎版本时,可能会导致连接闪断,建议在业务低峰期进行操作。

    将数据库引擎升级至受影响版本之后的版本,即可修复该问题。升级操作请参见小版本管理

  3. 升级后,配置安全策略防止后续误创建不兼容的压缩表。新版本已引入polar_compressed_table_policy参数用于管控新建压缩表时的行为。该参数支持以下策略:

    策略值

    行为说明

    NATIVE

    原样执行,不做任何干预。不推荐使用,存在数据损坏风险。

    ADJUST_KEY_BLOCK_SIZE

    默认策略。允许创建压缩表,若KEY_BLOCK_SIZE小于4,则自动调整为4。

    AUTO_CONVERT_ROW_FORMAT

    静默将压缩表转换为系统默认的行格式。

    REJECTED

    拒绝创建压缩表并返回错误提示。

    说明

    推荐将polar_compressed_table_policy设置为ADJUST_KEY_BLOCK_SIZE(默认值)、AUTO_CONVERT_ROW_FORMATREJECTED,以防止误操作导致数据损坏。