OGG复制进程调优

作者简介:张立,现就职于北京海天起点,获有12c OCP、MYSQL OCP认证,具有多年oracle数据库和goldengate管理维护经验,并且对于mysql的主从搭建、升级、日常维护也具有丰富实践经验。主要从事客户的现场维护,服务对象覆盖电信、国家税务局等大型企事业单位,擅长数据库故障分析,性能调优等。

OGG复制进程延迟一直是一个令人头疼的问题,数据的延迟不仅会影响前台业务的受理,很多时候还会导致ogg目录被撑满,引起一系列不必要的麻烦。本文就来简单谈谈解决复制延迟的分析思路以及优化方法。

在此之前首先介绍一下ogg监控的检查点和两个延迟参数的意义。

CHECKPOINT:Replicat将其读取trail文件的位置记录为检查点。Replicat将这些检查点同时记录在检查点表和检查点文件中。在每个事务完成时,Replicat将更新检查点。另外Replicat会定期将其当前读取位置写入检查点文件,这些检查点是事务应用过程中的某个点,间隔长度由CHECKPOINTSECS参数控制。

LAG AT CHKPT:lag是复制进程处理最后一条记录的操作系统时间和此条记录在trail文件中记录的时间戳的差值,这里需要注意的是lag延迟只有在检查点更新时才会更新,所以这个值不是实时更新的,具有一定的离散性,实际上应该理解成最后一个检查点的最后一条记录与当前系统时间的时间差;

TIME SINCE CHKPT: time延迟比较好理解,就是检查点到目前为止有多长时间没有更新了,即最近一个检查点与当前系统时间的时间差。

各种延迟的分析思路:

>>LAG有延迟,time since chkpt没有延迟


Time since chkpt 没有延迟说明检查点一直在更新,你通过info replicat_name也可以看到rba号不断变化,但是lag有延迟说明应用的数据在源端早已提交了并且被抽取。这种情况就是目标端事务处理比源端慢,相同的sql为什么应用速度不一样呢?这里我们只谈我们能介入处理的原因,至于硬件IO之类就不多说了。

  • 生产环境一般使用经典复制模式,ogg应用数据是通过事务串行的方式工作的(协调或集成复制模式可以实现事务并行化处理,但是我们一般不使用),如果源端不同或相同的表做并行dml操作那延迟也是理所当然的了,这里我们可以通过进程拆分的方式优化ogg的复制,拆分方法下面再详细讲解。
  • 可以通过观察ogg会话的等待事件检查目标库是否存在锁,执行计划较差,数据库资源紧张等现象,例如如果是update,而目标端缺少相关索引导致全表扫描,那当然会慢了,或者目标端未实施表分区以及热块、索引争用等都有可能导致sql性能变差。
  • 如果检查点更新较快,说明事务过于零散,频繁的提交操作会给服务器的io带来较大的压力,因为commit不仅会触发数据库的写盘操作还会不停的更新检查点,这里可以通过ogg的batcsql、GROUPTRANSOPS参数优化一下。

>>LAG有延迟,time since chkpt有延迟


这种情况下Info replicat_name 发现检查点是不走的,看到这种情况大家就会比较着急了,眼看着延迟越来越高,检查点就是不动,别急这是ogg在同步长事务,通过send replicat_name,status你会看到另外一个检查点(这里就是检查点文件实时更新的检查点,上面已经讲过了),这里的检查点只要是变化的那就没什么问题了,除了检查点信息,send replicat_name,status命令还会提示你这个长事务目前已经同步的数据量。


对于长事务导致的延迟

  • 可以通过单表拆分多进程的方式加快复制速度
  • 通过MAXTRANSOPS参数把单个事务拆分开

>>LAG无延迟,time since chkpt 有延迟

这种情况比较少见,一般遇到这种情况你先send看下检查点状态,如果是更新的那可能源端这个事务也还没有结束,让它慢慢同步就好了,如果send看到的检查点也是不动的那就还得观察下trail是否是变化的,trail不变化的话多半是源端出问题了,trail变化的话那就是复制进程夯住了,需要kill掉进程重启一下。

介绍几个经常用到的调优方法

