环境说明
操作系统:
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 参数,该参数 可以在内存不够时使用本地硬盘作为缓存。具体官方解释如下:


l CACHESIZE : EXTRACT 进程可用的用于缓存未提交的事务数据的初始化分配的 VM 容量。通过 CACHESIZE 选项指定
l CACHEPAGEOUTSIZE :事务数据将被考虑来交换到硬盘的阀值。通过 CACHEPAGEOUTSIZE 选项控制
l PROCESS VM AVAIL FROM OS :进程可以使用的 VM 的容量的近似值,默认比系统物理内存 + 交换分区容量略低,一般为 CACHESIZE 的两倍
l 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 左右。
至此,问题解决。
