【大数据实时数据同步】OGG异构多路映射同步原表审计表只存删除数据表实现方案(二)

news2024/12/26 0:16:42

文章目录

  • 前言
  • 十一、将SCOTT下所有已同步的HIS表逻辑同步配置改为DEL表操作
    • 1、首先来看一下抽取进程和应用进程我们要修改成什么样的配置
    • 2、开始前先停止源端的抽取进程
    • 3、清除原来HIS表非DELETE操作数据
    • 4、启动抽取进程和应用进程验证
  • 总结


前言

这里是后续!!!前一章写的太多,编辑器卡死了,只能再写一篇文章补充啦!!!!
前一篇文章地址:【大数据实时数据同步】OGG多路映射同步原表&审计表&只存删除数据表实现方案(一)

博主所在单位目前使用Oracle GoldenGate将各个业务生产库汇聚到一起做数仓实时ODS平台,源端库可能涉及Oracle、Mysql、达梦、Guassdb库。为了做增量etl以及记录每条数据的变更历史:

  • 我们采用异构同步,即源端同步过来的表在ODS新增了一个etltime字段,用来记录当前数据变更时间。
  • 为了记录数据的事务变更历史记录,我们将数据的变更记录映射同步到一张tab_name_audit表中。
  • 为了防止源端业务库误删数据,我们将被删除的数据映射同步到一张tab_name_his表中。
  • 原表映射到ods后还是正常的映射同步dml操作。

至于以上方式是怎么实现的,我这里给大家在本地电脑做一次模拟。至于GoldenGate如何安装,请看博主其他相关文章,这里就不赘述了!!!


十一、将SCOTT下所有已同步的HIS表逻辑同步配置改为DEL表操作

1、首先来看一下抽取进程和应用进程我们要修改成什么样的配置

--------------抽取进程:
GGSCI (11g) 4> edit params e_sc

