如何使用GOLDENGATE构建数据库的审计表之一

时间:2022-07-22
本文章向大家介绍如何使用GOLDENGATE构建数据库的审计表之一,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

【GOLDENGATE版本以及数据库版本】

GOLDENGATE版本是11.2.1.0.5和12.2.0.1.1,使用2个版本主要说明12c与11g变化.

DB版本是ORACLE 11.2.0.3 RAC,其他数据库都可以实现相同功能

【审计表】

审计表分为2种:1、记录每一条记录变化的汇总 2、只记录每一记录当前状态以及变化前的状态值

记录每一条记录变化的汇总

注意点:对于源端所有操作在目标端都转换成插入操作,例如删除操作变成插入操作,更新操作转换成插入(注意如果配置getupdatebefores参数,那么update操作会before + after image2条记录,目标端使用getupdatebefores这个时候目标端会变成2条插入即更新记录的修改前和修改值.如果在12c直接使用此参数,行为与11g一致,如果不配getupdatebefores参数,则12c中更新默认记录修改前与当前值放在一条记录成为GGSUnifiedUpdate,此时转换成插入只有当前值,没有修改前的值)

1、表结构

create table xiaoxu.torder (
id int not null primary key,
name varchar2(20),
price int,
order_time date
);
create table xiaoxu.torder_audit (
id int not null,
name varchar2(20),
price int,
order_time date,
db_op_type varchar2(20),
src_commit_ts timestamp(6),
bfr_aft_ind varchar2(30)
); 

2、对order表添加附加日志使用allcols

对于ogg 11g必须通过alter table order add supplemental log data(all) columns;

对于ogg 12c可以ggsci可以add trandata xiaoxu.order allcols;

12c执行如下:

GGSCI> add trandata xiaoxu.torder allcols

Logging of supplemental redo data enabled for table XIOAXU.TORDER.

TRANDATA for scheduling columns has been added on table 'XIAOXU.TORDER'.TRANDATA for all columns has been added on table 'XIOAXU.TORDER'.

TRANDATA for instantiation CSN has been added on table 'XIOAXU.TORDER'.

GGSCI> info trandata XIAOXU.TORDER

Logging of supplemental redo log data is enabled for table XIAOXU.TORDER.

Columns supplementally logged for table XIAOXU.TORDER: ALL.

Prepared CSN for table XIAOXU.TORDER: 1350920073477

3、使用配置抽取进程以及应用进程

【使用12C OGG配置抽取以及应用】

--抽取进程EXTRACT

extract exiaoxu
userid ogg,PASSWORD ogg
tranlogoptions dblogreader
EXTTRAIL ./dirdat/xu
table oggadmin.*;

--应用进程replicat

备注:12C对于11G,单引号与双引号使用发生变化,12C使用单引号表示字符文本,双引号表示列名,你可以在GLOBALS配置取消这个与11G保持一致,使用

NOUSEANSISQLQUOTES这个参数.例如11G @GETENV函数后面是双引号,12C中需要单引号

REPLICAT rnxiaoxu
userid ogg,PASSWORD ogg
DISCARDFILE ./dirrpt/rxiaoxu.dsc , PURGE
getupdatebefores
map oggadmin.torder, target oggadmin.torder_audit,
INSERTALLRECORDS,
COLMAP ( USEDEFAULTS,
db_op_type = @GETENV ('GGHEADER', 'OPTYPE'),
src_commit_ts = @GETENV ('GGHEADER','COMMITTIMESTAMP'),
bfr_aft_ind = @GETENV ('GGHEADER','BEFOREAFTERINDICATOR')
);

4、torder进行DML操作以及torder_audit进行验证

4.1 toder进行DML操作

insert into torder values (1, 'macpro 13',13000,sysdate);
insert into torder values (2, 'macpro 15',19000,sysdate);
insert into torder values (3, 'macpro 17',21000,sysdate);
commit;

4.2 toder_audit进行验证

4.3 torder混合操作

update torder set price=25000,order_time=sysdate where id=3;
delete torder where id=3;
commit;
insert into torder values (6, 'macpro 19',21000,sysdate);
update torder set price=25000,order_time=sysdate where id=6;
delete torder where id=6;
commit;

4.4 torder_audit验证

