暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DM8达梦数据库错误码

原创 达梦 2021-01-31
4890

[-3209]: 无效的存储参数

新建表,指定一个存在的表空间,模拟报错信息,如下图所示:

错误信息

但是将 STORAGE(on “TEST”) 改为 STORAGE(on “test”),则创建成功。

执行成功

原因

初始化数据库实例的时候,有个大小写敏感的参数 CASE_SENSITIVE,要设置正确。大小写敏感的库,在 DM 默认都会转为大写,但是当用双引号引起来,如”test”,则创建的对象名是小写的。上例中,创建的表空间名是小写的 test,所以,单独写 TEST 或者 test,都会报这个对象不存在。如果创建的是大小写不敏感的库,则创建的对象名是小写就是小写,大写就是大写。

[-4080]: 不是 group by 表达式

创建表,还原报错,如下所示:

CREATE TABLE "SYSDBA"."FZQ"(
"ID" VARCHAR(4),
"COLUMN_1" NUMBER(22,6),
"COLUMN_2" CHAR(10),
"COLUMN_3" INT) STORAGE(ON "MAIN", CLUSTERBTR) ;

select sum(COLUMN_1),COLUMN_2 ,COLUMN_3 from "SYSDBA"."FZQ" where 1=1 group by COLUMN_2 order by COLUMN_3 desc

执行结果

【问题原因】

  • GROUP BY 和 ORDER BY 一起使用时,ORDER BY 要在 GROUP BY 的后面。
  • GROUP BY 后面必须有 ORDER BY 的字段。
  • 在 select 需要查询的语句中选中的字段,必须出现在 GROUP BY 子句中。

修改后如下所示:

select sum(COLUMN_1),COLUMN_2 ,COLUMN_3 from "SYSDBA"."FZQ" where 1=1  group by COLUMN_2,COLUMN_3 order by COLUMN_3 desc;

执行结果

[-2665]: 记录超长

【问题原因】

DM 中记录长度不能超过页大小的一半。

【解决方法】

DM 在初始化的时候,默认的页大小是 8 KB,也就是说一个表一条记录的所有的字段的总长度不能超过 4 KB。选择的页大小影响后面表每行数据的长度,表每行的长度之和(普通数据类型)不能超过一页大小,如果超过 1 页大小即报记录超长的错误,

考虑实际场景选择:

  1. 找到表中 varchar 类型比较长的(如 varchar2(8000)这种),修改成 text 类型;
  2. 把页大小改为 16 KB 或者 32 KB。这是一个底层参数,在数据库生命周期内都不能更改,所以必须重新初始化。(对于表中 varchar2 类型较长,并且字段较多的情况不太适合,这种情况采用方法 1 解决。)
  3. 考虑使用大字段,大字段是不参与上述描述计算的。大字段长度能够达到 2 GB。但是要注意,大字段的使用和普通字段是有区别的。详情可以参考相关文档。

举例说明:

比如安装时页大小为 8 kB,那么一行记录的长度除大字段外所有列加起来不能超过 4 kB。

select page(); --8192
create table test(c1 int,c2 varchar(2000),c3 varchar(2000),c4 varchar(2000)); --可创建成功
insert into test values(1,LPAD('a',2000),'a','a'); --未超过 4 kB,可以插入成功
insert into test values(2,LPAD('a',2000),LPAD('a',2000),'a'); --超过 4 kB,报错:记录超长
update test set c3=LPAD('a',2000) where c1=1; --更新操作导致记录超长,报错

[-6160]: 数据类型的变更无效

由于 TEXT 和 VARCHAR 是属于不同类型的数据且长度是不同的,TEXT 属于多媒体数据类型,最大存储长度是 2G-1 字节,而 VARCHAR 属于字符数据类型,最大存储长度只有 8188 字节。当你直接修改字段时会报下图错误。

报错信息

一般情况下不建议将 TEXT 类型转换为 VARCHAR 类型,因为长度不同,如果 TEXT 字段数据长度超过了 VARCHAR 字段的长度时做数据强制插入或迁移时会报【字符串截断】,但可能你在定义表时使用了错误字段,必须要更正,那么首先要查出表中 TEXT 字段的长度超过 8188 的数据并处理掉,然后重建表,然后通过 insert into select 或者迁移数据的方式将处理后的源表数据插入新表中。过程如下:

  • 定义表,如下所示:
CREATE TABLE "text_to_varchar"
("id" CHAR(10),
"textcol" TEXT);
  • 分别插入两条数据

第一条:

id:8000
textcol:自造的 8000 字节长度的任意数据

第二条:

id:10000
textcol:自造的 10000 字节长度的任意数据。

通过长度计算参数可以查看当前字段长度如下图所示:

字段长度

尝试将字段 textcol 从 text 转换为 varchar 时报错,如下图所示:

报错信息

  • 重新定义表,如下所示:
create table "text_to_varchar1"
(
"id" CHAR(10),
"textcol" VARCHAR(8188)
);

尝试使用 insert into select 的方式插入数据会报错,如下图所示:

报错信息

尝试使用迁移工具迁移数据同样会报字符串截断错误,如下图所示:

字符串截断

处理掉长度超长的数据,我这里是直接删除掉了该条数据,但实际数据可能是有用的,根据情况进行适当处理,如下图所示:

执行结果

然后再尝试插入或迁移数据,此时就不会报错了,如下图所示:

