达梦数据库获取索引约束定义(DMHS迁移流程相关)

接上篇文章《达梦数据库获取表结构和对象定义方法》

在数据迁移过程中,为了提高迁移效率,一般会先迁移表结构,然后迁移数据,数据迁移完成后对迁移的表对象加约束索引注释等。

当数据量较大时,一般推荐使用DMHS(达梦数据实时同步软件)进行迁移。该工具是支持异构环境的高性能、高可靠、高可扩展数据库实时同步复制系统。该产品采用基于日志的结构化数据复制技术,不依赖主机上源数据库的触发器或者规则,对主机源数据库系统几乎无影响,能以极少的系统开销实现秒级数据实时同步复制。DMHS基于成熟的关系数据模型和标准接口,支持多种软硬件平台,能够灵活的配置出一对一、一对多、多对一、多对多以及级联等多种形式的复制拓扑结构,可以广泛应用于应急系统、容灾备份、负载均衡、数据移植、联机维护、订阅分发、多业务中心等业务领域。

那么,在使用DMHS进行数据迁移的时候,通常建议使用DTS迁移表结构,使用DMHS迁移数据。

当使用DTS迁移完表结构之后,需要获取到对应的约束和索引定义语句,而后,将这些索引和约束删除,以便提升数据迁移效率。当数据迁移结束后,重新创建索引和约束。根据实测情况来看,删除后迁移效率提升比较明显。

注意:仅禁用约束和将索引失效仍是会影响DMHS数据迁移效率的。

第一部分

当表结构迁移完成后,可使用以下脚本批量生成获取对象的sql语句。

--批量生成获取索引定义的语句。(注意:索引是否有效,是否可见,可根据情况再加条件筛选)
select 'select dbms_metadata.get_ddl(OBJECT_TYPE => ''INDEX'',NAME=>upper('''||
        index_name||'''),SCHNAME => ''OWNER_NAME'');'
from
        dba_indexes
where
        owner       ='OWNER_NAME';
--AND TABLE_NAME IN ('T1','T2');

--批量生成约束定义语句(注意:约束是否有效,如果存在被禁用约束,建议分别获取DDL语句,对有效和无效的约束分别记录)
select 'select dbms_metadata.get_ddl(OBJECT_TYPE => ''CONSTRAINT'',NAME=>upper('''||
        constraint_name ||'''),SCHNAME => ''OWNER_NAME'');'
        
from
        dba_constraints
where
        owner ='OWNER_NAME';
    --and table_name in ('T1','T2');

--批量生成获取外键定义语句
select 'select dbms_metadata.get_ddl(OBJECT_TYPE => ''CONSTRAINT'',NAME=>upper('''||
        constraint_name ||'''),SCHNAME => ''OWNER_NAME'');'
        
from
        dba_constraints
where
        constraint_type='R' AND owner ='OWNER_NAME';
    --and table_name in ('T1','T2');

--批量生成获取主键定义语句
select 'select dbms_metadata.get_ddl(OBJECT_TYPE => ''CONSTRAINT'',NAME=>upper('''||
        constraint_name ||'''),SCHNAME => ''OWNER_NAME'');'
from
        dba_constraints
where
        constraint_type='P' and owner ='OWNER_NAME'
    --and table_name in ('T1','T2');

批量生成的sql语句大致如下所示:

select dbms_metadata.get_ddl(OBJECT_TYPE => 'INDEX',NAME=>upper('IND_1630344396479319'),SCHNAME => 'SCHNAME1');
select dbms_metadata.get_ddl(OBJECT_TYPE => 'INDEX',NAME=>upper('IDX_00950923013D2'),SCHNAME => 'SCHNAME1');
select dbms_metadata.get_ddl(OBJECT_TYPE => 'INDEX',NAME=>upper('IDX_DMTEST_TB_A'),SCHNAME => 'SCHNAME2');

select dbms_metadata.get_ddl(OBJECT_TYPE => 'CONSTRAINT',NAME=>upper('FK1689A6E2DC22CD47'),SCHNAME => 'SCHNAME1');
select dbms_metadata.get_ddl(OBJECT_TYPE => 'CONSTRAINT',NAME=>upper('FK1689A6EVSSD488'),SCHNAME => 'SCHNAME2');
select dbms_metadata.get_ddl(OBJECT_TYPE => 'CONSTRAINT',NAME=>upper('CONS123190909'),SCHNAME => 'SCHNAME2');

将上述sql语句到数据库中执行即可获取实际的对象DLL定义语句。

如果想批量得到DDL定义语句,可以使用以下方法。

1.在服务器新建sql文件存储 批量生成的获取对象定义的语句,如

cd /home/dmdba
vi getindexddl.sql

select dbms_metadata.get_ddl(OBJECT_TYPE => 'INDEX',NAME=>upper('IDX_TEST0'),SCHNAME => 'SCHNAME1');
select dbms_metadata.get_ddl(OBJECT_TYPE => 'INDEX',NAME=>upper('IDX_TEST1'),SCHNAME => 'SCHNAME1');
select dbms_metadata.get_ddl(OBJECT_TYPE => 'INDEX',NAME=>upper('IDX_TEST2'),SCHNAME => 'SCHNAME1');
select dbms_metadata.get_ddl(OBJECT_TYPE => 'INDEX',NAME=>upper('IDX_TEST3'),SCHNAME => 'SCHNAME1');
select dbms_metadata.get_ddl(OBJECT_TYPE => 'INDEX',NAME=>upper('IDX_TEST4'),SCHNAME => 'SCHNAME1');

2.使用disql登录数据库,执行SQL脚本,将获取到的DDL语句结果输出到指定文件中

./disql SYSDBA/SYSDBA@LOCALHOST:5236
SQL> SET ECHO OFF;
SQL> SET FEED OFF;
SQL> SET HEA OFF;
SQL> SET LINESHOW OFF;
SQL> SET NEWP 0;
SQL> SET PAGES 0;
SQL> SET TIMING OFF;
SQL> spool /home/dmdba/index_ddl.sql
SQL> start /home/dmdba/getindexddl.sql
SQL> spool off

3.查看/home/dmdba/index_ddl.sql文件,即对象定义语句

第二部分


删除索引和约束,为迁移数据做准备,批量生成约束和索引删除的语句,并执行。

--批量生成删除约束语句
select
        'ALTER TABLE "'
        ||OWNER
        ||'"."'
        ||TABLE_NAME
        ||'" DROP CONSTRAINT '
        ||constraint_name
        ||';'
from
        dba_constraints
where   owner ='owner_name';

--批量生成删除索引语句
select 'DROP INDEX "'||OWNER||'"."'||
        index_name||';'
from
        dba_indexes
where
        owner       ='owner_name'

第三部分

删除索引和约束后,执行数据迁移流程。数据迁移完毕后,执行第一部分内容中生成的DDL语句,重新创建索引和约束即可。

欢迎关注我的博客《Jackin's Blog - 知识改变命运》学习分享更多知识

你可能感兴趣的:(达梦数据库,数据库,sql,达梦数据库)