extract e_sc
userid ogg,password ogg
setenv(NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
setenv(ORACLE_SID="orcl")
reportcount every 10 minutes,rate
numfiles 5000
discardfile ./dirrpt/e_sc.dsc,append,megabytes 1000
warnlongtrans 2h,checkinterval 3m
exttrail ./dirdat/sc
threadoptions maxcommitpropagationdelay 60000
dboptions allowunusedcolumn
tranlogoptions archivedlogonly
tranlogoptions altarchivelogdest primary /u01/archivelog
TRANLOGOPTIONS ALTARCHIVEDLOGFORMAT %t_%s_%r.dbf
dynamicresolution
ddl include mapped
ddloptions addtrandata,report
notcpsourcetimer
nocompressupdates
--fetchoptions nousesnapshot
fetchoptions USEROWID
--GETUPDATEBEFORES
NOCOMPRESSDELETES
----------scott.EMP
table SCOTT.EMP,tokens(
TKN-CSN = @GETENV("TRANSACTION", "CSN"),
TKN-COMMIT-TS = @GETENV ("GGHEADER", "COMMITTIMESTAMP"),
TKN-OP-TYPE = @GETENV ("GGHEADER", "OPTYPE")
);
----------SCOTT.DEPT
table SCOTT.DEPT,tokens(
TKN-CSN = @GETENV("TRANSACTION", "CSN"),
TKN-COMMIT-TS = @GETENV ("GGHEADER", "COMMITTIMESTAMP"),
TKN-OP-TYPE = @GETENV ("GGHEADER", "OPTYPE")
);
----------SCOTT.DEL
table SCOTT.DEL,tokens(
TKN-CSN = @GETENV("TRANSACTION", "CSN"),
TKN-COMMIT-TS = @GETENV ("GGHEADER", "COMMITTIMESTAMP"),
TKN-OP-TYPE = @GETENV ("GGHEADER", "OPTYPE")
);
----------SCOTT.nopk_tab
table SCOTT.NOPK_TAB,keycols(EMPNO,ENAME),tokens(
TKN-CSN = @GETENV("TRANSACTION", "CSN"),
TKN-COMMIT-TS = @GETENV ("GGHEADER", "COMMITTIMESTAMP"),
TKN-OP-TYPE = @GETENV ("GGHEADER", "OPTYPE")
);

----------------------应用进程配置
----R_SC2进程
GGSCI (OGG) 25> edit params r_sc2

replicat r_sc2
setenv(NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
userid ogg,password ogg
reportcount every 30 minutes,rate
reperror default,abend
--reperror default,DISCARD
numfiles 50000
checkpointsecs 40
assumetargetdefs
discardfile ./dirrpt/r_sc2.dsc,append,megabytes 1000
allownoopupdates
ddl &
include mapped &
exclude objname scott.*_audit &
exclude optype create &
        objtype 'table' &
exclude optype drop &
        objtype 'table' &
exclude objtype 'index' &
        objname SCOTT.*_his &
exclude instr 'constraint' &
---exclude instr 'null' &
exclude instr 'trigger' &
exclude instr 'rename to' &
exclude instr 'grant' &
exclude instr 'revoke' &
exclude instr 'analyze'
DDLOPTIONS MAPSESSIONSCHEMA XUM target ogg
ddloptions report
allowduptargetmap
----------DEPT
getinserts
getupdates
getdeletes
noupdatedeletes
NOINSERTDELETES
map SCOTT.DEPT,target SCOTT.DEPT;
updatedeletes
getinserts
ignoreupdates
ignoredeletes
map SCOTT.DEPT,target SCOTT.DEPT_AUDIT,keycols(DEPTNO),colmap(
usedefaults,
csn=@token("TKN-CSN"),
optime=@token("TKN-COMMIT-TS"),
optype=@token("TKN-OP-TYPE"),
inserttime=@token("TKN-COMMIT-TS"),
curdate=@DATENOW()
);
ignoreinserts
getupdates
getdeletes
map SCOTT.DEPT,target SCOTT.DEPT_AUDIT,keycols(DEPTNO),colmap(
usedefaults,
csn=@token("TKN-CSN"),
optime=@token("TKN-COMMIT-TS"),
optype=@token("TKN-OP-TYPE"),
curdate=@DATENOW()
),filter(@strfind(@token("TKN-OP-TYPE"),"PK UPDATE") =0);
ignoreinserts
getupdates
getdeletes
map SCOTT.DEPT,target SCOTT.DEPT_AUDIT,keycols(DEPTNO),colmap(
usedefaults,
csn=@token("TKN-CSN"),
optime=@token("TKN-COMMIT-TS"),
optype=@case(@token("TKN-OP-TYPE"),"PK UPDATE","INSERT"),
inserttime=@token("TKN-COMMIT-TS"),
curdate=@DATENOW()
),filter(@strfind(@token("TKN-OP-TYPE"),"PK UPDATE") >0),insertallrecords;
ignoreinserts
getupdates
getdeletes
map SCOTT.DEPT,target SCOTT.DEPT_AUDIT,keycols(DEPTNO),colmap(
DEPTNO=before.DEPTNO,
csn=@token("TKN-CSN"),
optime=@token("TKN-COMMIT-TS"),
optype=@case(@token("TKN-OP-TYPE"),"PK UPDATE","DELETE"),
curdate=@DATENOW()
),filter(@strfind(@token("TKN-OP-TYPE"),"PK UPDATE") >0);
ignoreinserts
ignoreupdates
getdeletes
noupdatedeletes
INSERTDELETES
MAP SCOTT.DEPT, TARGET SCOTT.DEPT_DEL,keycols(DEPTNO),colmap(
usedefaults
BEFORE_AFTER=@getenv("GGHEADER", "BEFOREAFTERINDICATOR"),
DEL_DATE=@getenv ("GGHEADER", "COMMITTIMESTAMP"),
OP_FLAG=@getenv ("GGHEADER", "OPTYPE")
);
map SCOTT.DEPT,target SCOTT.DEPT_HIS,keycols(DEPTNO);
----------NOPK_TAB
getinserts
getupdates
getdeletes
noupdatedeletes
NOINSERTDELETES
map SCOTT.NOPK_TAB,target SCOTT.NOPK_TAB,keycols(EMPNO,ENAME);
updatedeletes
getinserts
getupdates
getdeletes
map SCOTT.NOPK_TAB,target SCOTT.NOPK_TAB_AUDIT,keycols(EMPNO,ENAME),colmap(
EMPNO=@if(@strfind(@token("tkn-op-type"),"PK UPDATE")>0,before.EMPNO,EMPNO),
ENAME=@if(@strfind(@token("tkn-op-type"),"PK UPDATE")>0,before.ENAME,ENAME)
csn=@token("tkn-csn"),
optime=@token("tkn-commit-ts"),
optype=@if(@strfind(@token("tkn-op-type"),"PK UPDATE")>0,"DELETE",@token("tkn-op-type")),
inserttime=@eval(@strfind(@token("tkn-op-type"),"INSERT")>0,@token("tkn-commit-ts")),
curdate=@DATENOW()
);
ignoreinserts
getupdates
ignoredeletes
map SCOTT.NOPK_TAB,target SCOTT.NOPK_TAB_AUDIT,keycols(EMPNO,ENAME),colmap(
usedefaults,
csn=@token("tkn-csn"),
optime=@token("tkn-commit-ts"),
optype=@case(@token("tkn-op-type"),"PK UPDATE","INSERT"),
inserttime=@token("tkn-commit-ts"),
curdate=@DATENOW()
),filter(@strfind(@token("tkn-op-type"),"PK UPDATE") >0),insertallrecords;
ignoreinserts
ignoreupdates
getdeletes
noupdatedeletes
INSERTDELETES
MAP SCOTT.NOPK_TAB, TARGET SCOTT.NOPK_TAB_DEL,keycols(EMPNO,ENAME),colmap(
usedefaults,
BEFORE_AFTER=@getenv("GGHEADER", "BEFOREAFTERINDICATOR"),
DEL_DATE=@getenv ("GGHEADER", "COMMITTIMESTAMP"),
OP_FLAG=@getenv ("GGHEADER", "OPTYPE")
);
map SCOTT.NOPK_TAB,target SCOTT.NOPK_TAB_HIS,keycols(EMPNO,ENAME);

----R_SC进程:
GGSCI (OGG) 24> edit params r_sc


replicat r_sc
setenv(NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
userid ogg,password ogg
reportcount every 30 minutes,rate
reperror default,abend
numfiles 50000
checkpointsecs 40
assumetargetdefs
discardfile ./dirrpt/r_sc.dsc,append,megabytes 1000
allownoopupdates
ddl &
include mapped &
exclude objname scott.*_audit &
exclude optype create &
        objtype 'table' &
exclude optype drop &
        objtype 'table' &
exclude objtype 'index' &
        objname SCOTT.*_his &
exclude instr 'constraint' &
---exclude instr 'null' &
exclude instr 'trigger' &
exclude instr 'rename to' &
exclude instr 'grant' &
exclude instr 'revoke' &
exclude instr 'analyze'
DDLOPTIONS MAPSESSIONSCHEMA XUM target ogg
ddloptions report
allowduptargetmap
--INSERTALLRECORDS
----------EMP
getinserts
getupdates
getdeletes
noupdatedeletes
noinsertdeletes
map SCOTT.EMP,target SCOTT.EMP;
updatedeletes
--map SCOTT.EMP,target SCOTT.EMP_HIS,keycols(EMPNO);
getinserts
ignoreupdates
ignoredeletes
map SCOTT.EMP,target SCOTT.EMP_AUDIT,keycols(EMPNO),colmap(
usedefaults,
csn=@token("TKN-CSN"),
optime=@token("TKN-COMMIT-TS"),
optype=@token("TKN-OP-TYPE"),
inserttime=@token("TKN-COMMIT-TS"),
curdate=@DATENOW()
);
ignoreinserts
getupdates
getdeletes
map SCOTT.EMP,target SCOTT.EMP_AUDIT,keycols(EMPNO),colmap(
usedefaults,
csn=@token("TKN-CSN"),
optime=@token("TKN-COMMIT-TS"),
optype=@token("TKN-OP-TYPE"),
curdate=@DATENOW()
),filter(@strfind(@token("TKN-OP-TYPE"),"PK UPDATE") =0);
ignoreinserts
getupdates
getdeletes
map SCOTT.EMP,target SCOTT.EMP_AUDIT,keycols(EMPNO),colmap(
usedefaults,
csn=@token("TKN-CSN"),
optime=@token("TKN-COMMIT-TS"),
optype=@case(@token("TKN-OP-TYPE"),"PK UPDATE","INSERT"),
inserttime=@token("TKN-COMMIT-TS"),
curdate=@DATENOW()
),filter(@strfind(@token("TKN-OP-TYPE"),"PK UPDATE") >0),insertallrecords;
ignoreinserts
getupdates
getdeletes
map SCOTT.EMP,target SCOTT.EMP_AUDIT,keycols(EMPNO),colmap(
EMPNO=before.EMPNO,
csn=@token("TKN-CSN"),
optime=@token("TKN-COMMIT-TS"),
optype=@case(@token("TKN-OP-TYPE"),"PK UPDATE","DELETE"),
curdate=@DATENOW()
),filter(@strfind(@token("TKN-OP-TYPE"),"PK UPDATE") >0);
ignoreinserts
ignoreupdates
getdeletes
noupdatedeletes
INSERTDELETES
map SCOTT.EMP,target SCOTT.EMP_HIS,keycols(EMPNO);

2、开始前先停止源端的抽取进程

--------------停止抽取进程
stop e_sc
查看抽取进程结束位置,查看抽取进程“Log Read Checkpoint”的“Seqno”和“RBA”,查看抽取进程“Target Extract Trails”的“Seqno”和“RBA”
GGSCI (11g) 7> info e_Sc detail

EXTRACT    E_SC      Last Started 2018-02-23 16:22  Status STOPPED
Checkpoint Lag      00:00:00 (updated 00:00:31 ago)
Log Read Checkpoint  Oracle Redo Logs
                    2018-02-26 09:19:12  Seqno 559, RBA 52736
                    SCN 0.1684462 (1684462)

  Target Extract Trails:

  Remote Trail Name                                Seqno        RBA    Max MB

  ./dirdat/sc                                        79      18167        500
--------------停止投递进程
停止投递进程前检查,查看投递进程的“Log Read Checkpoint”的“Seqno”和“RBA”
info D_SC detail
GGSCI (11g) 8> info D_SC detail

EXTRACT    D_SC      Last Started 2018-02-12 14:20  Status RUNNING
Checkpoint Lag      00:00:00 (updated 00:00:06 ago)
Log Read Checkpoint  File ./dirdat/sc000079
                    2018-02-26 09:19:12.000000  RBA 18167

  Target Extract Trails:

  Remote Trail Name                                Seqno        RBA    Max MB

  ./dirdat/sc                                        56      20937        500

--------------如果数值和抽取进程“Target Extract Trails”的“Seqno”和“RBA”一致,才可以停止投递进程
stop D_SC 

--------------停止应用进程
停止应用进程前检查,查看应用进程“Log Read Checkpoint”的“Seqno”和“RBA”

info r_sc detail 
GGSCI (OGG) 26> info r_sc detail

REPLICAT  R_SC      Last Started 2018-02-26 10:08  Status RUNNING
Checkpoint Lag      00:00:00 (updated 00:00:10 ago)
Log Read Checkpoint  File ./dirdat/sc000056
                    First Record  RBA 20937
..................

info r_sc2 detail 

GGSCI (OGG) 27> info r_sc2 detail

REPLICAT  R_SC2    Last Started 2018-02-23 15:55  Status RUNNING
Checkpoint Lag      00:00:00 (updated 00:00:16 ago)
Log Read Checkpoint  File ./dirdat/sc000056
                    2018-02-26 09:19:12.014722  RBA 20937
.................

如果上面两个应用进程“Seqno”和“RBA”数值和前面记录下来的投递进程的“Target Extract Trails”的“Seqno”和“RBA”一致,才可以停止应用进程.
现在看来是一致的了,seq都是sc000056,rba都是20937,停止应用进程。
stop r_sc
stop r_sc2
GGSCI (OGG) 29> info all



Program    Status      Group      Lag at Chkpt  Time Since Chkpt



MANAGER    RUNNING                                          

REPLICAT    STOPPED    R_SC        00:00:00      00:00:01    

REPLICAT    STOPPED    R_SC2      00:00:00      00:00:01

3、清除原来HIS表非DELETE操作数据

现在将最上面的抽取和应用进程的配置替换现在的抽取和应用进程。接下来的操作就是把已同步的三张表在应用端映射的HIS中保存的原来的所有增删改的记录
只保留被delete的记录,其余保留的插入和修改的历史记录全部删除,这就需要写一个脚本来实现了,写脚本使用ogg端ogg_tables_info表
这张表存的是当前ogg环境中所有已同步表对应的信息,此表的表结构和信息:

create table ogg_tables_info 
(
USER_NAME       VARCHAR2(50)  ,
TABLE_NAME      VARCHAR2(50)  ,
OGG_USER_NAME   VARCHAR2(50)  ,
OGG_TABLE_NAME  VARCHAR2(50)  ,
TABLE_COMMENT   VARCHAR2(1000),
TABLE_TYPE      VARCHAR2(50)  ,
PK_COLUMN       VARCHAR2(400) ,
PK_COLUMN_TYPE  VARCHAR2(100) ,
HIS_TABLENAME   VARCHAR2(100) ,
AUDIT_TABLENAME VARCHAR2(100) ,
FLAG_MON        VARCHAR2(1)         
)
insert into ogg_tables_info(user_name,table_name,ogg_user_name,ogg_table_name,pk_column,his_tablename,audit_tablename,flag_mon)
values('SCOTT','DEPT','SCOTT','DEPT','DEPTNO','DEPT_HIS','DEPT_AUDIT',1);
insert into ogg_tables_info(user_name,table_name,ogg_user_name,ogg_table_name,pk_column,his_tablename,audit_tablename,flag_mon)
values('SCOTT','EMP','SCOTT','EMP','EMPNO','EMP_HIS','EMP_AUDIT',1);
insert into ogg_tables_info(user_name,table_name,ogg_user_name,ogg_table_name,pk_column,his_tablename,audit_tablename,flag_mon)
values('SCOTT','NOPK_TAB','SCOTT','NOPK_TAB','DEPTNO','NOPK_TAB_HIS','NOPK_TAB_AUDIT',1);

接下来写脚本:

--set serveroutput on;
declare
v_error_pos    varchar2 (50);  --错误位置
v_error_code  varchar2 (8);  --错误代码
v_error_msg  varchar2 (500); --错误信息
exec_error      exception;      --自定义异常

cursor audittab1 is 
select OGG_USER_NAME,OGG_TABLE_NAME,HIS_TABLENAME,AUDIT_TABLENAME,PK_COLUMN 
from 
ogg_tables_info 
where flag_mon='1' and PK_COLUMN not like '%,%';
cursor audittab2 is 
select OGG_USER_NAME,OGG_TABLE_NAME,HIS_TABLENAME,AUDIT_TABLENAME,PK_COLUMN 
from 
ogg_tables_info 
where flag_mon='1' and PK_COLUMN like '%,%';
v_sql varchar2(2000);
begin 

for tab in audittab1
loop
v_sql:='delete from '||tab.HIS_TABLENAME||' where  not exists (select null from (select '||tab.PK_COLUMN||' as pkcol from '||tab.OGG_USER_NAME||'.'||tab.AUDIT_TABLENAME||' where optype=''DELETE'')'||'t where t.pkcol='||tab.PK_COLUMN||')';
execute immediate v_sql;
end loop;

for tab2 in audittab2
loop
v_sql:='delete from '||tab2.HIS_TABLENAME||' where  not exists (select null from (select '||replace(tab2.PK_COLUMN,',','||')||' as pkcol2 from '||tab2.OGG_USER_NAME||'.'||tab2.AUDIT_TABLENAME||' where optype=''DELETE'')'||'t where t.pkcol2='||replace(tab2.PK_COLUMN,',','||')||')';                                                          
execute immediate v_sql;
end loop;
commit;
exception 
when others
then 
v_error_code := sqlcode;
v_error_msg := substr (sqlerrm,1,500);
  rollback;
  dbms_output.put_line('v_error_code= '||v_error_code||CHR(10)||'v_error_msg= '||v_error_msg);
end;

脚本执行完成后,现在这三张表对应的HIS中保存的都是在审计表中记录的做过删除操作的记录,因为之前的历史表配置,只是不执行delete操作,如果记录之前执行了insert和普通的update操作,那么在源端执行delete操作时,目的端不会执行删除操作,从而使得被删除的记录得以保存。

4、启动抽取进程和应用进程验证

----------源端启动抽取/投递进程
start er *
GGSCI (11g) 3> info all

Program    Status      Group      Lag at Chkpt  Time Since Chkpt

MANAGER    RUNNING                                          
EXTRACT    RUNNING    D_SC        00:00:00      00:00:01    
EXTRACT    RUNNING    E_SC        00:00:00      00:00:03  

-------------目的端启动应用进程
start er *
GGSCI (OGG) 24> info all

Program    Status      Group      Lag at Chkpt  Time Since Chkpt

MANAGER    RUNNING                                          
REPLICAT    RUNNING    R_SC        00:00:00      00:00:36    
REPLICAT    RUNNING    R_SC2      00:00:00      00:00:36    

接下来在源端进行下面一系列操作:

insert into dept values(51,'a','b');
insert into dept values(52,'a','b');
commit;
alter system switch logfile;

在目的端查看:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发现正常应用过来了,然后再再源端进行下面操作:

update dept set DNAME ='bbb' where deptno=52;
update dept set deptno=25,DNAME ='bbb' where deptno=52;

delete from dept where deptno=51;
commit;
alter system switch logfile;

再目的端查看:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
贴上trail内容:

[oracle@OGG ogg11]$ ./logdump 

Oracle GoldenGate Log File Dump Utility for Oracle
Version 11.2.1.0.3 14400833 OGGCORE_11.2.1.0.3_PLATFORMS_120823.1258

Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.



Logdump 314 >obey loginit_sc
cd ./dirdat
open sc000057
Current LogTrail is /u01/app/oracle/ogg11/dirdat/sc000057 
ghdr on
detail on
detail data
usertoken on
usertoken detail
ggstoken on
ggstoken detail
headertoken on
headertoken detail
reclen 0
Reclen set to 0 
pos last
Reading forward from RBA 3017 
pos rev
Reading in reverse from RBA 3017 
logtrail
Current LogTrail is /u01/app/oracle/ogg11/dirdat/sc000057 
pos
Current position is RBA 3017  Reverse 

Logdump 315 >pos last 
Reading in reverse from RBA 3017 
Logdump 316 >pos rev 
Reading in reverse from RBA 3017 
Logdump 317 >n
TokenID x47 'G' Record Header    Info x01  Length  201 
TokenID x48 'H' GHDR            Info x00  Length  45 
4504 0042 0020 03ff 02f2 8c4c eb2f 7a97 0000 0000 | E..B. .....L./z.....  
0002 85e4 0000 0231 0252 0000 0001 5343 4f54 542e | .......1.R....SCOTT.  
4445 5054 00                                      | DEPT.  
TokenID x44 'D' Data            Info x00  Length  32 
TokenID x54 'T' GGS Tokens      Info x00  Length  24 
TokenID x55 'U' User Tokens      Info x00  Length  76 
TokenID x5a 'Z' Record Trailer  Info x01  Length  201 
___________________________________________________________________ 
Hdr-Ind    :    E  (x45)    Partition  :    .  (x04)  
UndoFlag  :    .  (x00)    BeforeAfter:    B  (x42)  
RecLength  :    32  (x0020)  IO Time    : 2018/02/26 16:40:30.995.095  
IOType    :    3  (x03)    OrigNode  :  255  (xff) 
TransInd  :    .  (x02)    FormatType :    R  (x52) 
SyskeyLen  :    0  (x00)    Incomplete :    .  (x00) 
AuditRBA  :        561      AuditPos  : 165348 
Continued  :    N  (x00)    RecCount  :    1  (x01) 

2018/02/26 16:40:30.995.095 Delete              Len    32 RBA 2816 
Name: SCOTT.DEPT 
Before Image:                                            Partition 4  GU e  
0000 000a 0000 0000 0000 0000 0033 0001 0005 0000 | .............3......  
0001 6100 0200 0500 0000 0162                    | ..a........b  
Column    0 (x0000), Len    10 (x000a)  
0000 0000 0000 0000 0033                          | .........3  
Column    1 (x0001), Len    5 (x0005)  
0000 0001 61                                      | ....a  
Column    2 (x0002), Len    5 (x0005)  
0000 0001 62                                      | ....b  
  
User tokens:  76 bytes 
TKN-CSN            : 1703311 
TKN-COMMIT-TS      : 2018-02-26 16:40:31.000000 
TKN-OP-TYPE        : DELETE 
  
GGS tokens: 
TokenID x52 'R' ORAROWID        Info x00  Length  20 
4141 4156 5243 4141 4541 4141 4143 4841 4142 0001 | AAAVRCAAEAAAACHAAB..  
  
Logdump 318 >n
TokenID x47 'G' Record Header    Info x01  Length  213 
TokenID x48 'H' GHDR            Info x00  Length  45 
4504 0041 0029 73ff 02f2 8c4c eb2f 7a97 0000 0000 | E..A.)s....L./z.....  
0000 6c10 0000 0000 0152 0000 0001 5343 4f54 542e | ..l......R....SCOTT.  
4445 5054 00                                      | DEPT.  
TokenID x44 'D' Data            Info x00  Length  41 
TokenID x54 'T' GGS Tokens      Info x00  Length  24 
TokenID x55 'U' User Tokens      Info x00  Length  79 
TokenID x5a 'Z' Record Trailer  Info x01  Length  213 
___________________________________________________________________ 
Hdr-Ind    :    E  (x45)    Partition  :    .  (x04)  
UndoFlag  :    .  (x00)    BeforeAfter:    A  (x41)  
RecLength  :    41  (x0029)  IO Time    : 2018/02/26 16:40:30.995.095  
IOType    :  115  (x73)    OrigNode  :  255  (xff) 
TransInd  :    .  (x01)    FormatType :    R  (x52) 
SyskeyLen  :    0  (x00)    Incomplete :    .  (x00) 
AuditRBA  :          0      AuditPos  : 27664 
Continued  :    N  (x00)    RecCount  :    1  (x01) 

2018/02/26 16:40:30.995.095 GGSPKUpdate          Len    41 RBA 2603 
Name: SCOTT.DEPT 
After  Image:                                            Partition 4  GU m  
000e 0000 000a 0000 0000 0000 0000 0034 0000 000a | ...............4....  
0000 0000 0000 0000 0019 0001 0007 0000 0003 6262 | ..................bb  
62                                                | b  
Before Image          Len    16 (x00000010) 
KeyLen    14 (x0000000e) 
KeyCol    0 (x0000), Len    10 (x000a)  
0000 0000 0000 0000 0034                          | .........4  

After Image          Len    25 (x00000019) 
Column    0 (x0000), Len    10 (x000a)  
0000 0000 0000 0000 0019                          | ..........  
Column    1 (x0001), Len    7 (x0007)  
0000 0003 6262 62                                | ....bbb  
  
User tokens:  79 bytes 
TKN-CSN            : 1703311 
TKN-COMMIT-TS      : 2018-02-26 16:40:31.000000 
TKN-OP-TYPE        : PK UPDATE 
  
GGS tokens: 
TokenID x52 'R' ORAROWID        Info x00  Length  20 
4141 4156 5243 4141 4541 4141 4143 4841 4143 0001 | AAAVRCAAEAAAACHAAC..  
  
Logdump 319 >n
TokenID x47 'G' Record Header    Info x01  Length  226 
TokenID x48 'H' GHDR            Info x00  Length  45 
4504 0041 0019 0fff 02f2 8c4c eb2f 7a97 0000 0000 | E..A.......L./z.....  
0000 6810 0000 0231 0052 0000 0001 5343 4f54 542e | ..h....1.R....SCOTT.  
4445 5054 00                                      | DEPT.  
TokenID x44 'D' Data            Info x00  Length  25 
TokenID x54 'T' GGS Tokens      Info x00  Length  48 
TokenID x55 'U' User Tokens      Info x00  Length  84 
TokenID x5a 'Z' Record Trailer  Info x01  Length  226 
___________________________________________________________________ 
Hdr-Ind    :    E  (x45)    Partition  :    .  (x04)  
UndoFlag  :    .  (x00)    BeforeAfter:    A  (x41)  
RecLength  :    25  (x0019)  IO Time    : 2018/02/26 16:40:30.995.095  
IOType    :    15  (x0f)    OrigNode  :  255  (xff) 
TransInd  :    .  (x00)    FormatType :    R  (x52) 
SyskeyLen  :    0  (x00)    Incomplete :    .  (x00) 
AuditRBA  :        561      AuditPos  : 26640 
Continued  :    N  (x00)    RecCount  :    1  (x01) 

2018/02/26 16:40:30.995.095 FieldComp            Len    25 RBA 2377 
Name: SCOTT.DEPT 
After  Image:                                            Partition 4  GU b  
0000 000a 0000 0000 0000 0000 0034 0001 0007 0000 | .............4......  
0003 6262 62                                      | ..bbb  
Column    0 (x0000), Len    10 (x000a)  
0000 0000 0000 0000 0034                          | .........4  
Column    1 (x0001), Len    7 (x0007)  
0000 0003 6262 62                                | ....bbb  
  
User tokens:  84 bytes 
TKN-CSN            : 1703311 
TKN-COMMIT-TS      : 2018-02-26 16:40:31.000000 
TKN-OP-TYPE        : SQL COMPUPDATE 
  
GGS tokens: 
TokenID x52 'R' ORAROWID        Info x00  Length  20 
4141 4156 5243 4141 4541 4141 4143 4841 4143 0001 | AAAVRCAAEAAAACHAAC..  
TokenID x4c 'L' LOGCSN          Info x00  Length    7 
3137 3033 3331 31                                | 1703311  
TokenID x36 '6' TRANID          Info x00  Length    9 
392e 3331 2e31 3434 32                            | 9.31.1442  

从挖掘的trail内容可以看到,源端执行的update ,pkupdate,delete操作的确都正常传递并应用了。再一步证实是源端的正常操作,之所以这样挖掘再次验证,
是因为笔者层曾遇到过pkupdate操作被莫名解析成update的情况。
再来测一下多次插入删除同一记录,HIS表是否会叠加保存:

-------源端连续插入删除
insert into dept values(56,‘a’,‘b’);
delete from dept where deptno=56;
insert into dept values(56,‘a’,‘b’);
delete from dept where deptno=56;
commit;
alter system switch logfile;

-----------目的端查看:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

接下来验证一下nopk_tab表,源端进行下面操作:

insert into nopk_tab values('1222','dongdong','111',10);
insert into nopk_tab values('1233','dongdong','1113',10);

update nopk_tab set sal=1000 where empno=1222 and ename='dongdong';
update nopk_tab set empno=3321,ename='donge',sal=333 where empno=1233 and ename='dongdong';

delete from nopk_tab where empno=1111;
insert into nopk_tab values('1233','dongdong','1113',10);
delete from nopk_tab where empno=1233;
insert into nopk_tab values('1233','dongdong','1113',10);
delete from nopk_tab where empno=1233;

commit;
alter system switch logfile;

在目的端查看结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来在用dept表做一下增删列的操作在检查:
---------源端操作

alter table dept add test number;
insert into dept values(57,'a','b',33);
delete from dept where deptno=57;
insert into dept values(57,'a','b',33);
delete from dept where deptno=57;

commit;
alter system switch logfile;

------------目的端查看
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
-------------源端删除列

alter table dept drop column  test ;
insert into dept values(58,'a','b');
delete from dept where deptno=58;
insert into dept values(58,'a','b');
delete from dept where deptno=58;

commit;
alter system switch logfile;

----------目的端查看
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
也是正常的。


总结

上面是完整的OGG异构多路映射同步原表&审计表&只存删除数据表实现方案,是博主将博主和另一位Oracle OCM大牛多年的总结模拟出来的实验,在各大央企国企单位中均有使用!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

尚医通 (一)项目介绍

目录一、功能简介二、技术点三、业务流程四、系统架构一、功能简介 尚医通即为网上预约挂号系统,网上预约挂号是近年来开展的一项便民就医服务,旨在缓解看病难、挂号难的就医难题,许多患者为看一次病要跑很多次医院,最终还不一定…

微信小程序 python垃圾分类知识科普系统 uniapp

目 录 摘 要 III Abstract 4 1 系统概述 5 1.1 概述 5 1.2课题意义 5 1.3 主要内容 5 2 系统开发环境 6 2.1微信开发者工具 6 2.2小程序框架以及目录结构介绍 6 3 需求分析 1 3.1 系统设计目标 1 3.2需求分析概述 1 3.3 系统可行性分析…

分享160个ASP源码,总有一款适合您

分享160个ASP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 160个ASP源码下载链接:https://pan.baidu.com/s/1xMcHd2x-EW0PP4TdVCU5vA?pwd3hby 提取码:3hby…

嵌入式开发:如何在嵌入式市场中平衡敏捷

敏捷方法的好处是有据可查的,但是在遵从驱动的市场中,向敏捷过渡对于嵌入式开发团队来说是一个挑战。需要可追溯性和文档来证明遵从性,但是这可能与敏捷的精神相矛盾,敏捷的精神仍然受到伴随着方法论成长起来的不准确神话的困扰。…

创建者模式—原型模式(深克隆和浅克隆的区别)

目录 1.原型模式 1.1概念 1.2结构 1.3实现 1.4案例 1.5深克隆(扩展) 2.浅克隆和深克隆 2.1克隆的特点 2.2浅克隆和深克隆的区别 1.原型模式 1.1概念 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对…

【分布式任务调度】XXL-JOB快速搭建教程

XXL-JOB1. XXL-JOB简介2. XXL-JOB搭建2.1 准备工作2.1.1 下载源码2.1.2 数据库准备 数据库脚本在doc路径下,将其执行之后可以创建一个数据库,如图3所示:2.2 搭建调度中心2.3 搭建“执行器”3. 测试3.1 新增执行器3.2 新增任务3.3 启动任务测试…

【工作笔记0036】C#中Decimal小数取整容易犯错的坑

这两天排查一个bug,数据库中同样的计算公式 和 C#代码中一毛一样的计算公式,最后结果为 Decimal 类型的小数,需求保留两位小数。但是结果是数据库中 和 代码中的结果总是对不上。整理并简化了一下项目中代码计算公式:decimal a 3…

vitest第一章(初始vitest)

从三个角度分析vitest 他能做什么? 为什么要使用他? 使用它的优势是什么? vitest官网cn.vitest.dev/ 1.vitest能做什么 从官网介绍说这是一个单元测试框架,大家听到有测试两个字觉得这个是测试同学写的东西,其实这个…

低版本浏览器(webview)空数据音频文件异常报错

问题背景 监控出现大量静态资源加载异常报警,ios和安卓各系统版本都有(排查了一段时间,发现是QA同学在全量测试,无语凝噎)QA测试反馈,报告页在收音失败的情况稳定复现播放音频失败(确实有问题&…

Qos实验配置-CBQ方式

目录 对报文进行重标记 对数据报文进行流量监管-接口入方向 将报文加入相应队列 为语音业务配置丢弃策略 配置流量整形-接口出方向 QoS理论讲解_静下心来敲木鱼的博客-CSDN博客_qos 优先级映射https://blog.csdn.net/m0_49864110/article/details/127414766?ops_request_…

MATLAB 绘制数据图

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

python中的socket套接字基础 (客户端服务器信息交互)

文章目录1 socket概述2 socket使用2.1 socket常用函数2.2 简单实现 客户端与服务器 信息交互2.3 多线程实现服务器和客户端信息交互1 socket概述 Python中,我们利用Socket套接字来实现网络通信,可以说套接字是实现网络编程进行数据传输的一种技术手段。S…

UNIX环境高级编程_文件IO_共享文件操作

这篇笔记记录下,多进程(包括父子进程)操作同一个文件,或者同一个文件被同一个进程多次打开时的情况,总是傻傻分不清,必须记录一下了。 1 文件IO_共享文件 分下面四种情况记录。 情况1:同一进程多次open同一个文件 …

SAP MESSAGE :000 消息提示「BUG」

SAP MESSAGE :000 消息提示 错误消息 问题分析 前言&#xff1a;这个问题 DEBUG 模式没有抓到&#xff0c;所以才有了下文&#xff1a; 这是迁移程序时会出现的问题&#xff0c;参见下面的图片&#xff1a; 在迁移前&#xff0c;MATNR 转码 FUNC 就没有规范书写 sy-subrc <…

第十三章 常用类(包装类和String 相关类)

一、包装类 1. 包装类的分类 &#xff08;1&#xff09;针对八种基本数据类型相应的引用类型—包装类 &#xff08;2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法。 2. 包装类和基本数据的转换 &#xff08;1&#xff09;jdk5 前的手动装箱和拆箱方式 public cl…

好友靠JVM成功进入阿里,阿里P8力荐的JVM笔记到底有什么魔力?

大家都是有经验的Java开发人员&#xff0c;想想为何要学习JVM? [面试?调优?装逼? ] 不管出于何种原因&#xff0c;总之你得先学好。那怎么学好呢? 每个人对于JVM的了解可能不一样&#xff0c;这就要考虑到怎么切入 既然大家都学习过Java&#xff0c;那不妨就从Java开始…

数据分析思维(四)|分类/矩阵思维

分类与矩阵思维 1、概念 在进行数据分析工作时&#xff0c;我们往往会涉及到多个核心指标&#xff0c;而对于不同数值核心指标的结合又会产生多种不同的结果&#xff0c;我们将相似结果的内容放到一起进行统一决策就会大大节省数据分析的时间&#xff0c;这种思想我们称之为分…

[python入门㊲] - python的继承

目录 ❤ 什么是继承 ❤ 派生和继承 ❤ 单继承 ❤ 多继承 ❤ MRO[方法搜索顺序](多继承顺序) ❤ 新式类和旧式&#xff08;经典&#xff09;类 ❤ 什么是继承 通过继承基类来得到基类的功能 所以我们把被继承的类称作父类或基类&#xff0c;继承者被称作子类 可…

注册外贸公司需要注意的问题

关于注册海外公司需要注意事项&#xff0c;米贸搜以美国为例&#xff0c;整理以下信息&#xff0c;希望可以帮助到你一、注册美国公司注意事项&#xff1a;1、拟定要注册的美国公司名称三个&#xff08;英文&#xff09;&#xff0c;核名如无重复则可使用&#xff1b;2、美国公…

matlab机电耦合系统相位分岔图

1、内容简介略638-可以交流、咨询、答疑2、内容说明略3、仿真分析clcclose allclear%% parameterglobal CC 48;tspan [0 5]; % 仿真时间x0 [0.1 0.1 0.1 0.1]; % 变量初始值[T,X] ode45(model_diff, tspan, x0); % 调用求解器X3_dot [0;diff(X(:,3))./diff(T)]; % 求解x3的…