select * from torder_audit order by id,order_time;

备注:对于ID为3和6的记录分别为4和3条,ID=3多了更新记录的前镜像;

ID=6只有当前更新值,其中原因主要是12c版本发生变化.id=3使用getupdatefores参数,id=6没有这个参数,导致ID=3和ID=6差异一条update before值.

4.5通过logdump来分析11g与12c对于更新记录的变化

--12c中使用getupdatebefores参数来11g特性

备注:1条更新记录在trailfile生成2条记录,分别是before和after image

对于2条记录的rba不相同且操作类型是FieldComp代表普通更新

2019/04/11 16:07:49.000.000 FieldComp            Len    64 RBA 16510 
Name: XIAOXU.TORDER  (TDR Index: 3) 
Before Image:                                             Partition 12   G  b   
2019/04/11 16:07:49.000.000 FieldComp            Len    65 RBA 16695 
Name: XIAOXU.TORDER  (TDR Index: 3) 
After  Image:                                             Partition 12   G  e   

--12c中配置不配置getupdatebefores参数,默认行为是更新的记录在trailfile中记录一条包括before和after的记录,操作是GGSunifiedUpdate,此时如果使用allcols附加日志,只有before包括所有列信息,after只有主键和更新列的信息.12c中updaterecordformat 是compact表示紧凑,after image只有2列,before image有完整的4列,你可以改成full模式,相当于11g中after与before组合.

2019/04/11 16:04:54.000.000 GGSUnifiedUpdate     Len    90 RBA 10124 
Name: OGGADMIN.TORDER  (TDR Index: 3) 
After  Image:                                             Partition 12   G  e   
 0000 0040 0000 0005 0000 0001 3700 0100 0d00 0000 | ...@........7.......  
 096d 6163 7072 6f20 3139 0002 0009 0000 0005 3231 | .macpro 19........21  
 3030 3000 0300 1500 0032 3031 392d 3034 2d31 313a | 000......2019-04-11:  
 3136 3a30 343a 3534 0000 0005 0000 0001 3700 0200 | 16:04:54........7...  
 0900 0000 0537 3530 3030                          | .....75000  
Before Image          Len    68 (x00000044) 
BeforeColumnLen     64 (x00000040) 
Column     0 (x0000), Len     5 (x0005)  
 0000 0001 37                                      | ....7  
Column     1 (x0001), Len    13 (x000d)  
 0000 0009 6d61 6370 726f 2031 39                  | ....macpro 19  
Column     2 (x0002), Len     9 (x0009)  
 0000 0005 3231 3030 30                            | ....21000  
Column     3 (x0003), Len    21 (x0015)  
 0000 3230 3139 2d30 342d 3131 3a31 363a 3034 3a35 | ..2019-04-11:16:04:5  
 34                                                | 4  
After Image           Len    22 (x00000016) 
Column     0 (x0000), Len     5 (x0005)  
 0000 0001 37                                      | ....7  
Column     2 (x0002), Len     9 (x0009)  
 0000 0005 3735 3030 30 

--updaterecordformat full对应logdump,查看before中有4列,after image也有4列.
2019/04/11 16:50:26.000.000 GGSUnifiedUpdate     Len   135 RBA 15674 
Name: XIAOXU.TORDER  (TDR Index: 4) 
After  Image:                                             Partition 12   G  e   
 0000 0041 0000 0006 0000 0002 3130 0001 000d 0000 | ...A........10......  
 0009 6d61 6370 726f 2031 3900 0200 0900 0000 0532 | ..macpro 19........2  
 3130 3030 0003 0015 0000 3230 3139 2d30 342d 3131 | 1000......2019-04-11  
 3a31 363a 3530 3a32 3600 0000 0600 0000 0231 3000 | :16:50:26........10.  
 0100 0d00 0000 096d 6163 7072 6f20 3139 0002 000a | .......macpro 19....  
 0000 0006 3837 3530 3030 0003 0015 0000 3230 3139 | ....875000......2019  
 2d30 342d 3131 3a31 363a 3530 3a32 36             | -04-11:16:50:26  
Before Image          Len    69 (x00000045) 
BeforeColumnLen     65 (x00000041) 
Column     0 (x0000), Len     6 (x0006)  
 0000 0002 3130                                    | ....10  
