达梦数据库——获取索引约束定义(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/[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语句,重新创建索引和约束即可。