导入报错,记录超长

现象描述

我们在从Oracle 或者其他数据库迁移数据到达梦数据库时(含使用DTS ),以及甚至平时,自己平时插入数据时,都可能碰到一个错误:

记录超长

 

碰到这种问题,我们怎么解决呢?

有三个方法

Ø   考虑更加合适的页大小(扩大),重新初始化实例后,重新导入数据

Ø   对表启用超长列存储功能,重新导入(或者插入)数据

Ø   把很长的varchar 类型,考虑使用CLOB 重建表后,再进行插入

处理方法

处理方法一:合适的页大小

在达梦数据库的底层存储中,关于【页】的详细情况,可以参考达梦官方手册(DBA 手册)的“章节1.2.3 页” 的介绍,这是达梦数据库的最小IO 单元,类似于Oracle 的块大小。

 

这里我们强调两个点:

1.       对于数据库实例的页大小,在数据库实例生命周期内, 无法更改

2.       我们可以简单理解为,对于任何表的一行记录(不包括大字段),他们的总长达(字节大小), 不能超过页大小的一半。(也就是所谓的行内数据,对于LOB 字段,绝大部分都是行外数据)

这个计算非常严格,哪怕只超过一丁点,都会报错,例如:

Update set number_col=23.8 where number_col=23

这个sql 语句,都有可能碰到 记录超长 的这个错误

3.       我们可选的页大小有:4KB 8KB 16KB 或者 32KB (默认为 8KB ),该值在初始化实例时一次性指定,在数据库实例生命周期内,都不可更改。——对应的,一行记录(不包括大字段)的总长度,限制为 2 4 8 16 KB

如何查看当前数据库实例的页大小:

  `select page`

 

也就是说,如果我们的页大小是8KB ,插入数据报错“记录超长”,那么我们如果是16KB 的实例,那么我们就不一定报错。且对于从Oracle 进行迁移的实例,我们建议的页大小为16KB

 

处理方法二:启用超长列

超长列的功能就是针对这个问题实现的功能,这里讲如何启用超长列:

1.       图形化界面(manager 客户端)的方式

在模式下面,找到对应表,通过鼠标右键,打开菜单栏,通过菜单栏里的 存储选项 à 启用超长记录  完成设置

 

2.       通过SQL 语句启用某个表的超长列

3.       在建表的时候,设置启用超长列的属性

 

处理方法三:使用大字段CLOB ,重建表

这个就是说的,本来我们一个表 test1(v1 int,…,vx int,vy varchar(8000)) ,插入数据时报错了,这个是我们:

Alter table test1 rename to test1_modify;

Create table test1(v1 int,…,vx int,vy clob);

Insert into test1 select * from test1_modify;commit;

然后,在进行相关操作,就不会碰到记录超长的问题了。

 

说明:

1.       这个方法可能会涉及到代码改造,比如对应字段在应用端的处理,varchar 类型和CLOB 类型的处理方式存在区别。

2.       CLOB 字段也可以直接like ,但和 CLOB_LIKE_MAX_LEN 该参数有关系,注意学习下达梦配置文件(dm.ini 参考DBA 手册 正解 2.1.1 ):

CLOB_LIKE_MAX_LEN    默认值为 31 静态参数

LIKE 语句中 CLOB 类型的最大长度,单位 KB ,有效值范围( 8~102400

 

 

备注:

-           要注意和字符串截断报错问题的区别,字符串截断,只是纯粹的精度不够,如varchar(400), 是可以放400 个字节的字符串,我们让它要放入401 个,就会报错字符串截断。字符串截断和数据溢出,是一个类型的错误,数据溢出就是非字符串类型,精度不足。


请使用浏览器的分享功能分享到微信等