Column     1 (x0001), Len    13 (x000d)  
 0000 0009 6d61 6370 726f 2031 39                  | ....macpro 19  
Column     2 (x0002), Len     9 (x0009)  
 0000 0005 3231 3030 30                            | ....21000  
Column     3 (x0003), Len    21 (x0015)  
 0000 3230 3139 2d30 342d 3131 3a31 363a 3530 3a32 | ..2019-04-11:16:50:2  
 36                                                | 6  
After Image           Len    66 (x00000042) 
Column     0 (x0000), Len     6 (x0006)  
 0000 0002 3130                                    | ....10  
Column     1 (x0001), Len    13 (x000d)  
 0000 0009 6d61 6370 726f 2031 39                  | ....macpro 19  
Column     2 (x0002), Len    10 (x000a)  
 0000 0006 3837 3530 3030                          | ....875000  
Column     3 (x0003), Len    21 (x0015)  
 0000 3230 3139 2d30 342d 3131 3a31 363a 3530 3a32 | ..2019-04-11:16:50:2  
 36     

4.6 如果12c使用updateformat格式,更新实现审计表包括更新前和当前值的2条记录?

采用兼容11g方案,这个可以实现,如果不想兼容11g功能,如何实现?能否实现?是可以实现,稍微要修改下replicat配置.对于源端更新,在目标生成2条插入,1条是before,1条after image.使用before函数获取之前image,需要1个1个进行匹配有点麻烦.

extract
extract exiaoxu
userid ogg,password ogg
tranlogoptions dblogreader
EXTTRAIL ./dirdat/xu
table oggadmin.*;
REPLICAT rnxiaoxu
userid ogg,PASSWORD ogg
DISCARDFILE ./dirrpt/rxiaoxu.dsc , PURGE
allowduptargetmap
INSERTALLRECORDS
ignoredeletes
ignoreinserts
map oggadmin.torder, target oggadmin.torder_audit,
COLMAP(
id=before.id,
name=before.name
,price=before.price,
order_time=before.order_time,
db_op_type = @GETENV ('GGHEADER', 'OPTYPE'),
src_commit_ts = @GETENV ('GGHEADER','COMMITTIMESTAMP'),
bfr_aft_ind = @GETENV ('GGHEADER','BEFOREAFTERINDICATOR')
);
getdeletes
getinserts
map oggadmin.torder, target oggadmin.torder_audit,
INSERTALLRECORDS,
COLMAP ( USEDEFAULTS,
db_op_type = @GETENV ('GGHEADER', 'OPTYPE'),
src_commit_ts = @GETENV ('GGHEADER','COMMITTIMESTAMP'),
bfr_aft_ind = @GETENV ('GGHEADER','BEFOREAFTERINDICATOR')
);

--在torder表进行dml操作.包括插入、更新、删除3种组合

insert into torder values (110, 'macpro 19',21000,sysdate);
update torder set price=875000 where id=110;
delete from torder where id=110;
commit;

--torder_audit验证数据

由于before和after image合并成一条语句,获取是before还是after,根据记录头来判断,这个都是after,因为处理都是before,可以改成常量.

map oggadmin.torder, target oggadmin.torder_audit,

COLMAP(
id=before.id,
name=before.name,
price=before.price,
order_time=before.order_time,
db_op_type = @GETENV ('GGHEADER', 'OPTYPE'),
src_commit_ts = @GETENV ('GGHEADER','COMMITTIMESTAMP'),
bfr_aft_ind = 'BEFORE')
)

4、总结

审计表实现在于源端所有操作在目标端都转换成insert,update转换是否需要before image,源端表附加日志必须全列的或者nocompressdeletes,nocompressupdates来全列日志到trailfile,这样目标端才能转换成insert无异常.

12c使用新的updaterecordformat去掉11g的getupdatebefores参数特性且能够降低trailfile大小从而降低io,对于sqlexec执行次数从11g2次变成1次,before image与after image合并成一条记录.

12c中单引号与双引号也发生变化.11g双引号在12c是单引号.在GOLBALS中配置NOUSEANSISQLQUOTES参数兼容11g ogg版本.

后续会继续另外一种审计表.欢迎您阅读、分享以及关注,谢谢。