欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-03 20:14:49
...

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

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

当数据量较大时,一般推荐使用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/[email protected]: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语句,重新创建索引和约束即可。