在进行LogMiner操作时碰到了这个错误。下面描述一下错误的起因及解决的过程。
由于要查看被程序删除的一些记录,因此对重做日志进行了LogMiner的操作:
- SQL>altersessionsetnls_date_format='yyyy-mm-dd
- hh24:mi:ss';
- 会话已更改。
- SQL>select*fromv$log;
- GROUP#THREAD#SEQUENCE#BYTESMEMBERSARC
- STATUSFIRST_CHANGE#FIRST_TIME
- ------------------------------------------
- -----------------------------------------
- 1132851073741824
- 2YESINACTIVE1.1124E+122009-07-28
- 00:00:08
- 2132861073741824
- 2YESINACTIVE1.1124E+122009-07-28
- 00:02:20
- 3132871073741824
- 2NOCURRENT1.1124E+122009-07-28
- 01:00:13
- 4132841073741824
- 2YESINACTIVE1.1124E+122009-07-27
- 01:00:30
- 5214571073741824
- 2NOCURRENT1.1124E+122009-07-27
- 23:53:27
- 62145410737418242
- YESINACTIVE1.1124E+122009-07-2600:25:45
- 72145510737418242
- YESINACTIVE1.1124E+122009-07-2600:26:39
- 82145610737418242
- YESINACTIVE1.1124E+122009-07-2623:53:34
- 已选择8行。
检查日志信息后发现要处理的是当前的日志文件:
- SQL>selectmemberfromv$logfilewheregroup#in(3,5);
- MEMBER
- --------------------------------------------------
- /dev/vx/rdsk/datadg/tradedb_redo1_3_1_1g
- /dev/vx/rdsk/datadg/tradedb_redo1_3_2_1g
- /dev/vx/rdsk/datadg/tradedb_redo2_1_1_1g
- /dev/vx/rdsk/datadg/tradedb_redo2_1_2_1g
- SQL>exec
- dbms_logmnr.add_logfile('/dev/vx/rdsk/datadg/tradedb_redo1_3
- _1_1g',dbms_logmnr.new)
- PL/SQL过程已成功完成。
- SQL>exec
- dbms_logmnr.add_logfile('/dev/vx/rdsk/datadg/tradedb_redo2_1
- _1_1g',dbms_logmnr.addfile)
- PL/SQL过程已成功完成。
- SQL>execdbms_logmnr.start_logmnr(options=>
- dbms_logmnr.dict_from_online_catalog)
- PL/SQL过程已成功完成。
- SQL>createtablet_logminertablespacesysaux
- 2asselect*fromv$logmnr_contentswhereseg_owner=
- 'ZHEJIANG'andseg_name='LP_PRICE_PROCESS';
- createtablet_logminertablespacesysaux
- *
- 第1行出现错误:
- ORA-03113:通信通道的文件结束
- SQL>execdbms_logmnr.end_logmnr
- ERROR:
- ORA-03114:未连接到ORALCE
本来一个很简单的操作,没想到遇到了错误。一般前台出现ORA-3113错误,后台多半出现ORA-7445或ORA-600错误,下面检查alert文件:
- TueJul2816:04:242009
- Errorsinfile
- /opt/oracle/admin/tradedb/udump/tradedb1_ora_10798.trc:
- ORA-07445:出现异常错误:核心转储[kdodpm()+2068][SIGSEGV]
- [Invalidpermissionsformappedobject][0xFFFFFFFF79270002]
- [][]
- 在alert文件中果然出现了ORA-7445错误,错误参数为kdodpm。检查
- 这个错误对应的trace文件:
- ***2009-07-2815:59:15.046
- ***SERVICENAME:(SYS$USERS)2009-07-2815:59:15.027
- ***SESSIONID:(282.47827)2009-07-2815:59:15.027
- *kjdrpkey2hv:calledwithpkey207480,optionsx8
- ***2009-07-2816:04:24.179
- Exceptionsignal:11(SIGSEGV),code:2(Invalidpermissions
- formappedobject),addr:0xffffffff79270002,PC:
- [0x10285aa34,kdodpm(
- )+2068]
- ***2009-07-2816:04:24.186
- ksedmp:internalorfatalerror
- ORA-07445:出现异常错误:核心转储[kdodpm()+2068][SIGSEGV]
- [Invalidpermissionsformappedobject][0xFFFFFFFF79270002]
- [][]
- CurrentSQLstatementforthissession:
- createtablet_logminertablespacesysaux
- asselect*fromv$logmnr_contentswhereseg_owner=
- 'ZHEJIANG'andseg_name='LP_PRICE_PROCESS'
- -----CallStackTrace-----
- callingcallentry
- argumentvaluesinhex
- locationtypepoint
- (?meansdubiousvalue)
- ------------------------------------------------
- ----------------------------
- ksedmp()+744CALLksedst()
- 000000300?1066DE17C?
- 000000000?1066DAC70?
- 1066D99D8?1066DA3D8?
显然问题是LogMiner操作造成的。Oracle从9i开始就提供了LogMiner功能,到10g已经比较稳定了,再加上平时使用LogMiner很少出现错误,那么此次出错应是由于一些特殊的操作或配置导致的。如果说当前这个LogMiner操作与其他普通的操作有什么不同的话,那么主要是两点:一个是当前为RAC环境,LogMiner要同时对两个实例的日志进行分析;另一个就是当前分析的日志是ONLINE日志。
由于RAC环境的日志对于任何一个实例都是可以访问的,理论上不大可能出现上面的问题,可见多半是当前日志造成的问题。切换当前日志,然后再次执行同样的操作:
- SQL>conn/assysdba
- 已连接。
- SQL>altersessionsetnls_date_format='yyyy-mm-dd
- hh24:mi:ss';
- 会话已更改。
- SQL>selectgroup#,statusfromv$logwherestatus=
- 'CURRENT';
- GROUP#STATUS
- --------------------------
- 3CURRENT
- 5CURRENT
- 已选择2行。
- SQL>selectmemberfromv$logfilewheregroup#in(3,5);
- MEMBER
- --------------------------------------------------
- /dev/vx/rdsk/datadg/tradedb_redo1_3_1_1g
- /dev/vx/rdsk/datadg/tradedb_redo1_3_2_1g
- /dev/vx/rdsk/datadg/tradedb_redo2_1_1_1g
- /dev/vx/rdsk/datadg/tradedb_redo2_1_2_1g
- 已选择4行。
- SQL>altersystemarchivelogcurrent;
- 系统已更改。
- SQL>selectgroup#,statusfromv$logwherestatus=
- 'CURRENT';
- GROUP#STATUS
- --------------------------
- 4CURRENT
- 6CURRENT
- 已选择2行。
- SQL>exec
- dbms_logmnr.add_logfile('/dev/vx/rdsk/datadg/tradedb_redo1_3
- _1_1g',dbms_logmnr.new)
- PL/SQL过程已成功完成。
- SQL>exec
- dbms_logmnr.add_logfile('/dev/vx/rdsk/datadg/tradedb_redo2_1
- _1_1g',dbms_logmnr.addfile)
- PL/SQL过程已成功完成。
- SQL>execdbms_logmnr.start_logmnr(options=>
- dbms_logmnr.dict_from_online_catalog)
- PL/SQL过程已成功完成。
- SQL>createtablet_logminertablespacesysaux
- 2asselect*fromv$logmnr_contents
- 3whereseg_owner='ZHEJIANG'
- 4andseg_name='LP_PRICE_PROCESS';
- 表已创建。
切换日志后LogMiner分析的日志不再是ONLINE日志文件,问题不再出现。
在出现错误时不要着急,如能冷静地思考当前的操作有何特殊之处,往往可以迅速地定位并解决问题。