如果源端和目标端数据库版本一致,服务器配置资源相当,考虑作为容灾备份或查询库分担,为了省去维护麻烦,我们可能会考虑启用DDL复制。(否则一般情况下不建议启用)
OGG从11R2开始在Integrated模式下使用了Logmining Server(OUTbound Server)这个进程读数据中的日志信息,转换生成Logical Change records(LCR)文件,extract进程再将读取这个LCR文件把数据存入trail文件。带来的一个明显好处就是OGG12c之后DDL无需触发器了。
ogg经典模式为了启用DDL还需要执行一堆DDL脚本,而使用集成模式之后只需在抽取和复制进程添加DDL简单语句即可。
注意:多租户环境只支持ogg集成模式。
抽取:
DDL INCLUDE ALL --如果需要过滤一些不必要的DDL命令,可以参阅更多参数细节https://docs.oracle.com/en/middleware/goldengate/core/19.1/reference/ddlsubst.html#GUID-27ABBB78-9DA3-4E51-A961-1FC49340C2B2
–DDL INCLUDE ALL
DDL INCLUDE MAPPED EXCLUDE MAPPED OBJTYPE ‘TRIGGER’ EXCLUDE MAPPED INSTR ‘FOREIGN KEY’
DDLOPTIONS ADDTRANDATA, REPORT
GGSCI (ora02) 42> view param e1
EXTRACT e1
USERIDALIAS jyc
TRANLOGOPTIONS MININGUSERALIAS mid
TRANLOGOPTIONS INTEGRATEDPARAMS (downstream_real_time_mine Y)
EXTTRAIL ./dirdat/e1
--DDL INCLUDE ALL
DDL INCLUDE MAPPED EXCLUDE MAPPED OBJTYPE 'TRIGGER' EXCLUDE MAPPED INSTR 'FOREIGN KEY'
DDLOPTIONS ADDTRANDATA, REPORT
DBOPTIONS ALLOWUNUSEDCOLUMN
GETTRUNCATES
UPDATERECORDFORMAT FULL
fetchoptions nousesnapshot
fetchoptions fetchpkupdatecols
SOURCECATALOG jycdb
TABLE jyc.*;
复制:
DDL INCLUDE MAPPED
DDLOPTIONS REPORT
GGSCI (ora02) 43> view param rep1
REPLICAT rep1
USERIDALIAS jycdb
ASSUMETARGETDEFS
DBOPTIONS INTEGRATEDPARAMS(parallelism 2)
GETTRUNCATES
DDL INCLUDE MAPPED
DDLOPTIONS REPORT
--SOURCECATALOG jycdb
MAP jycdb.jyc.*, TARGET jycdb.jyc.*;
源端新建表,索引,约束,主键,删除表,增删字段等等,通通在目标端都可以自动复制应用。
特别需注意:
1.对于ctas的方式,比如create table test as select * from user_objects;源端和目标端获取的结果是不一致的。因为创建表的数据来源于自身库的对象。
2.清理回收站动作不会同步
以下为测试的记录:
源端:
SQL> select * from t;
ID
----------
1
2
10
22
SQL> insert into t values(23);
已创建 1 行。
SQL> commit;
提交完成。
SQL> truncate table t;
表被截断。
SQL> set time on
09:32:09 SQL> insert into t values(23);
已创建 1 行。
09:34:30 SQL> commit;
提交完成。
09:34:32 SQL> insert into t values(2);
已创建 1 行。
09:34:54 SQL> commit;
提交完成。
09:34:56 SQL> create table a (id int);
表已创建。
09:35:24 SQL> insert into a values(1);
已创建 1 行。
09:35:40 SQL> commit;
提交完成。
09:35:42 SQL> create index idx_a on a(id);
索引已创建。
09:36:31 SQL> col index_name for a30
09:37:44 SQL> col table_name for a30
09:37:49 SQL> r
1* select index_name,table_name from user_indexes
INDEX_NAME TABLE_NAME
------------------------------ ------------------------------
SYS_C007546 TEST
SYS_C007552 T
PK_J_ID J
IDX_A A
09:37:49 SQL> alter table a add name varchar2(20);
表已更改。
09:38:15 SQL> desc a;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
NAME VARCHAR2(20)
09:38:20 SQL> alter table a modify(name varchar2(50));
表已更改。
09:38:47 SQL> desc a;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
NAME VARCHAR2(50)
09:38:51 SQL> alter table a drop column name;
表已更改。
09:39:24 SQL> desc a
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
09:39:27 SQL> create table b as select * from dba_objects;
表已创建。
09:40:33 SQL> select count(*) from b;
COUNT(*)
----------
72427
09:40:39 SQL> /
COUNT(*)
----------
72427
09:40:53 SQL> truncate table b;
表被截断。
09:41:00 SQL> drop table b;
表已删除。
09:41:17 SQL> show parameter recy;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_recycle string
db_recycle_cache_size big integer 0
recyclebin string on
09:41:41 SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
B BIN$/8iczVP5D13gU5rPqMDuQQ==$0 TABLE 2023-07-06:09:41:17
09:41:51 SQL> purge recyclebin;
回收站已清空。
09:47:12 SQL> desc a;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
09:47:22 SQL> alter table a add constraint pk_a primary key(id);
表已更改。
09:47:39 SQL> select constraint_name from user_constraints;
CONSTRAINT_NAME
--------------------------------------------------------------------------------
PK_J_ID
PK_A
SYS_C007546
SYS_C007551
SYS_C007552
09:48:31 SQL> col CONSTRAINT_NAME for a20
09:48:41 SQL> select table_name,constraint_name from user_constraints;
TABLE_NAME CONSTRAINT_NAME
------------------------------ --------------------
J PK_J_ID
A PK_A
TEST SYS_C007546
T SYS_C007551
T SYS_C007552
09:48:55 SQL>
10:54:23 SQL> create table t1(id int not null,name varchar(20),constraint pk_t1 primary key(id));
表已创建。
10:56:02 SQL> insert into t1 values(1,'a');
已创建 1 行。
10:56:17 SQL> commit;
提交完成。
10:56:19 SQL>
目标端:
SQL> select * from t;
ID
----------
1
2
10
22
SQL> /
ID
----------
1
2
10
22
SQL> /
ID
----------
1
2
10
22
SQL> /
ID
----------
1
2
10
22
SQL> /
ID
----------
1
2
10
22
SQL> /
ID
----------
1
2
10
22
SQL> /
ID
----------
1
2
10
22
23
SQL> set time on
09:32:04 SQL> /
ID
----------
1
2
10
22
23
09:32:06 SQL> /
未选定行
09:32:12 SQL> /
未选定行
09:34:37 SQL> /
未选定行
09:34:39 SQL> /
未选定行
09:34:41 SQL> /
ID
----------
23
09:34:43 SQL> /
ID
----------
23
09:34:58 SQL> /
ID
----------
23
09:35:00 SQL> /
ID
----------
23
09:35:01 SQL> /
ID
----------
23
09:35:03 SQL> /
ID
----------
23
09:35:04 SQL> /
ID
----------
2
23
09:35:06 SQL> select * from a;
未选定行
09:35:56 SQL> /
ID
----------
1
09:36:00 SQL> select index_name from user_indexes;
INDEX_NAME
--------------------------------------------------------------------------------
SYS_C007569
PK_J_ID
IDX_A
SYS_C007546
09:36:59 SQL> col index_name for a30
09:37:14 SQL> col table_name for a30
09:37:20 SQL> select index_name,table_name from user_indexes;
INDEX_NAME TABLE_NAME
------------------------------ ------------------------------
SYS_C007546 TEST
SYS_C007569 T
PK_J_ID J
IDX_A A
09:37:21 SQL> desc a;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
NAME VARCHAR2(20)
09:38:24 SQL> desc a;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
NAME VARCHAR2(50)
09:39:03 SQL> desc a
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
NAME VARCHAR2(50)
09:39:31 SQL> desc a
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
09:39:34 SQL> select count(*) from b;
COUNT(*)
----------
72470
09:40:46 SQL> /
COUNT(*)
----------
72470
09:40:51 SQL> /
COUNT(*)
----------
72470
09:41:03 SQL> /
COUNT(*)
----------
72470
09:41:05 SQL> /
COUNT(*)
----------
72470
09:41:06 SQL> /
COUNT(*)
----------
72470
09:41:08 SQL> /
COUNT(*)
----------
0
09:41:10 SQL> /
COUNT(*)
----------
0
09:41:22 SQL> /
select count(*) from b
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
09:41:24 SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
B BIN$/8iFGdxoEazgU5zPqMCqqQ==$0 TABLE 2023-07-06:09:41:23
09:41:59 SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
B BIN$/8iFGdxoEazgU5zPqMCqqQ==$0 TABLE 2023-07-06:09:41:23
09:42:17 SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
B BIN$/8iFGdxoEazgU5zPqMCqqQ==$0 TABLE 2023-07-06:09:41:23
09:42:22 SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
B BIN$/8iFGdxoEazgU5zPqMCqqQ==$0 TABLE 2023-07-06:09:41:23
09:42:24 SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
B BIN$/8iFGdxoEazgU5zPqMCqqQ==$0 TABLE 2023-07-06:09:41:23
09:42:27 SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
B BIN$/8iFGdxoEazgU5zPqMCqqQ==$0 TABLE 2023-07-06:09:41:23
09:42:30 SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
B BIN$/8iFGdxoEazgU5zPqMCqqQ==$0 TABLE 2023-07-06:09:41:23
09:42:44 SQL> /
select count(*) from b
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
09:42:53 SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
B BIN$/8iFGdxoEazgU5zPqMCqqQ==$0 TABLE 2023-07-06:09:41:23
09:42:59 SQL> purge recyclebin;
回收站已清空。
09:43:06 SQL> show recyclebin;
09:43:11 SQL> col CONSTRAINT_NAME for a20
09:49:02 SQL> select table_name,constraint_name from user_constraints;
TABLE_NAME CONSTRAINT_NAME
------------------------------ --------------------
T SYS_C007568
T SYS_C007569
J PK_J_ID
A PK_A
TEST SYS_C007546
09:49:10 SQL> select * from t1;
未选定行
10:56:26 SQL> /
未选定行
10:56:27 SQL> /
ID NAME
---------- --------------------
1 a
10:56:30 SQL>
相关参考:
https://www.modb.pro/db/84733
http://blog.itpub.net/29785807/viewspace-2685439/




