MySQL Cluster执行ALTER表报错1114:表已满,寻求技术支持
问题解决:ALTER TABLE指定NDB磁盘表空间时报ERROR 1114 (HY000): The table '#sql-4d3e_a' is full
问题场景
执行带磁盘表空间指定的表引擎转换命令:
ALTER TABLE beijing_xiaohongmen TABLESPACE ts_1 STORAGE DISK ENGINE NDBCLUSTER;
报错ERROR 1114 (HY000): The table '#sql-4d3e_a' is full,但直接执行ALTER TABLE beijing_xiaohongmen ENGINE NDBCLUSTER;可正常完成,说明DataMemory、IndexMemory配置及磁盘/内存空间充足。
已知配置:
- ts_1表空间包含2个1024M的.dat文件
- config.ini关键配置:
[ndbd default] NoOfReplicas=1 DataMemory=2048M IndexMemory=2048M MaxNoOfExecutionThreads=8 - my.cnf关键配置:
[mysqld] ndbcluster datadir=/usr1/DBData/mysql_cluster/mysqld/ max_heap_table_size=1024M tmp_table_size=2048M
问题原因
指定磁盘表空间执行ALTER时,NDB会在目标表空间内创建临时表(即报错中的#sql-4d3e_a)存储转换过程中的数据,当前ts_1的总容量(2048M)或剩余可用空间不足以容纳临时数据及最终表数据的临时副本,即使整体磁盘空间充足也会触发该错误。
解决方案
1. 分两步完成表迁移
先将表转换为NDB引擎(利用已验证充足的DataMemory/IndexMemory),再将表移动到目标磁盘表空间:
-- 第一步:转换引擎(无表空间指定,正常执行) ALTER TABLE beijing_xiaohongmen ENGINE NDBCLUSTER; -- 第二步:迁移到磁盘表空间 ALTER TABLE beijing_xiaohongmen TABLESPACE ts_1 STORAGE DISK;
此方法规避了一步转换时临时表占用磁盘表空间的问题。
2. 扩展目标磁盘表空间容量
步骤1:查看当前表空间使用情况
通过NDB管理工具ndb_mgm执行命令,确认ts_1的已用/剩余空间:
ndb_mgm -e "SHOW TABLESPACES"
步骤2:添加更大的数据文件到ts_1
执行SQL命令添加新的数据文件(示例添加2048M的文件):
ALTER TABLESPACE ts_1 ADD DATAFILE 'ts_1_3.dat' SIZE 2048M ENGINE NDBCLUSTER;
添加完成后,再次执行原ALTER命令即可。
3. 检查NDB临时磁盘空间配置
若上述方法无效,需检查config.ini中与磁盘临时空间相关的参数,确保DiskPageBufferMemory(磁盘页缓冲内存)配置足够,可调整为:
[ndbd default] DiskPageBufferMemory=512M
修改后需重启NDB数据节点生效。
内容的提问来源于stack exchange,提问作者user19993631
相关产品推荐
相关产品推荐