>>进程拆分

多表拆分,当一个进程里表比较多时,事务量也会增加,通过建立多个进程组的形式分担事务量,或者将操作较多的表单独配置一个进程,至于如何分配这些表你可以通过stats命令或者ogg会话判断出哪些表的事物量较大

  • 拆分前通过info rep_1获取列队文件信息及RBA号,

  • 编辑参数文件将对应map的对象进行拆分分配。
  • 指定读取的checkpoint点, 启动拆分的复制进程

单表拆分,很多时候即使一张表一个进程还是不能满足及时应用的需求,此时我们还可以通过rang函数将单表拆分到多进程


–复制进程拆分

>>调整复制事务

合并事务

  • BATCHSQL参数可以提高Replicat的性能。在正常模式下,Replicat一次应用一个SQL语句。BATCHSQL引导Replicat将类似的SQL语句组织成批处理并以更快的速度应用它们。目前官方说BATCHSQL可以将Replicat的性能提高多达300%,但实际效果因环境而异。另外最好配合BATCHTRANSOPS参数一起使用。

用法:此参数控制在需要提交之前可以分组到事务中的最大批处理操作数。当BATCHTRANSOPS达到的操作时,应用到目标。
BATCHTRANSOPS number
    最小值为1
    最大值为100000
    非集成Replicat(所有数据库类型)的默认值为1000,集成Oracle Replicat的默认值为50

  • GROUPTRANSOPS参数可以控制在正常模式(非BATCHSQL)下运行时Replicat事务中包含的SQL操作数。Replicat以事务顺序从源事务累积操作,并将它们作为一个组应用于目标上的一个事务中。为了避免拆分原事务,GROUPTRANSOPS设置的是最小值而不是绝对值。在应用目标事务之前,Replicat会等待,直到事务组中的最后一个源事务接收到所有操作的trail。例如,如果事务1包含200个操作,而事务2包含400个操作,而事务3包含500个操作,即使GROUPTRANSOPS设置为默认值1,000,Replicat事务也会包含所有1,100个操作。相反,GROUPTRANSOPS如果要处理的跟踪中没有更多数据,Replicat可能会在达到设置的值之前应用事务。

用法:GROUPTRANSOPS number
Number:在Replicat事务中应用的最小操作数。值1在与源事务相同的事务边界内执行操作。该值必须至少为1
默认:非集成Replicat1000次操作,Integrated Replicat50次操作

拆分大型事务

MAXTRANSOPS参数可将大型源事务拆分为目标系统上的较小事务。如果事务回滚,拆分事务可能会导致数据错误。

用法:MAXTRANSOPS number
Number:分成单个事务组的操作数。
默认:10,000,000

设置Replicat事务超时

默认情况下,Replicat将多个源事务组合到一个目标事务中以提高性能,但它不会提交部分源事务,并将无限期地等待最后一条记录。使用TRANSACTIONTIMEOUT参数防止未提交的Replicat目标事务对目标表保持锁定并不必要地使用数据库资源。

用法 : TRANSACTIONTIMEOUT n units
N 一个指定等待间隔的整数。有效值为一秒到一周(七天)。
Units: 以下之一:S, SEC, SECS, SECOND, SECONDS, MIN, MINS, MINUTE,MINUTES, HOUR, HOURS, DAY, DAYS
默认:Disabled

>>其他调优

  • CHECKPOINTSECS参数可以控制Extract和Replicat制作常规检查点的频率。
  • 使用EOFDELAY或者 EOFDELAYCSECS参数控制Replicat在读到trail末尾检查新数据的频率。可以通过增加此参数的值来减少这些读取的系统I / O开销。
  • 降低表的高水位,有时候重新初始化也是个不错的选择。
  • 数据库优化,对于更新删除这类dml,有索引当然更好,但是对于insert,过多的索引可能会降低复制性能,索引的去留问题上找到一个最佳的平衡点,确保复制sql都是最优执行计划。
  • 将经典复制修改为协调复制


添加协调复制

可以在参数文件中指定线程数

 

未经允许不得转载:Oracle一体机用户组 » OGG复制进程调优

相关推荐