利用Oracle 9i开始提供的外部表技术可以有效地监控alert日志。而DBMS_SYSTEM的KSDWRT过程可以定制对日志的写入内容, 二者结合使用,在一些特定环境下比较有用。
我们先创建关于Oracle告警日志的外部表:
SQL>CREATE DIRECTORY alertlog AS '/u01/app/oracle/admin/Tulip/bdump'; SQL> CREATE TABLE alert_tab ( text VARCHAR2(80) ) 2 ORGANIZATION EXTERNAL ( 3 TYPE oracle_loader 4 DEFAULT DIRECTORY alertlog 5 ACCESS PARAMETERS ( 6 RECORDS DELIMITED BY NEWLINE 7 ) 8 LOCATION('alert_Tulip.log') 9 ) 10 REJECT LIMIT 9999; Table created. SQL> SQL> SELECT * 2 FROM alert_tab 3 WHERE text LIKE '%ORA-%' 4 / TEXT -------------------------------------------------------------------------------- ORA-00600: internal error code SQL>然后我们看一下dbms_system 的一些功能:
SQL> DESC dbms_system ...... ...... PROCEDURE KSDWRT Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- DEST BINARY_INTEGER IN TST VARCHAR2 IN ...... ......在这里省略了一些和本例无关的信息.KSDWRT的两个参数说明:
我们可以在一些特定需求下向alert写入定制的信息:
参数 说明 dest 1:写入跟踪文件;
2:写入alert日志中;
3:写入跟踪文件和alert日志中tst 文本信息.最大长度未知.在Oracle的一些版本上这里存在着内存溢出的漏洞,用的时候要慎重
SQL> EXEC dbms_system.ksdwrt(2,'ORA-myAPP: ETL Done !'); PL/SQL procedure successfully completed.现在,我们向alert_Tulip.log (Tulip 是我的数据库实例名字)写入了一条信息,表示我们的ETL过程已经完成。 可以在以后的时间查看:
SQL> SELECT * 2 FROM alert_tab 3 WHERE text LIKE '%ORA-%'; TEXT -------------------------------------------------------------------------------- ORA-00600: internal error code ORA-myAPP: ETL Done ! SQL>
通过以上的内容,我们演示了一种更为灵活控制alert日志的可能方法。但是要注意的是在Oracle的一些版本上Buffer overflow 的漏洞,也即DBMS_SYSTEM.KSDWRT的TST参数可被恶意利用,造成缓冲区溢出。Oracle 9.2.0.5 修复了这个问题,10g 不受影响。
dbms_system参考 - http://www.psoug.org/reference/dbms_system.html