暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

OGG同步sequence不一致处理

原创 Linker 2021-06-24
3421

1 序列对比

确认目标端的sequence的next_value大于等于源端的值,如不满足要求需要对目标端的sequence进行调整。

1.1 创建统计表。

源库和目标库上执行。

create table compare_sequence(
sequence_owner varchar2(32),
sequence_name varchar2(32),
next_value number
);

生成获取sequence下一个值的SQL语句。

select ‘insert into compare_sequence(sequence_owner,sequence_name,next_value) ‘||‘select ‘’’||sequence_owner||’’’ sequence_owner,’’’||sequence_name||’’’ sequence_name,’||sequence_owner||’.’||sequence_name||’.nextval from dual;’ from dba_sequences where sequence_owner in (‘USERNAME1’,’ USERNAME2’);

1.2 比较源端和目标端的sequence的next_value。

源库上执行。

select source.sequence_owner,
source.sequence_name,
source.next_value source_value,
target.next_value target_value
from goldengate.compare_sequencesource,
goldengate.compare_sequence@target_dblink target
where source.sequence_owner=target.sequence_owner
and source.sequence_name=target.sequence_name
and source.next_value > target.next_value
order by source.sequence_owner,source.sequence_name;

2 sequence不一致处理

如果出现目标端的sequence的next_value小于源端的值,不同情况有不同处理方式:

1)在目标端重建序列。

目标库上执行。
检查权限。
select ‘grant ’ || lower(p.privilege) || ’ on ’ || lower(p.owner) || ‘.’ || lower(p.table_name) || ’ to ’ || lower(p.grantee) || ‘;’ grant_sql
from dba_tab_privs p
where exists(select 1
from dba_sequences s
where s.sequence_owner in (‘USERNAME1’,’USERNAME2’)
and s.sequence_owner=p.owner
and s.sequence_name=p.table_name
)
order by p.owner,
p.table_name,
p.grantee,
p.privilege;
重建序列
select ‘drop sequence ‘||sequence_owner||’.’||sequence_name||’;’ dropseq
from dba_sequences
where sequence_owner=’ USERNAME1’;

col createseq for a300;
select ‘create sequence ‘||sequence_owner||’.’||sequence_name||
’ minvalue ‘||min_value||
’ maxvalue ‘||max_value||
’ start with ‘||last_number||
’ increment by ‘||increment_by||
(case when cache_size=0 then ’ nocache’ else ’ cache ‘||cache_size end) ||’;’ createseq
from dba_sequences where sequence_owner=’ USERNAME1’’;
按照检查权限的结果,进行授权。

2)手动刷新sequence

查询sequence:
select USERNAME1.seqtext.currval from dual;
刷新sequence
select USERNAME1.seqtext.nextval from dual;

批量刷新sequence
declare
temp number;
begin
for i in 1…10
loop
select USERNAME1.seqtext.nextval into temp from dual;
end loop;
end;
/

3)若出现差异比较大,使用increment by方式

  1. 找到这个sequence是哪张表所使用,开发知道,并告知哪一列使用该序列
    2.找到这个表当前业务值的最大值
    select max(KWH_AMT_ID) from sgpm.ARC_E_KWH_AMT
    3.比较俩边sequence的差值

SQL> Select 1020203938-1012838392 from dual;
7365546
4. alter sequence SEQNAME increment by 7365546;
5.刷新一次序列select SEQNAME.nextval from dual;
6.再将序列的值修改回去alter sequence SEQNAME increment by 1;

3 出现ORA-08002报错:

hh.jpg
查询sequence时,表示该sequence被占用,在可刷新的情况下手动刷新一次sequence便可使用currval查询。若不能做刷新动作,则通过dba_sequences视图结合CACHE_SIZE,LAST_NUMBER(LAST_NUMBER是每次缓存累计最大值,真实sequence一般小于此值)列做为参考查看:
select SEQUENCE_OWNER,SEQUENCE_NAME,CACHE_SIZE,LAST_NUMBER from dba_sequences where SEQUENCE_OWNER=’’ and SEQUENCE_NAME=’’;

dba_sequences视图解释参考官方说明“https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/ALL_SEQUENCES.html#GUID-5867804F-1339-4CB6-9A56-6B6DCECB61BB”

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论