大事务导致的OGG抽取进程每天7:39定时延时,运行极其缓慢

来源:这里教程网 时间:2026-03-03 18:24:40 作者:

1 业务系统申请加入OGG进程几十张表,根据要求,将相关表添加到OGG抽取进程及投递进程中, 第二天,发现OGG抽取进程延迟20多小时,进行相关原因分析。 EXTRACT     RUNNING     EXTTEST02      25:09:59      00:00:08  GGSCI (dbssvra) 5> info EXTTEST02 EXTRACT    EXTTEST02   Last Started 2023-02-07 14:30   Status RUNNING Checkpoint Lag        25:10:09 (updated 00:00:04 ago) Log Read Checkpoint  Oracle Redo Logs                      2023-02-07 07:52:01  Thread 1, Seqno 679959, RBA 329074872                      SCN 3722.502010847 (15986370286559) Log Read Checkpoint  Oracle Redo Logs                      2023-02-07 07:52:01  Thread 2, Seqno 962867, RBA 1999074256                      SCN 3722.502011018 (15986370286730)                       2 OGG抽取进程延迟原因:CPU、内存、IO、参数设置不合理、长事务等 经过仔细分析,将CPU、内存、IO进行的排除,认为是正常的。那就剩下参数及长事务了。 3 进行参数排查: 执行如下命令,查看OGG使用的内存信息,根据如下信息,认为OGG抽取进程的虚拟内存达到上限, 是导致OGG抽取进程运行缓慢。 GGSCI (dbssvra) 248> send extract EXTTEST02, CACHEMGR CACHESTATS Sending CACHEMGR request to EXTRACT EXTTEST02 ... CACHE OBJECT MANAGER statistics CACHE MANAGER VM USAGE vm current     =   7.31G   vm anon queues =   4.96G vm anon in use =   2.36G   vm file        =      0  vm used max    =   7.31G   ==> CACHE BALANCED 查看OGG抽取进程的参数,发现设置了如下内存参数,认为将内存设置的太小。 Oracle官方建议不要设置OGG抽取进程的内存参数,但由于发生多次由于抽取进程将内存耗尽, 导致主机服务器hang的情况,此系统内存使用80%,故还不敢将ogg抽取进程的内存参数调整为默认值,只能进行调整。 TRANLOGOPTIONS DBLOGREADER, DBLOGREADERBUFSIZE 4194304 TRANLOGOPTIONS BUFSIZE 10000000 CACHEMGR CACHESIZE 1G  修改为: --TRANLOGOPTIONS DBLOGREADER, DBLOGREADERBUFSIZE 4194304 --TRANLOGOPTIONS BUFSIZE 10000000 --CACHEMGR CACHESIZE 1G  TRANLOGOPTIONS DBLOGREADER CACHEMGR CACHESIZE 16G 重启OGG抽取进程,问题没有解决。 4 查看EXTTEST02进程的report,发现一直报长事务。    2023-02-08 10:43:54  WARNING OGG-01027  Long Running Transaction: XID 88.31.623522942, Items 0,  Extract EXTTEST02, Redo Thread 2, SCN 3722.332792647 (15986201068359), Redo Seq #962683,  Redo RBA 2900657168.                26556 records processed as of 2023-02-08 10:44:25 (rate 0,delta 0)                  GGSCI (dbssvra) 87>  send extract EXTTEST02,showtrans thread 2 Sending showtrans request to EXTRACT EXTTEST02 ... Oldest redo log files necessary to restart Extract are: Redo Thread 1, Redo Log Sequence Number 679959, SCN 3722.502130718 (15986370406430), RBA 459234320 Redo Thread 2, Redo Log Sequence Number 962683, SCN 3722.332792647 (15986201068359), RBA 2900657168 ------------------------------------------------------------ XID:                  88.31.623522942                                 I tems:                0                     --经仔细查看goldengate官方文档,此列为0, 即表示此事务不是goldengate抽取进程需要的,可以进行跳过。 怀疑是此事务导致OGG延迟增长,准备跳过此事务。 Extract:              EXTTEST02    Redo Thread:          2       Start Time:           2023-02-07:01:42:16   SCN:                  3722.332792647 (15986201068359)    Redo Seq:             962683 Redo RBA:             2900657168           Status:               Running                                              SEND EXTRACT EXTTEST02, SKIPTRANS 88.31.623522942 THREAD 2   GGSCI (dbssvra) 2> SEND EXTRACT EXTTEST02, SKIPTRANS 88.31.623522942 THREAD 2 Sending SKIPTRANS request to EXTRACT EXTTEST02 ... Are you sure you sure you want to skip transaction [XID 88.31.623522942, Redo Thread 2, Start Time 2023-02-07:01:42:16, SCN 3722.332792647 (15986201068359)]? (y/n)y Sending SKIPTRANS request to EXTRACT EXTTEST02 ... Transaction [XID 88.31.623522942, Redo Thread 2, Start Time 2023-02-07:01:42:16, SCN 3722.332792647 (15986201068359)] skipped. OGG参数优化:将长事务告警信息调整为告警及跳过空事务,此参数的调整, 可以让OGG自动跳过空事务并释放空事务相关的资源,且重启后减少读取归档日志的数量,减少抽取进程恢复时间。 修改前 WARNLONGTRANS 2h,CHECKINTERVAL 10m 修改后 WARNLONGTRANS 2h,CHECKINTERVAL 10m,skipemptytrans 调整参数并重启OGG进程,问题还是没有解决,但已经往明朗的方向发展。 但每天OGG抽取进程卡主的时间点都在7:39分,连续观察几天后,认为是新增加的表导致的OGG抽取进程延迟, 但具体是哪个表,不清楚经过多次针对7:39分时间点的AWR,ASH等分析,还是不能确定是哪个表引起OGG抽取进程延迟。 5 针对OGG进程做trace,pstack,gstack等追踪分析,没有找到任何有用信息。 只发现OGG的抽取进程延迟卡在都去归档日志上, 申请goldengate官方的SR,认为是IO导致的,经仔细排查,经IO排除掉。 个人认为应该是遇见从业十几年未遇见的问题,有可能是某一资源有限制(比如OGG抽取进程的VM,已经达到最大值), 导致的OGG抽取进程延迟。也有可能是业务系统几分钟对某个表执行了大量的操作,导致OGG将资源耗尽。 trace2相关的信息 SUMMARY STATISTICS General statistics:  0.00% Checking messages (includes checkpointing)       0.00% Checking periodic tasks  0.00% Waiting for more data  0.00% Converting ASCII header to internal  0.00% Converting ASCII data to internal 100.00% Reading input records  0.00% Writing output records (replicate_io)       0.00% Mapping columns       0.00% Outputting data records       0.00% Performing SQL statements  0.00% Performing BATCHSQL statements  0.00% Performing actual DB op  0.00% Preparing SQL statements  0.00% Performing transaction commits  0.00% Checkpointing Redo log statistics:  0.00% Opening redo log file  0.00% Positioning into redo log file  0.00% Reading record from redo log file  0.01% Extracting subrecord from redo record       0.00% Extracting start subrecord       0.00% Extracting undo subrecord header       0.00% Extracting undo subrecord       0.00% Extracting redo subrecord header       0.00% Extracting undo subrecord       0.00% Extracting rollback subrecord       0.00% Extracting commit subrecord  0.00% Processing start subrecord  0.78% Processing data subrecord  0.00% Processing rollback subrecord  0.00% Processing commit subrecord  0.00% Retrieving and processing transaction items       0.00% Retrieving transaction item       0.00% Formatting output record             0.00% Formatting output record header             0.00% Validating update key data             0.00% Formatting output record data                   0.00% Converting Oracle data to ASCII  0.00% Close redo log   6 大事务导致OGG抽取进程延迟 经过多次查看执行send EXTTEST02 showtrans,总算发现了可疑的事务,但在数据库进行查看, 此事务已提交,不清楚此事务执行的相关SQL,无法确定是哪个表引起的。 2月7日 ------------------------------------------------------------ X ID:                  814.14.14101759         --事务ID                         I tems:                22623282                --大事务,已经抽取了2千2百多万条数据,事务还没有结束。 Extract:              EXTTEST02    Redo Thread:          2       Start Time:            2023-02-07:07:39:33                               SCN:                  3722.497851000 (15986366126712)    Redo Seq:             962860 Redo RBA:             157135376            Status:               Running   2月16日 ------------------------------------------------------------ XID:                  579.25.9724995 Items:                8077902                    --大事务,800多万条数据,还没有结束 Extract:              EXTTEST02    Redo Thread:          1       Start Time:            2023-02-16:07:39:49   SCN:                  3723.895718844 (15991058961852)    Redo Seq:             682982 Redo RBA:             1826037264           Status:               Running   2月20日 ------------------------------------------------------------ XID:                  138.29.311639792 Items:                12612238                         --大事务,已经抽取了1千2百多万条数据,事务还没有结束,只运行了几分钟。 Extract:              EXTTEST02    Redo Thread:          2       Start Time:            2023-02-20:07:39:33   SCN:                  3723.2254776926 (15992418019934)   Redo Seq:             972062 Redo RBA:             2890945040           Status:               Running      7 由于事务已提交,无法确定事务执行的SQL,使用logminer对相关事务进行日志挖掘,分析事务到底执行的SQL是什么。 7.1 确定的事务ID为:138.29.311639792 XID:                  138.29.311639792 Items:                8384843                             --大事务 Extract:              EXTTEST02    Redo Thread:          2       Start Time:           2023-02-20:07:39:33     SCN:                  3723.2254776926 (15992418019934)   Redo Seq:             972062 Redo RBA:             2890945040           Status:               Running  7.2 使用logminer对相关事务进行日志挖掘,总算找到事务执行的相关SQL。 添加归档日志到logminer中 BEGIN dbms_logmnr.add_logfile(logfilename=>'+ARCH/DBNAME/ARCHIVELOG/2023_02_20 /thread_2_seq_972062.1774.1129275589',options=>dbms_logmnr.NEW); END; / 启动日志挖掘 EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG); 查看事务ID(138.29.311639792)查看执行的SQL SELECT SESSION#,SERIAL#,sql_redo,XID,XIDUSN,XIDSLT,XIDSQN   FROM v$logmnr_contents where XIDUSN='138' and XIDSLT='29' and XIDSQN='311639792'; SESSION#   SERIAL#  sql_redo,                                                                     XID, XIDUSN,     XIDSLT,   XIDSQN --------  -------  ------------------------------------------------------------------------   ------- ---------- ---------   --------  5378       9303  update "USER_1"."TABLE_A" set "WRITE_TIME" = TO_ 8A001D00F03E9312  138  29    311639792                       .............                         结束日志挖掘  EXECUTE dbms_logmnr.END_LOGMNR;      使用历史会话再一次对验证业务系统执行了哪些SQL  INSTANCE_NUMBER TIME_SA                        SESSION_ID SESSION_SERIAL# SQL_ID               WAIT_CLASS           BLOCKING_SESSION BLOCKING_SESSION_SERIAL# --------------- ------------------------------ ---------- --------------- -------------------- -------------------- ---------------- ------------------------               2 2023-02-20 07:30:12                  5378            9303 5zj438nbjpsnc               2 2023-02-20 07:30:22                  5378            9303 5zj438nbjpsnc               .......               2 2023-02-20 07:31:43                  5378            9303 2pgrah1dz9rp1               .......               2 2023-02-20 07:33:44                  5378            9303 ah4skxaa4wjpg               ......               2 2023-02-20 07:36:05                  5378            9303 24jssqmxrg58t               ....               2 2023-02-20 07:37:36                  5378            9303 dkaxpn8u8s3xn               ....               2 2023-02-20 07:39:27                  5378            9303 f142qzj7r76yr               ....               2 2023-02-20 07:53:25                  5378            9303 4bbagth0j22dn        Cluster               2 2023-02-20 07:53:35                  5378            9303 gaqru9wr6b1kv               ....               2 2023-02-20 07:56:27                  5378            9303 d5nnqs90fm7rr               ....               2 2023-02-20 08:03:00                  5378            9303 4kpvuf1zysy7n               2 2023-02-20 08:03:11                  5378            9303 4v06s9w1mu8g8               2 2023-02-20 08:03:21                  5378            9303 4v06s9w1mu8g8               2 2023-02-20 08:03:31                  5378            9303 4v06s9w1mu8g8               2 2023-02-20 08:03:41                  5378            9303 4v06s9w1mu8g8 200 rows selected.      和2023-02-20:07:39:33  时间点最近的为f142qzj7r76yr SQL , 此SQL执行计划为全表扫描 查看SQL执行的时间及耗费的资源 set linesize 200 set pagesize 999 col OWNER for a20 col SEGMENT_NAME for a40 col SEGMENT_TYPE for a20 select OWNER,SEGMENT_NAME,SEGMENT_TYPE,trunc(sum(BYTES)/1024/1024/1024) from dba_segments  where owner='USER_1' and  SEGMENT_NAME in ('TABLE_A') group by OWNER,SEGMENT_NAME,SEGMENT_TYPE  order by SEGMENT_TYPE,trunc(sum(BYTES)/1024/1024/1024) ;   查看表的大小,此表大小为750G,走全表扫描,很有可能会导致将OGG抽取进程的资源耗尽 OWNER                SEGMENT_NAME                             SEGMENT_TYPE         TRUNC(SUM(BYTES)/1024/1024/1024) -------------------- ---------------------------------------- -------------------- -------------------------------- USER_1           TABLE_A                          TABLE PARTITION                                    750 查看此表每日新增的数据量,在1800万左右。 SYS@DBNAME1 >select count(1) from "USER_1"."TABLE_A" partition(TABLE_A20221216);   COUNT(1) ----------   18179182 在AWR中只有一行,由于此行排在最后,故刚开始时就将其忽略掉,如下 Buffer Gets  Executions Gets per Exec  %Total Elapsed Time (s) %CPU %IO SQL Id          SQL Module      SQL Text  58,785,636     1        58,785,636.00   1.32   835.74           85  3.8 f142qzj7r76yr                    MERGE INTO TABLE_A CRF  根据buffer gets中数据块的数量,计算耗费的内存,每个数据块的大小为8K,计算后发现一条SQL耗费的内存为459G, 故导致OGG抽取进程运行缓慢: SYS@DBNAME1 >select (58785636*8)/1024 from dual; (58785636*8)/1024 -----------------        459262.781 解决方法:           业务系统优化相关业务逻辑及SQL,OGG抽取进程延时问题解决。 问题总结:             此次故障解决,耗时特长,用时12天,才找到真正原因,其中将CPU、内存、IO、AWR、ASH、长事务、参数等都 排查过,并进行了排除后,最终才确定是由于在很短的时间内,数据库执行了一个大事务,逻辑读459G,将OGG抽取进程的 资源耗尽,导致OGG抽取进程运行特别缓慢。此事件是运维十几年来第一次因为大事务导致的抽取进程延迟,还是有一定借鉴 意义的。                    

相关推荐