ITPub博客

首页 > 数据库 > Oracle > 一次ogg挖掘导致的生产故障

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

原创 Oracle 作者:梦夕林1992 时间:2024-04-02 11:15:29 0 删除 编辑

环境说明

操作系统:

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 左右。

至此,问题解决。









来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29956245/viewspace-3011243/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-10-13

  • 博文量
    90
  • 访问量
    85402