MySQL Cluster创建外键报The table is full错误,需排查哪些内容?
报错排查方向
你当前使用的是MySQL NDB Cluster,默认采用NDB存储引擎,你此前核查的均为InnoDB专属参数,对NDB引擎不生效,可按以下优先级排查:
- 核查NDB数据节点内存配置
查看集群config.ini配置文件中DataMemory、IndexMemory的分配值,外键创建过程中会生成临时索引、锁相关的临时数据,会额外占用内存,若user表的行数据+索引总大小加上本次DDL的额外内存占用超过分配上限,就会触发table full报错。
可以执行ndb_mgm -e "all report memoryusage"命令查看两个数据节点的实时内存占用率,确认是否有节点内存耗尽。 - 确认关联表的存储引擎一致性
执行SHOW CREATE TABLE user;以及关联外键的父表建表语句,确认两张表的存储引擎均为ENGINE=NDB,如果其中某张表用了InnoDB,跨引擎创建外键会触发NDB临时表内存溢出,报出该错误。 - 检查NDB磁盘表空间状态
如果你开启了NDB磁盘存储特性,检查对应表空间文件所在磁盘的剩余空间,以及UNDO_BUFFER_SIZE、REDO_BUFFER_SIZE的配置,外键创建属于DDL操作,会生成大量UNDO/REDO日志,缓冲区满或者磁盘空间不足都会触发该报错。 - 验证单表分区上限
MySQL Cluster默认单表最大分区数为数据节点数的2倍,你的集群是2个数据节点,默认单表最多4个分区,如果user表数据量过大已经达到分区存储上限,执行DDL操作时会触发table full报错,可以执行ALTER TABLE user PARTITION BY KEY () PARTITIONS 8;调整分区数验证问题是否解决。 - 检查NDB外键使用限制
NDB对单表外键数量、外键关联字段长度有严格限制:如果user表已经创建了多个外键,或者本次要创建的外键关联字段为变长类型且总长度超过3072字节,也会触发该类报错。你可以先手动在SQL节点执行报错的ALTER TABLE语句,获取更详细的错误信息辅助定位。
内容的提问来源于stack exchange,提问作者Aline137
相关产品推荐
相关产品推荐

