在之前的博客我们了解了达梦的导出导入工具,如下:
DM7 达梦数据库 逻辑备份还原 dexp 和 dimp 使用手册
https://www.cndba.cn/dave/article/3593
在实际生产环境中,很多表上都是带有约束和其他的属性,比如主键,唯一,非空等。 达梦dexp和dimp目前对于表的约束支持没有问题,但是对于非空属性,在导出和导入之后会丢失,即导出之前列是非空的,导入之后变成可以为空。所以在使用中,要注意这部分内容,避免对业务产生影响。
具体测试验证过程如下。
查看达梦版本信息:
[dmdba@www.cndba.cn ~]$ disql SYSDBA/SYSDBA
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间: 15.326(毫秒)
disql V8
SQL> select * from v$version;
行号 BANNER
---------- -------------------------
1 DM Database Server 64 V8
2 DB Version: 0x7000a
已用时间: 22.446(毫秒). 执行号:5927.
SQL>
创建测试表:
SQL> conn DAVE/dameng123
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间: 9.751(毫秒)
SQL> select owner,table_name from all_tables where table_name in ('dave','cndba');
行号 OWNER TABLE_NAME
---------- ----- ----------
1 DAVE cndba
2 DAVE dave
已用时间: 91.553(毫秒). 执行号:6028.
SQL>
查看CNDBA表的定义:
SQL> select dbms_metadata.get_ddl('TABLE','cndba','DAVE');
行号 DBMS_METADATA.GET_DDL('TABLE','cndba','DAVE')
---------- --------------------------------------------------------------------------------------------------------------------------------
1 CREATE TABLE "DAVE"."cndba"
(
"id" NUMBER(22,6) NOT NULL,
"name" CHAR(10) NOT NULL,
"phone" NUMBER(22,6),
CLUSTER PRIMARY KEY("id"),
UNIQUE("phone")) STORAGE(ON "dave", CLUSTERBTR) ;
已用时间: 41.072(毫秒). 执行号:6048.
SQL>
SQL> desc "cndba"
行号 NAME TYPE$ NULLABLE
---------- ----- ---------- --------
1 id DEC(22, 6) N
2 name CHAR(10) N
3 phone DEC(22, 6) Y
已用时间: 18.489(毫秒). 执行号:6049.
SQL>
插入测试数据:
SQL> insert into "cndba" values(1,'dave','18505568888');
影响行数 1
已用时间: 7.253(毫秒). 执行号:6050.
SQL> commit;
操作已执行
已用时间: 1.623(毫秒). 执行号:6051.
SQL> select * from "cndba";
行号 id name phone
---------- -------- ---------- ------------------
1 1.000000 dave 18505568888.000000
已用时间: 0.531(毫秒). 执行号:6052.
SQL>
使用dexp 导出该表:
[dmdba@www.cndba.cn dmbak]$ dexp SYSDBA/SYSDBA file=dave.dmp log=dave.log directory=/dm/dmbak owner=DAVE
dexp V8
正在导出 第1 个SCHEMA :DAVE
开始导出模式[DAVE].....
----- 共导出 0 个SEQUENCE -----
----- 共导出 0 个VIEW -----
----- 共导出 0 个TRIGGER -----
----- 共导出 0 个COMMENT VIEW -----
----- 共导出 0 个COMMENT COL -----
----- 共导出 0 个PROCEDURE -----
----- 共导出 0 个SYNONYM -----
----- 共导出 0 个DBLINK -----
----- 共导出 0 个TRIGGER -----
----- 共导出 0 个PACKAGE -----
----- 共导出 0 个PKG_BODY -----
----- 共导出 0 个OBJECT of NO REFER OTHER CLASS -----
----- 共导出 0 个OBJECT of REFER OTHER CLASS -----
----- 共导出 0 个JCLASS -----
----- 共导出 0 个CLASS_BODY -----
----- 共导出 0 个DOMAIN -----
导出模式下的对象权限...
----- [2020-09-25 18:54:17]导出表:cndba -----
导出约束:CONS134219061
导出模式下的对象权限...
表cndba导出结束,共导出 1 行数据
模式[DAVE]导出结束.....
成功导出 第1 个SCHEMA :DAVE
共导出 1 个SCHEMA
整个导出过程共花费 0.160 s
成功终止导出, 没有出现警告
[dmdba@www.cndba.cn dmbak]$
使用dimp 导入表,这里我们REMAP到DIMP 这个用户下:
[dmdba@www.cndba.cn dmbak]$ dimp USERID=dimp/dameng123 FILE=dave.dmp LOG=dave2.log directory=/dm/dmbak remap_schema=DAVE:DIMP table_exists_action=replace
dimp V8
开始导入模式[DAVE]......
导入模式中的 NECESSARY GLOBAL 对象……
模式中的 NECESSARY GLOBAL 对象导入完成……
----- [2020-09-25 18:57:39]导入表:cndba -----
创建表 cndba ...
导入表 cndba 的数据:1 行被处理
导入模式中的 GLOBAL 对象……
模式中的 GLOBAL 对象导入完成……
模式[DIMP]导入完成......
导入表的约束:
CONS134219061
导入成功……
整个导入过程共花费 0.036 s
成功终止导入, 没有出现警告
[dmdba@www.cndba.cn dmbak]$
验证导入之后的表结构:
SQL> conn dimp/dameng123
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间: 3.473(毫秒)
SQL> select * from cndba;
select * from cndba;
第1 行附近出现错误[-2106]:无效的表或视图名[CNDBA].
已用时间: 1.884(毫秒). 执行号:0.
SQL> select * from "cndba";
行号 id name phone
---------- -------- ---------- ------------------
1 1.000000 dave 18505568888.000000
已用时间: 8.197(毫秒). 执行号:6128.
SQL> desc "cndba"
行号 NAME TYPE$ NULLABLE
---------- ----- ---------- --------
1 id DEC(22, 6) N
2 name CHAR(10) Y
3 phone DEC(22, 6) Y
已用时间: 16.862(毫秒). 执行号:6129.
SQL> select dbms_metadata.get_ddl('TABLE','cndba','DIMP');
行号 DBMS_METADATA.GET_DDL('TABLE','cndba','DIMP')
---------- --------------------------------------------------------------------------------------------------------------------------------
1 CREATE TABLE "DIMP"."cndba"
(
"id" NUMBER(22,6) NOT NULL,
"name" CHAR(10),
"phone" NUMBER(22,6),
CLUSTER PRIMARY KEY("id"),
UNIQUE("phone")) STORAGE(ON "MAIN", CLUSTERBTR) ;
已用时间: 9.587(毫秒). 执行号:6130.
SQL>
导入导出对数据没有影响,但是我们对比表的DDL语句,可以发现,主键和唯一约束可以通过过来,但是name 列的非空属性在恢复之后就丢失了。
实际上达梦数据库中共有4种类型的约束:主键约束、外键约束、检查约束、唯一约束。根据以上的测试,这些约束应该都是可以同步过来的, 但是非空属性测不能同步过来。
所以这里要特别留意一下,对于这个问题,有两种解决方法:
1)可以先根据原库的DDL创建好对象,然后在导入的时候使用 table_exists_action=append,
2)直接在导入完成后修改对应列为非空即可。
版权声明:本文为博主原创文章,未经博主允许不得转载。