ITPub博客

首页 > Linux操作系统 > Linux操作系统 > LOGMINER的内存消耗

LOGMINER的内存消耗

原创 Linux操作系统 作者:westzq1984 时间:2010-01-10 12:51:40 0 删除 编辑

如下只是9i的行为

2组日志:
1
ALTER SYSTEM ARCHIVE LOG CURRENT;
BEGIN
  FOR i IN 1..500000 LOOP
    INSERT INTO test VALUES(i,i-2,'a','a'); 
  END LOOP;
  COMMIT;
END;
/
-rw-r-----  1 oracle9 dba  104857088  1??  9 13:36 arch1_131.dbf
-rw-r-----  1 oracle9 dba  104857088  1??  9 13:36 arch1_132.dbf
-rw-r-----  1 oracle9 dba  104857088  1??  9 13:37 arch1_133.dbf
-rw-r-----  1 oracle9 dba   28555776  1??  9 13:42 arch1_134.dbf

2
ALTER SYSTEM ARCHIVE LOG CURRENT;
BEGIN
  FOR i IN 1..500000 LOOP
    INSERT INTO ctais2.test VALUES(i,i-2,'a','a');
    COMMIT; 
  END LOOP;
END;
/
-rw-r-----  1 oracle9 dba  104857088  1??  9 14:26 arch1_140.dbf
-rw-r-----  1 oracle9 dba  104857088  1??  9 14:27 arch1_141.dbf
-rw-r-----  1 oracle9 dba  104856576  1??  9 14:27 arch1_142.dbf
-rw-r-----  1 oracle9 dba  104856576  1??  9 14:28 arch1_143.dbf

尝试对1的arch1_131.dbf挖日志
SQL> BEGIN
  2   DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/u01/oracle9/app/oracle/product/9.2.0/db_1/dbs/arch1_131.dbf',OPTIONS => DBMS_LOGMNR.new);
  3   DBMS_LOGMNR.START_LOGMNR(Options => dbms_logmnr.DICT_FROM_ONLINE_CATALOG);
END;  4 
  5  /

PL/SQL procedure successfully completed.

SQL> SELECT COUNT(*) FROM v$logmnr_contents WHERE peration='INSERT';

  COUNT(*)
----------
         0

SQL> SELECT a.PGA_USED_MEM,a.PGA_ALLOC_MEM,a.PGA_FREEABLE_MEM,a.PGA_MAX_MEM
  2    FROM V$PROCESS a
  3   WHERE ADDR IN (SELECT PADDR
  4               FROM V$SESSION
  5              WHERE SID = (SELECT DISTINCT SID FROM V$MYSTAT))
  6  ;

PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM
------------ ------------- ---------------- -----------
    11105825      11122817                0   243185793

SQL> BEGIN
  2    dbms_logmnr.end_logmnr;
  3  END;  
  4  /

PL/SQL procedure successfully completed.

然后挖所有日志

SQL> BEGIN
  2   DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/u01/oracle9/app/oracle/product/9.2.0/db_1/dbs/arch1_131.dbf',OPTIONS => DBMS_LOGMNR.new);
  3   DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/u01/oracle9/app/oracle/product/9.2.0/db_1/dbs/arch1_132.dbf',OPTIONS => DBMS_LOGMNR.ADDFILE);
  4   DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/u01/oracle9/app/oracle/product/9.2.0/db_1/dbs/arch1_133.dbf',OPTIONS => DBMS_LOGMNR.ADDFILE);
  5   DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/u01/oracle9/app/oracle/product/9.2.0/db_1/dbs/arch1_134.dbf',OPTIONS => DBMS_LOGMNR.ADDFILE);
  6   DBMS_LOGMNR.START_LOGMNR(Options => dbms_logmnr.DICT_FROM_ONLINE_CATALOG);
  7  END;
  8  /

PL/SQL procedure successfully completed.

SQL> SELECT COUNT(*) FROM v$logmnr_contents WHERE peration='INSERT';

  COUNT(*)
----------
    500000

SQL> SELECT a.PGA_USED_MEM,a.PGA_ALLOC_MEM,a.PGA_FREEABLE_MEM,a.PGA_MAX_MEM
  2    FROM V$PROCESS a
  3   WHERE ADDR IN (SELECT PADDR
  4               FROM V$SESSION
  5              WHERE SID = (SELECT DISTINCT SID FROM V$MYSTAT))
  6  ;

PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM
------------ ------------- ---------------- -----------
    11112457      11179137                0   744461441

SQL> BEGIN
  2    dbms_logmnr.end_logmnr;
  3  END;  
  4 
  5  /

PL/SQL procedure successfully completed.


这里忘记记录执行时间了,起码执行了50分钟才挖出来,内存消耗700+MB

那么尝试挖下情况2的日志

SQL> BEGIN
  2   DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/u01/oracle9/app/oracle/product/9.2.0/db_1/dbs/arch1_140.dbf',OPTIONS => DBMS_LOGMNR.new);
  3   DBMS_LOGMNR.START_LOGMNR(Options => dbms_logmnr.DICT_FROM_ONLINE_CATALOG);
  4  END;
  5  /

PL/SQL procedure successfully completed.

SQL> SELECT COUNT(*) FROM v$logmnr_contents WHERE peration='INSERT';

  COUNT(*)
----------
    110187

SQL> SELECT a.PGA_USED_MEM,a.PGA_ALLOC_MEM,a.PGA_FREEABLE_MEM,a.PGA_MAX_MEM
  2    FROM V$PROCESS a
  3   WHERE ADDR IN (SELECT PADDR
  4               FROM V$SESSION
  5              WHERE SID = (SELECT DISTINCT SID FROM V$MYSTAT));

PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM
------------ ------------- ---------------- -----------
    11104665      11188353                0    22067329

SQL> BEGIN
  2    dbms_logmnr.end_logmnr;
  3  END;
  4  /

PL/SQL procedure successfully completed.

挖全部
SQL> BEGIN
  2   DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/u01/oracle9/app/oracle/product/9.2.0/db_1/dbs/arch1_140.dbf',OPTIONS => DBMS_LOGMNR.new);
  3   DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/u01/oracle9/app/oracle/product/9.2.0/db_1/dbs/arch1_141.dbf',OPTIONS => DBMS_LOGMNR.ADDFILE);
  4   DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/u01/oracle9/app/oracle/product/9.2.0/db_1/dbs/arch1_142.dbf',OPTIONS => DBMS_LOGMNR.ADDFILE);
  5   DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/u01/oracle9/app/oracle/product/9.2.0/db_1/dbs/arch1_143.dbf',OPTIONS => DBMS_LOGMNR.ADDFILE);
  6   DBMS_LOGMNR.START_LOGMNR(Options => dbms_logmnr.DICT_FROM_ONLINE_CATALOG);
  7  END;
  8  /

PL/SQL procedure successfully completed.

SQL> SELECT COUNT(*) FROM v$logmnr_contents WHERE peration='INSERT';

  COUNT(*)
----------
    441471

SQL> SELECT a.PGA_USED_MEM,a.PGA_ALLOC_MEM,a.PGA_FREEABLE_MEM,a.PGA_MAX_MEM
  2    FROM V$PROCESS a
  3   WHERE ADDR IN (SELECT PADDR
  4               FROM V$SESSION
  5              WHERE SID = (SELECT DISTINCT SID FROM V$MYSTAT))
  6  ;

PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM
------------ ------------- ---------------- -----------
    11065365      11196865                0    22075841

SQL> BEGIN
  2    dbms_logmnr.end_logmnr;
  3  END;  
  4  /

PL/SQL procedure successfully completed.

这样只要22M内存。

上面实验2个目的:
事务只有rollback/commit后才能在v$logmnr_contents中查询出来,如果一个日志一个日志的挖,对于大事务,跨日志了的事务,如果在该日志中无该事务的commit/rollback,那么无法挖出来
在logminer没有找到commit/rollback标记以前,挖出来的信息暂时保持在PGA中,内存消耗巨大。测试时挖一个100M的日志,PGA使用操作了1G,系统分页卡死掉了。需要的PGA量是和日志文件中的内容相关的
logminer不会使用TEMP表空间(通过v$sort_usage监控的)

以前遇到过1个故障,单个进程内存消耗超过16G,等待log file sequential read的时间很长,就是有人在挖日志
在ODS这种系统上搞日志挖掘,不怎么现实

PS:使用COMMITTED_DATA_ONLY会加大PGA消耗


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

上一篇: TSM BATCH模式
请登录后发表评论 登录
全部评论

注册时间:2009-04-06

  • 博文量
    251
  • 访问量
    1042177