为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8.1
【操作系统】:Windows
【CPU】:
【问题描述】*:数据插入两个VARCHAR字段,当两个插入的这两个字段的字符很长时会报记录超长错误,同样的字符单个插入又可以。这两个字段长度已经设置到20000了,报错sql:UPDATE TABLE_NAME SET REQUESTPARAMANAL='{"name":"streeId","value":"STREEID","useconfig":"false"},{"name":"calfs","value":"SQLZS","useconfig":"true"},{"name":"mnflag","value":"SQLZS","useconfig":"true"},{"name":"isSave","value":"1","useconfig":"false"},{"name":"params","value":[{"name":"jsfs","value":"cgjs","useconfig":"false"},{"name":"calfs","value":"SQLZS","useconfig":"true"},{"name":"versionid","value":"SPOTVERSIONID","useconfig":"true"},{"name":"jsday","value":"SPOTCALJSDAY","useconfig":"true"},{"name":"jsmonth","value":"DMONTH","useconfig":"true"}],"useconfig":"true","recursion":"true"},{"name":"solidparams","value":[{"name":"versionid","value":"SPOTVERSIONID","useconfig":"true"},{"name":"userversion","value":"SPOTVERSIONID","useconfig":"true"},{"name":"month","value":"SPOTCALJSDAY","useconfig":"true"},{"name":"token","value":"TOKEN","useconfig":"true"},{"name":"jsfs","value":"cgjs","useconfig":"false"},{"name":"jsfsname","value":"xx","useconfig":"false"},{"name":"jslx","value":"spot","useconfig":"false"},{"name":"jslxname","value":"XX","useconfig":"false"},{"name":"versionname","value":"SPOTVERSIONID","useconfig":"true"},{"name":"userversionname","value":"SPOTVERSIONID","useconfig":"true"},{"name":"calfs","value":"SQLZS","useconfig":"true"}],"useconfig":"true","recursion":"true"}'
,DEFGLOBPAR='{"versionid":"1857723100800614400,1858665226686300160,1858783970792177664,1859057389244907520,1859188528311828480,1859414177848885248,1859415733897920512,1859417372427943936,1859418887188250624,1859420442100629504,1859421914817232896,1859423471201812480,1859425110876880896,1859426751814434816,1859428389648203776,1859430070347759616,1859898812680765440,1859902537017196544,1860604227278209024,1860971422491475968,1861247486576951296,1861579458520154112,1862076525172621312,1862432020706230272,1862797860102340608,1863156938632724480,1863506114541387776,1863866317967327232,1864234728706670592,1864493676781240320","userversion":"1857723100800614400,1858665226686300160,1858783970792177664,1859057389244907520,1859188528311828480,1859414177848885248,1859415733897920512,1859417372427943936,1859418887188250624,1859420442100629504,1859421914817232896,1859423471201812480,1859425110876880896,1859426751814434816,1859428389648203776,1859430070347759616,1859898812680765440,1859902537017196544,1860604227278209024,1860971422491475968,1861247486576951296,1861579458520154112,1862076525172621312,1862432020706230272,1862797860102340608,1863156938632724480,1863506114541387776,1863866317967327232,1864234728706670592,1864493676781240320","userversionname":"202411010008-202411300004","versionname":"202411010008-202411300004","jsfsname":"xx","jsfs":"sxx"},"elataskjobtype":2,"jsfs":"xx","xx":"spot","nodes":{"1894571931768848384":{"1894571934826496000":["1894571937846394881"]}}'
WHERE RUNID = '1895404961907474432'
来自梦仔:
解决方案
方法1:调整页大小(需重新初始化实例)
适用场景:全库表普遍存在“宽表”结构,需长期支持大字段存储。
操作步骤:
SELECT PAGE();
查询当前页大小。./dminit path=/opt/dmdbms/data page_size=32
方法2:启用表的超长记录
适用场景:仅个别表需要突破长度限制,且无法重新初始化数据库。
操作步骤:
ALTER TABLE 表名 ENABLE USING LONG ROW;
方法3:改用大字段类型(TEXT/CLOB)
适用场景:字段实际需要存储超大文本(如超过8000字节)。
操作步骤:
梦仔:
ALTER TABLE 表名 MODIFY 字段名 TEXT;
LOBMAXINROW_LEN
参数值时),不计入行内长度限制。方法4:优化字段定义与数据拆分
适用场景:业务允许对长字段进行拆分或压缩。
操作建议:
将单个长字段拆分为多个子字段(如contentpart1
, contentpart2
)。
使用压缩函数(如COMPRESS
)减少存储空间占用。
调整应用逻辑,确保单行总长度不超过页大小限制。
辅助验证与调试
计算实际行长度
通过伪列和系统函数估算行内存储消耗:
SELECT
LENGTHB(ROWID) AS ROWID长度,
LENGTHB(TRXID) AS TRXID长度,
LENGTHB(字段1) + LENGTHB(字段2) AS 字段总长度
FROM 表名;
检查参数配置
确认LOBMAXINROW_LEN
参数(默认900字节)是否影响大字段存储策略:
SELECT * FROM V$DMINI WHERE PARANAME = 'LOBMAXINROW_LEN';
总结
此问题的本质是行内存储空间不足,需通过调整页大小、启用超长记录或改用大字段类型解决。若需快速修复,推荐方法2临时开启超长记录;若为长期方案,则优先选择方法1或方法3。实际选择时需结合业务场景、存储成本及性能要求综合权衡。
select * from v$dm_ini where para_name='VM_STACK_SIZE'; 查一下这个参数配置