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

OGG参数-BATCHSQL导致数据未实时同步

IT那活儿 2024-06-12
242

点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!

故障描述

业务方反馈某个表通过OGG同步之后,远端和目标端数据库数据不一致。


处理及结果

2.1 分析过程

1)查询进程运行情况

查看ogg的相关进程是否正常,查询后发现ogg相关进程是正常运行。

2)表结构及索引结构

通过DESC及DBMS_METADATA.GET_DDL包查看问题表的两端的表结构及索引情况是否一致,查询后发现两端表结构及索引情况均正常。

3)查询用户的权限

查看用户权限是否足够,发现权限没有问题。
目前想通过日志挖掘来查看有哪些变化没有执行,或者是修改了。但是评估之后风险较大(酬金库资源紧张,而且没有bcv环境可供测试)。
后业务写触发器来观察,发现有些update语句在酬金库没有执行,怀疑是ogg进程参数问题

4)查看复制进程参数

GGSCI > view param R_CJ_1

replicat r_cj_1
SETENV (ORACLE_HOME=/ogg/client/oracle12)
SETENV (NLS_LANG="AMERICAN_AMERICA.zhs16gbk")
userid ***@***_node2, password *****

sqlexec "Alter session set constraints=deferred"
ASSUMETARGETDEFS
--HANDLECOLLISIONS
DBOPTIONS NOSUPPRESSTRIGGERS
reperror default,discard
discardfile ogg/****/***/dirrpt/r_cj_1.dsc,append, megabytes 2000

--CACHEMGR CACHESIZE 2048MB
ALLOWNOOPUPDATES
BATCHSQL
GROUPTRANSOPS 100
DBOPTIONS LOBWRITESIZE 102400
REPORTCOUNT EVERY 10 MINUTES, RATE

MAP **.**.******, TARGET **.******;
……
--里面的内容已脱敏处理

查询参数具体信息,发现BATCHSQL参数存在问题
  • BATCHSQL

    使用此参数可以提高replicat的性能,使replicat将类似的sql语句组织到一个数组中并加快应用。

2.2 修改复制进程参数

注视掉BATCHSQL参数:
edit param R_CJ_1

replicat r_cj_1
SETENV (ORACLE_HOME=/ogg/client/oracle12)
SETENV (NLS_LANG="AMERICAN_AMERICA.zhs16gbk")
userid ***@***_node2, password *****

sqlexec "Alter session set constraints=deferred"
ASSUMETARGETDEFS
--HANDLECOLLISIONS
DBOPTIONS NOSUPPRESSTRIGGERS
reperror default,discard
discardfile /ogg/****/***/dirrpt/r_cj_1.dsc,append, megabytes 2000

--CACHEMGR CACHESIZE 2048MB
ALLOWNOOPUPDATES
--BATCHSQL
GROUPTRANSOPS 100
DBOPTIONS LOBWRITESIZE 102400
REPORTCOUNT EVERY 10 MINUTES, RATE

MAP **.**.******, TARGET **.******;
……
--里面的内容已脱敏处理

重新启动复制进程:
start R_CJ_1
重启后,进程无异常,观察一段时间后发现一些数据已同步过去!

结论

3.1 可以使用该参数的数据库

  • DB2 for i (except V5R4 or i6.1)
  • DB2 LUW
  • DB2 on z/OS
  • Oracle
  • PostgreSQL
  • SQL Server
  • Teradata
  • Times Ten

3.2 工作原理

在BATCHSQL模式中,Replicat将类似的SQL语句组织成内存队列中的批处理,然后在一个数据库操作中应用每个批处理。
MAXSQLSTATEMENTS参数控制缓存的语句数(有效值为1到250,默认250),批包含影响相同表、操作类型(插入、更新或删除)和列列表的SQL语句。
例如,以下每个都是一个批次:
  • Inserts to table A

  • Inserts to table B

  • Updates to table A

  • Updates to table B

  • Deletes from table A

  • Deletes from table B

注意:Oracle GoldenGate在执行批处理之前会分析批处理中的外键引用依赖关系。如果不同批处理中的语句之间存在依赖关系,则每个批处理可能需要多个SQL语句来维护引用完整性。

3.3 使用限制

被视为异常的SQL语句包括:
  • 1)包含LOB或LONG数据的语句;
  • 2)包含长度超过25k的行的语句;
  • 3)语句,其中目标表除了主键之外还有一个或多个唯一键。不能批量处理此类语句,因为如果非主键的值可能发生更改,BATCHSQL不能保证它们的顺序正确;
  • 4)(SQL Server)目标表具有触发器的语句;
  • 5)导致错误的语句。
虽然batchsql可以提升性能,根据官方说明平均每行改变是100bytes长度记录,可以提升300%的性能,当改变达到5000bytes,则效果不明显,测试发现特定情况下(500以下),性能提升更多,尤其是单一类型操作的.同时batchsql会使用更多内存,默认是20m大小,如果batchsql设置queue的太大,则会使用更多内存。
如果生产环境不需要实时同步的话,可以使用此参数进行批量同步,从而提高性能。
此参数的具体说明,可看以下官方文档:
https://docs.oracle.com/en/middleware/goldengate/core/19.1/reference/batchsql.html

END


本文作者:刘 锐(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论