本文于 115 天前发布,最后更新于 115 天前
一、问题背景
数据迁移用户SJXT下的数据,由版本8.1.2.18(1.2.18-21.10.12-148712-10013-ENT Pack15)迁移到8.1.3.26(–03134284058-20230614-193125-20046)版本中。
二、问题描述
迁移方案为用户级逻辑导出导入(OWNER)。导出导入均使用目标端工具,即直接将数据通过远程dexp到目标端,然后通过dimp导入。流程如下:
(1)目标端重建用户
drop user SJXT cascade;
create user "SJXT" identified by "xxxx" default tablespace "TBS_SJXT" default index tablespace "TBS_SJXT";
grant "SOI","VTI","PUBLIC","RESOURCE" to "SJXT";
(2)逻辑导出
./dexp USERID=sysdba/'"xxxxx"'@源端IP:5236 FILE=SJXT.DMP LOG=EXP_SJXT.LOG DIRECTORY=/data/soft OWNER=SJXT
(3)逻辑导入
nohup ./dimp USERID=sysdba/'"xxxxxx"'@localhost:5236 FILE=SJXT.DMP LOG=IMP_SJXT.LOG DIRECTORY=/data/soft OWNER=SJXT &
导入日志中存在报错,源端共432张表,目标端导入314张表,118张表导入失败,通过日志查看到都是同样报错[WARNING]create table fail, import table XXXXXX …
详细日志细节如下:
----- [2025-08-08 20:13:22]import table:VIOLATIONS_DISCIPLINE_LAWS -----
[1/1548]create table VIOLATIONS_DISCIPLINE_LAWS
CREATE SCHEMA "SJXT" AUTHORIZATION "SJXT" CREATE TABLE "VIOLATIONS_DISCIPLINE_LAWS"
(
"ID" VARCHAR2(50),
"MAJOR_DISCI_ILLEGAL_FACT" VARCHAR2(200),
"RESPONSIBLE_DEPARTMENT" VARCHAR2(200),
"BUSINESS_PROCESS" VARCHAR2(50),
"IS_RELY_EAT_INS" VARCHAR2(50),
"POLICY_PLAN_BREACH_P" VARCHAR2(50),
"FIVE_VOIDS_PROBLEM" VARCHAR2(50),
"NATURE_DISCIP_ILLEGAL_I" VARCHAR2(50),
"AMOUNT_INVOLVED" VARCHAR2(50),
"OFFENCE_OCCURRENCE_TIME" VARCHAR2(50),
"PROBLEMSCLUENO" VARCHAR2(50),
"S_FLAG" VARCHAR2(50),
"S_USER" VARCHAR2(50),
"S_DEPT" VARCHAR2(50),
"S_TDEPT" VARCHAR2(50),
"S_ODEPT" VARCHAR2(50),
"S_CMPY" VARCHAR2(50),
"S_ATIME" VARCHAR2(50),
"S_MTIME" VARCHAR2(50),
"INSURANCE_TYPE" VARCHAR2(50),
CONSTRAINT "CONS134222904" CLUSTER PRIMARY KEY("ID")) STORAGE(CLUSTERBTR) ;
[WARNING]Error Code:-2109,Invalid constraint name [CONS134222904]
[WARNING]create table fail, import table VIOLATIONS_DISCIPLINE_LAWS ...
可以看到是因为约束名无效导致建表失败。
三、问题复现与分析
后续通过测试环境复现报错,发现是数据库在后续版本新增了一个参数CHECK_CONS_NAME:在创建或重命名约束时,是否对约束名合法性进行检查。0:不检查;1:检查。
该参数新增于版本:
版本名称:DM8 三月月度版
发版日期:2023 年 4 月 17 日
版本号:select * from v$version;
DM Database Server 64 V8
DB Version: 0x7000c
03134284044-20230417-187846-20040
CONS+9位数字是数据库系统索引,由数据库自动维护生成的。参数早期会额外检查dimp导入时的建表语句,引起预期外的报错,从而因为约束名检查无法通过导致建表失败的迁移报错。
四、问题解决
逻辑导入之前临时修改该参数为0便可成功导入数据。参数修改方法:
SP_SET_PARA_VALUE(1,'CHECK_CONS_NAME',0);
记得数据导入后将参数修改回1,SQL如下:
SP_SET_PARA_VALUE(1,'CHECK_CONS_NAME',1);