oracle ogg同步到kafka不抓数据,重启ogg报错

来源:互联网 发布:福彩快3网络关注正规吗 编辑:程序博客网 时间:2024/05/16 09:57
 ERROR   OGG-02077  Extract encountered a read error in the asynchronous reader thread and is abending: Error code 4031, error message: ORA-04031: unable to allocate  bytes of shared memory ("","","","").
查看oracle alert日志
Errors in file /opt/app/oracle/diag/rdbms/bdfn/BDFN/trace/BDFN_ms01_4186.trc:
ORA-04031: unable to allocate 536 bytes of shared memory ("streams pool","unknown object","Logminer LCR c","krvxbmtx")
LOGMINER: session#=1 (OGG$CAP_KFK_E001), builder MS01 pid=58 OS id=4186 sid=705 stopped
Errors in file /opt/app/oracle/diag/rdbms/bdfn/BDFN/trace/BDFN_ms03_4194.trc:
ORA-04031: unable to allocate 664 bytes of shared memory ("streams pool","unknown object","Logminer LCR c","krvuinl")
Errors in file /opt/app/oracle/diag/rdbms/bdfn/BDFN/trace/BDFN_ms02_4190.trc:
这里注意ogg从oracle抽取的数据都会进入内存streams pool,然而此时BDFN的oracle数据库是默认streams pool 256M(Streams Pool --- 10g 以后才有,和expdp原理一样)
原因分析
BDFN的oracle数据库上面的ogg的replica进程和dg的mining数据库进程,撑满了streams pool内存,导致内存不够ogg出现无法抓数据,然后进程没有报错的“假活”状态,关闭重启就会报streams pool相关联的shared memory不能分配问题。
深度追究
这里数据库设置了大页管理,这个设置是不允许动态管理sga

SQL>  show parameter memory

NAME                                 TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
hi_shared_memory_address             integer
0
memory_max_target                    big integer
0
memory_target                        big integer
0
shared_memory_address                integer
0
这里没有设置内存管理,MEMORY_MAX_TARGET参数包含两部分内存,一个System global area (SGA),另一个system global area(PGA)
SQL> show parameter  sga

NAME                                 TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
lock_sga                             boolean
FALSE
pre_page_sga                         boolean
FALSE
sga_max_size                         big integer
18G
sga_target                           big integer
18G

查看Streams Pool 内存大小
SQL> show parameter streams

NAME                                 TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
streams_pool_size                    big integer
448M

我们看看他的大页设置大小
root@bd-prd-sdb-12:~#cat /proc/meminfo |grep  Huge
AnonHugePages:    284672 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
说明:(重启数据库过程中不断执行;cat /proc/meminfo |grep Huge,能看到HugePages_Free:的数量不断减少,说明大页正在被使用。)
其实动态管理sga,是不太好的是需要锁内存的,在数据缓冲(Buffer Cache)和sql解析共享池(Shared Pool),在Buffer Cache和Shared Pool(对数据库性能影响很大)互相调整的时候,尤其是例如当Buffer Cache为10G然而Shared Pool是4G现在由于数据量很大Buffer Cache不够需要征用1G的Shared Pool,此时会锁Shared Pool内存(此时无法写数据进去,也无法使用其进行sql解析),所以导致数据库变慢。
这里的处理办法是修改其大小
SQL> alter system set  streams_pool_size=1024M scope=both;

System altered.
注意如果设置了动态管理内存

SQL> show parameter streams

NAME      TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
streams_pool_size      big integer
0
此时   streams_pool_size 初始值为0,以后会自动分配内存   


特殊情况,此种情况没有设置内存自动管理,并规定sga的大小
SQL> alter system set streams_pool_size=1024M scope=both;
alter system set streams_pool_size=1204M scope=both
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-04033: Insufficient memory to grow pool
全都报错,无效的数值,后续测试发现该参数通过在线调整不行,但是写入spfile中重启数据库却可以生效,不知道算不算是命中BUG
由于客户的数据库不能随时停机,考虑到该问题,我们在中午业务空闲时段手工resize了db_cache_size的大小通过alter system set db_cache_size=8G
将db_cache_size的最小值从之前的30Gresize到了7G
SQL> alter system set db_cache_size=7G;

System altered.

SQL> alter system set streams_pool_size=1024M;

System altered.
启动ogg成功,然后又出现一个进程死掉,接着上面的问题再次出现了。
内存再次被吃完,其实根本原因在ogg,我们需要对ogg占用sga进行控制
GGSCI (bd-prd-sdb-12) 12> view params rp1





REPLICAT RP1
SETENV (NLS_LANG = "AMERICAN_AMERICA.ZHS16GBK")
DBOPTIONS INTEGRATEDPARAMS(max_sga_size 6000,parallelism 6)
DBOPTIONS NOSUPPRESSTRIGGERS
USERIDALIAS BDFN
DDLERROR DEFAULT IGNORE RETRYOP
--ASSUMETARGETDEFS
--HANDLECOLLISIONS
BATCHSQL BATCHESPERQUEUE 200, OPSPERBATCH 10000
MAP bigdt.*, TARGET bigdt.*;

这里的DBOPTIONS INTEGRATEDPARAMS(max_sga_size 6000,parallelism 6)必须小于等于streams_pool_size的值







0 0
原创粉丝点击