执行结果

迁移成功

[-2106]: 无效的表或者视图名

  • 加上模式名,不是 SYSDBA 下的表都要加上模式名。

这个表确实不是该模式下的—如果查询不是当前模式下的表格,请加上模式,具体参考连接:https://blog.csdn.net/myth8860/article/details/100557705

  • 从其他数据库迁移数据到 DM 时,一般情况下建议将保持对象名大小写】勾去掉,因为在 DM 本身是大小写敏感的情况下,数据库中小写的对象名经常会导致【无效的表名或视图名】的错误。

  • 使用 activiti 配置,连接 DM 数据的时候,报错无效的表或视图名。

举例如下:

DM 数据库已经连上了,报了无效的表或视图名,登录数据库查看发现没有这个表,很显然表没建上或者建表的脚本报错了,通过 SQL 日志观察发现根本没有执行建表操作,所以可以判断出这个地方和 DM 数据库没有关系,和 activiti 的配置有关,activiti 第一次启动时才需要建表。

进行以下配置:

<property name="databaseSchemaUpdate" value="false" /
--把这个属性中 false 改成 true 就可以建表了
<property name="databaseSchemaUpdate" value="true" /

activiti 默认是不支持 DM 的,所以我们选择了 Oracle 数据库类型来兼容 DM。

  • 初始化无效的表或者视图名 SYSCOLINFOS

数据库版本问题,用的两个数据库版本,有一个过低。

[-6407] 锁超时

【具体描述】

准备禁用掉数据库里某个触发器,但是操作后报了个锁超时的提示,导致无法禁用触发器。如下图所示:

错误信息

【解决方法】

  1. 查询数据库表的锁的情况
select * from v$lock;
  1. 查询对象信息
select * from sysobjects;
  1. 查询会话信息
select * from v$sessions;

上述 3 条语句组合一下就能查出哪张表上的某种锁是由哪个会话里的操作加上的。

select a.*,b.NAME,c.SESS_ID from v$lock a
left join sysobjects b on b.ID=a.TABLE_ID
left join v$sessions c on a.TRX_ID=c.TRX_ID;

执行结果

关闭对应的会话:

sp_close_session(sess_id);

[-2723]: 仅当指定列列表,且 SET IDENTITY_INSERT 为 ON 时,才能对自增列赋值

一般情况下,当数据表中,某一列被设置成了标识列之后,是无法向标识列中手动的去插入标识列的显示值。但是,可以通过设置 SET IDENTITY_INSERT 属性来实现对标识列中显示值的手动插入。
语法说明:

  • SET IDENTITY_INSERT 表名 ON:表示开启对标识列显示值插入模式,允许对标识列显示值进行手动插入数据。
  • SET IDENTITY_INSERT 表名 OFF:表示关闭对标识列显示值的插入操作,标识列不允许手动插入显示值。
注意

IDENTITY_INSERT 的开启 ON 和关闭 OFF 是成对出现的,所以,在执行完手动插入操作之后,记得一定要把 IDENTITY_INSERT 设置为 OFF,否则下次的自动插入数据会插入失败。

[-3719]: 非法的基类名

执行下列语句报错,错误消息: 第 6 行附近出现错误: 非法的基类名[JSON]。

CREATE TABLE  "CES_CLOUD_SAAS_SYS"."sys_route_conf"
(
"id" INT IDENTITY(34,1) NOT NULL,
"route_name" VARCHAR(200) NULL,
"route_id" VARCHAR(200) DEFAULT '' NOT NULL,
"predicates" JSON NULL,
"filters" JSON NULL,
"uri" VARCHAR(200) NULL,
"order" INT DEFAULT 0 NULL,
"create_time" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() NULL,
"update_time" TIMESTAMP(0) NULL,
"del_flag" CHAR(4) DEFAULT '0' NULL
)

【解决方法】

CREATE TABLE  "sys_route_conf"
(
"id" INT IDENTITY(34,1) NOT NULL,
"route_name" VARCHAR(200) NULL,
"route_id" VARCHAR(200) DEFAULT '' NOT NULL,
"predicates" VARCHAR(1000) CONSTRAINT ensure_json CHECK ("predicates" IS JSON),
--JSON NULL,
--"filters" JSON NULL,
"uri" VARCHAR(200) NULL,
"order" INT DEFAULT 0 NULL,
"create_time" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP() NULL,
"update_time" TIMESTAMP(0) NULL,
"del_flag" CHAR(4) DEFAULT '0' NULL
)
po_document VARCHAR(1000) CONSTRAINT ensure_json CHECK (po_document IS JSON)
);

[-3243]: 同时包含聚集KEY和大字段

DM 不支持表中同时包含聚集 KEY 和大字段,可以通过将表重建为非聚集型主键的方式来解决。

由于 PK_WITH_CLUSTER 默认取值为 1,即仅指定 PRIMARY KEY 关键字时默认创建为聚集主键,修改为 0 后默认创建非聚集主键。

可以使用以下语句来查询该参数的值:

SELECT * FROM V$DM_INI WHERE PARA_NAME = 'PK_WITH_CLUSTER';

使用 SP_SET_PARA_VALUE(1,'PK_WITH_CLUSTER',0);将该参数值修改为 0,
使用 SP_SET_PARA_VALUE(1,'PK_WITH_CLUSTER',1);将该参数值改回 1。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论