ITPUX技术网

交流 . 资讯 . 分享
Make progress together!
Oracle数据库DBA高级工程师培训视频
Oracle数据库培训-备份恢复-性能优化-集群容灾
mysql数据库视频教程

Goldengate同步序列问题

内容发布:tianyadeyu| 发布时间:2015-6-10 10:55:54
Goldengate同步序列时分两种情况:
1. 序列无缓存
    对于序列无缓存的情况,直接同步即可,同步的数据是正确的。   
2. 序列有缓存
    对于有缓存的的序列,同步后两边的值不一致,基本无法使用,其同步后的值一直大于源端的序列值;

举例来说:
源端
创建一个有缓存的序列
create sequence seq4
minvalue 1
maxvalue 99999999999
start with 1
increment by 1
cache 20;

select sequence_name,cache_size,last_number from user_sequences ;

SEQUENCE_NAME        CACHE_SIZE        LAST_NUMBER
SEQ1                    20                1

因为缓存为20,所以当第一次使用
select seq1.nextval from dual;
结果为1,此时数据库会缓存20的值到内存中,
select sequence_name,cache_size,last_number from user_sequences ;

SEQUENCE_NAME        CACHE_SIZE        LAST_NUMBER
SEQ1                    20                21
此时目标端捕获的值为“select seq1.nextval from dual;”引起的变化(1)+LAST_NUMBER的变化(20),也就是说目标端变成
SEQUENCE_NAME        CACHE_SIZE        LAST_NUMBER
SEQ1                    20                22

然后源端继续执行
select seq1.nextval from dual;
2
3
...
20
序列值在用尽内存的缓存之前,都不会user_sequences的LAST_NUMBER引起变化,
源端始终是
SEQUENCE_NAME        CACHE_SIZE        LAST_NUMBER
SEQ1                    20                21
索引目标端一直是
SEQUENCE_NAME        CACHE_SIZE        LAST_NUMBER
SEQ1                    20                22

等到缓存用完时源端再执行
select seq1.nextval from dual;
得到的值是21
源端变成
SEQUENCE_NAME        CACHE_SIZE        LAST_NUMBER
SEQ1                    20                41
此时目标端捕获的值为“select seq1.nextval from dual;”引起的变化(1)+LAST_NUMBER的变化(20),也就是说目标端变成
SEQUENCE_NAME        CACHE_SIZE        LAST_NUMBER
SEQ1                    20                43

实际上源端刚刚用到21,目标端已经变成43
现在源端用22这个值得时候,目标端是不知道的。

以上是Goldengate同步有缓存序列的问题,但是其只影响序列,传递过来的表数据是根据源端表的值来确定,不对表造成影响。


如果有缓存序列的情况下,想要在备份数据库时获取准确的值,
解决方案如下:
1 假定源端触发备份时,源端数据库不再变化
2 在源端增加一张表,用于记录要同步序列的相关信息,假设表名gg_seq_info
3 源端触发时,首先通过
SELECT KGLOBTN0-KGLOBTN1  FROM  X$KGLOB WHERE KGLNAOBJ='SEQ_NAME' and KGLNAOWN='USERNAME';
查出library cache缓存的序列的当前值,并将相关信息记录在表gg_seq_info中,
4 在Goldengate进程中加入gg_seq_info表的同步,执行第3步后需要等待一段时间让Goldengate同步这个表的数据
5 同步完成gg_seq_info表后,向触发备份表插入触发数据,触发备份
6 目标端接收gg_seq_info表的数据
7 目标端接收触发数据,调用shell,此时gg_seq_info已同步完成,shell需要将同步过来的表的数据
提取出来,同时将目标端的序列情况通过
SELECT KGLOBTN0-KGLOBTN1  FROM  X$KGLOB WHERE KGLNAOBJ='SEQ_NAME' and KGLNAOWN='USERNAME';
提取出来,提取的信息和gg_seq_info表比对,执行类似语句:
-- Modify the last number
alter sequence SEQ_FEEDBACK_MESSAGE_ID increment by 123456(源和目标的差值) nocache;
select SEQ_FEEDBACK_MESSAGE_ID.nextval from dual;
alter sequence SEQ_FEEDBACK_MESSAGE_ID increment by 1 cache 20;
这样源和目标在备份的这一时间点是同步的,此时触发后续的备份




上一篇:goldengate DML 单向复制
下一篇:Goldengate网络超时配置tcperrs
回复

使用道具 举报

1框架
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表