一次ogg挖掘导致的生产故障

来源:这里教程网 时间:2026-03-03 19:51:21 作者:

环境说明

操作系统:

SunOS nadb1-st 5.11 11.3 sun4v sparc sun4v

Oracle 信息:

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

源端 :ADG

OGG挖掘进程部分信息如下:

extract mcext
SETENV (NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8")
SETENV (ORACLE_SID = "nast1")
userid odc,password odc
NOCOMPRESSDELETES
rmthost 10.160.89.3,mgrport 9809,PARAMS -f
FETCHOPTIONS FETCHPKUPDATECOLS
TRANLOGOPTIONS MINEFROMACTIVEDG
TRANLOGOPTIONS DBLOGREADER
TRANLOGOPTIONS  _IGNORETSERECORDS
rmttrail ./xml/b10.160.98.1_nast1/aa

故障现象

ogg挖掘进程start后,Ogg hang 起,此时服务器无法登陆,已经登陆的命令行窗口执行命令没有反应, Ctrl c  OGG 后,服务器登陆恢复,执行的命令反馈为 .bash> not enough space

 

分析解决

查看日志和资源使用后发现 ogg 在启动挖掘进程的时候 占用 大量内存,导致数据 挂。

当前 的环境为 12 c RAC ,使用 ASM ,在 ogg 挖掘进程中,使用了 DBLOGREADER 参数, 但是没有 使用 DBLOGREADERBUFSIZE 参数 参数可以 控制读取操作到内部缓冲区的最大大小(以字节为单位),该内部缓冲区保存 ASM中每次读取事务日志的结果。 较高的值会提高提取速度,但会导致 Extract消耗更多内存。 较低的值会减少内存使用量,但会增加 I / O,因为 Extract必须将超过缓存大小的数据存储到磁盘。

具体可以查看官方文档如下:

  首先为避免ogg占用大量内存,选择先设置该参数。如下

extract mcext
SETENV (NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8")
SETENV (ORACLE_SID = "nast1")
userid odc,password odc
NOCOMPRESSDELETES
rmthost 10.160.89.3,mgrport 9809,PARAMS -f
FETCHOPTIONS FETCHPKUPDATECOLS
TRANLOGOPTIONS MINEFROMACTIVEDG
TRANLOGOPTIONS DBLOGREADER,DBLOGREADERBUFSIZE 524288
TRANLOGOPTIONS  _IGNORETSERECORDS
rmttrail ./xml/b10.160.98.1_nast1/aa

设置参数DBLOGREADERBUFSIZE 524288后重启进程, 挖掘 进程可以正常启动,不会影响到数据库的正常运行。

但是观察后出现第二个问题, 每当 挖掘进程启动的时候,extract 进程会占用大量交换空间。如下:

可以看到,在 进程起来的瞬间,extract 进程占用 69 g 的交换空间,导致其他操作都卡主, extract 起来后,swap 的使用率恢复正常,挖掘进程占用 300M左右

进一步分析, OGG Extract 占用的内存包括两部分:

一部分用来存储复制表的结构等相关数据字典信息。此部分跟表的数量有关,但总量一般在几十兆以内,无需特别关注;

另外一部分用来存储当前数据库中所有未提交的交易数据,当事务提交后 OGG 会将内存中的数据写入 Trail ,然后释放内存。这是某些时候 OGG Extract 进程占用内存较多的主要原因。

查看当前系统 内存情况: 物理内存 32g ,剩余 6g

关于内存,ogg官方给出 cachemgr 参数,该参数 可以在内存不够时使用本地硬盘作为缓存。具体官方解释如下:

CACHESIZE EXTRACT 进程可用的用于缓存未提交的事务数据的初始化分配的 VM 容量。通过 CACHESIZE 选项指定

CACHEPAGEOUTSIZE :事务数据将被考虑来交换到硬盘的阀值。通过 CACHEPAGEOUTSIZE 选项控制

PROCESS VM AVAIL FROM OS :进程可以使用的 VM 的容量的近似值,默认比系统物理内存 + 交换分区容量略低,一般为 CACHESIZE 的两倍

CACHESIZEMAX :指定进行 CACHEPAGEOUTSIZE 时的阀值,超过该值进行长事务的 PAGEOUT ,低于该值停止 PAGEOUT

语法 如下:

上面 的例子表示

如果 OGG Extract 进程所需内存超过了 500M ,则会将交易数据写到指定的两个位置下作为虚拟内存。一旦这些交易提交,则会将这些虚拟内存与内存同样清除。

注:不推荐设置该参数时,默认 OGG 会将允许使用的内存 64 位系统设置为 8G 32 位系统为 2G 。默认的虚拟内存空间为安装目录下的 dirtmp 且由于 IO 方面硬盘和内存差距较大,使用硬盘作为虚拟内存会带来性能方面的下降。

查阅 当前进程内存使用情况, 发现 ogg 默认分配 cachesize 59.85 g ,当前进程占用 15 M 如下:

设置该参数,将 路径指定到/export/home/oracle/ogg/ogg/mcext/test 目录 下,如下:

重启进程后,进程 可以正常启动,不会出现卡顿现象 ,虚拟 内存的使用量也在正常范围内,extract 进程的使用量 300 M 左右。

至此,问题解决。

相关推荐