签到成功

知道了

CNDBA社区CNDBA社区

DM 达梦数据库 导出导入工具(dexp/dimp) 列的非空属性 不能同步

2020-09-25 19:17 4533 4 原创 DM 达梦
作者: dave

在之前的博客我们了解了达梦的导出导入工具,如下:

DM7 达梦数据库 逻辑备份还原 dexp 和 dimp 使用手册
https://www.cndba.cn/dave/article/3593

在实际生产环境中,很多表上都是带有约束和其他的属性,比如主键,唯一,非空等。 达梦dexp和dimp目前对于表的约束支持没有问题,但是对于非空属性,在导出和导入之后会丢失,即导出之前列是非空的,导入之后变成可以为空。所以在使用中,要注意这部分内容,避免对业务产生影响。

http://www.cndba.cn/cndba/dave/article/4258
http://www.cndba.cn/cndba/dave/article/4258

具体测试验证过程如下。

查看达梦版本信息: http://www.cndba.cn/cndba/dave/article/4258

[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>

创建测试表:http://www.cndba.cn/cndba/dave/article/4258

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表的定义:http://www.cndba.cn/cndba/dave/article/4258

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]$

验证导入之后的表结构:http://www.cndba.cn/cndba/dave/article/4258

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 列的非空属性在恢复之后就丢失了。 http://www.cndba.cn/cndba/dave/article/4258http://www.cndba.cn/cndba/dave/article/4258

实际上达梦数据库中共有4种类型的约束:主键约束、外键约束、检查约束、唯一约束。根据以上的测试,这些约束应该都是可以同步过来的, 但是非空属性测不能同步过来。http://www.cndba.cn/cndba/dave/article/4258

所以这里要特别留意一下,对于这个问题,有两种解决方法:

1)可以先根据原库的DDL创建好对象,然后在导入的时候使用 table_exists_action=append,
2)直接在导入完成后修改对应列为非空即可。 http://www.cndba.cn/cndba/dave/article/4258

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2283
    原创
  • 3
    翻译
  • 579
    转载
  • 196
    评论
  • 访问:8170248次
  • 积分:4428
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