使用外部表访问oracle告警日志

问题提出:

查看oracle告警日志是DBA的一项日常工作,但需要连接到数据库服务器在操作系统下进行检查,但很多DBA习惯用PL/SQL等工具,我们可以通过oracle外部表的方式查看oracle告警日志。

解决办法:

1、创建用户、赋予权限

SQL>create user checker identified by password default tablespace users quota unlimited on users;

SQL>grant connect,resource,create any directory to checker;

2、创建目录对象

SQL>show parameter background_dump_dest;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
background_dump_dest                 string      /u01/app/oracle/orcl/bdump

SQL> conn  checker/password

SQL>create directory  bdump as '/u01/app/oracle/orcl/bdump';

3、创建外部表

SQL> create table alert_log( text varchar2(400) )
organization external (type oracle_loader
default directory bdump
access parameters (records delimited by newline)
location('alert_orcl.log'));

4、使用外部表查看告警日志

SQL> select   text   from  alert_log;  //查看全部的告警日志

SQL>select  text  from  alert_log  where  text like 'ORA-%';  //查看告警日志中的错误信息

SQL> select * from (select tesxt from alert_log order by rowid desc) where rownum <50;  //查看最近50行告警日志。

扩展知识:

外部表就像是在数据库中创建的一个视图,数据库中只存储表的元数据,真正的记录存放在操作系统上。对于外部表的使用有一些限制:

1、只能读取外部表中的内容,不能对外部表进行DML操作,不能为其创建索引。

2、使用外部表必须使用目录对象。

3、同一个操作系统数据文件只能使用一种分隔符,如逗号或分号。

4、删除外部表时应遵循先删除所有的外部表然后再删除目录对象的原则,如果直接删除目录对象,系统不会自动检查它上面外部表,可能会造成外部表不可用。可以通过查询dba_external_locations查询系统当前所有的目录对象以及相关的外部表,还会查询出这些外部表所对应的操作系统文件的名字。

 

 

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

转载于:http://blog.itpub.net/10537377/viewspace-623572/

Oracle 数据库中,查看日志报错是排查系统异常、SQL 错误、实例崩溃等问题的重要手段。Oracle 提供了多种类型的日志文件和视图来帮助 DBA 或开发人员定位错误。以下是主要的几种方式: --- ### 1. **告警日志(Alert Log)** 这是 Oracle 实例最重要的诊断日志之一,记录了数据库启动/关闭、内部错误(如 ORA-600)、块损坏、DDL 操作、检查点信息等。 #### 查看方法: - **找到 Alert Log 文件路径:** ```sql -- 查询 alert log 文件的位置(即 background_dump_dest) SHOW PARAMETER background_dump_dest; ``` 或者使用: ```sql SELECT value FROM v$diag_info WHERE name = 'Diag Trace'; ``` 通常路径类似于: ``` $ORACLE_BASE/diag/rdbms/$DBNAME/$INSTANCE_NAME/trace/alert_$INSTANCE_NAME.log ``` - **直接查看文件内容(操作系统层面):** ```bash tail -f $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.log ``` 或使用 `adrci` 工具(推荐): ```bash adrci ADRCI> SHOW HOME ADRCI> SET HOME diag/rdbms/orcl/orcl ADRCI> SHOW ALERT ``` 这会输出最新的 alert 日志内容,支持过滤时间、错误类型等。 --- ### 2. **跟踪文件(Trace Files)** 当发生严重错误(如 ORA-600、ORA-7445)时,Oracle 会生成 trace 文件,包含堆栈信息、进程状态等。 #### 查看方法: - 使用以下 SQL 获取用户进程对应的 trace 文件位置: ```sql SELECT u_dump.value || '/' || instance.value || '_ora_' || v$process.spid || '.trc' AS trace_file FROM v$parameter u_dump, v$parameter instance, v$process, v$session WHERE u_dump.name = 'user_dump_dest' AND instance.name = 'instance_name' AND v$process.addr = v$session.paddr AND v$session.audsid = SYS_CONTEXT('USERENV', 'SESSIONID'); ``` > 这些 `.trc` 文件位于 `user_dump_dest` 目录下,可用于分析具体会话的错误。 --- ### 3. **数据字典视图查看当前错误** #### a. `V$DIAG_ALERT_EXT` —— 外部表形式查看 Alert 日志内容 ```sql SELECT originating_timestamp, message_text FROM v$diag_alert_ext WHERE message_text LIKE '%ORA-%' AND originating_timestamp > SYSDATE - 1 ORDER BY originating_timestamp DESC; ``` 这个视图可以查询过去一段时间内的所有 ORA- 错误,非常实用。 #### b. `V$SESSION_WAIT`, `V$LOCK`, `V$TRANSACTION` 等辅助排查锁等待、事务阻塞问题。 --- ### 4. **使用 ADR (Automatic Diagnostic Repository) 和 ADRCI 工具** ADR 是从 Oracle 11g 开始引入的统一诊断架构,集中管理所有日志和跟踪文件。 #### 示例:通过 ADRCI 查看最近的错误 ```bash adrci ADRCI> SET HOME <your_diag_home> ADRCI> SHOW PROBLEM ADRCI> SHOW INCIDENT ADRCI> IPS PACK INCIDENT <incident_id> -- 打包问题用于上传支持 ``` --- ### 5. **常见错误类型及查找方式** | 错误类型 | 查找方式 | |----------------|---------| | ORA-00600 | 查看 trace 文件 + alert log,使用 Metalink(My Oracle Support)搜索 | | ORA-01555 | 快照过旧,检查 undo_retention 和 long query | | ORA-01722 | 无效数字,通常是隐式转换导致,在应用层 SQL 中定位 | | Deadlock | alert log 中会有 "deadlock detected" 记录,并生成 trace 文件 | --- ### 示例:查询最近 1 小时内出现的所有 ORA 错误 ```sql SELECT message_text, originating_timestamp FROM v$diag_alert_ext WHERE message_text LIKE '%ORA-%' AND originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' HOUR ORDER BY originating_timestamp DESC; ``` --- ### 总结代码汇总 ```sql -- 1. 查看 alert log 路径 SHOW PARAMETER dump_dest; -- 2. 获取 alert log 内容(通过数据字典) SELECT value FROM v$diag_info WHERE name = 'Diag Trace'; -- 3. 查询近期 ORA 错误 SELECT originating_timestamp, message_text FROM v$diag_alert_ext WHERE message_text LIKE '%ORA-%' AND originating_timestamp > SYSDATE - 1 ORDER BY originating_timestamp DESC; -- 4. 获取当前会话 trace 文件路径 SELECT d.value || '/' || i.value || '_ora_' || p.spid || '.trc' AS trace_file FROM v$parameter d, v$parameter i, v$process p, v$session s WHERE d.name = 'user_dump_dest' AND i.name = 'instance_name' AND p.addr = s.paddr AND s.audsid = SYS_CONTEXT('USERENV','SESSIONID'); ``` --- 上述代码中: - `v$diag_info` 提供了 ADR 结构的关键路径。 - `v$diag_alert_ext` 是一个外部表,映射到 alert log 文件,允许 SQL 查询。 - `user_dump_dest` 通常指向用户级跟踪文件目录(11g 后被 ADR 取代,但仍有效)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值