在数据库中远程分析服务器上的alert文件
很多时候, 我们仅仅有远程服务器的数据库用户(dba用户)的口令, 而没有远程服务器的操作系统用户口令, 或者如果因为网络限制而不能访问远程服务器的操作系统.
但为了分析问题的原因, 希望能在数据库内部查看数据库的alert文件.
下面提供一些方法.
(注意: 下面的方法需要用户具有create any directory权限. 而create any directory权限是一个具有极大潜在安全隐患的权限, 请小心使用.)
1. 得到alert所在目录名和文件名
column dir new_value dname column filename new_value fname select a.value dir , 'alert_' || b.instance || '.log' filename from v$parameter a, v$thread b where a.name = 'background_dump_dest';
2. 创建 direcotry
create or replace directory x$alert_log$x as '&dname';
3. 直接查看/保存alert文件
如果你使用plsql developer之类的oracle管理工具, 现在你直接执行下面的命令, 就可以查看并将其保存在你的客户端了. (当然你也可以不用工具, 而是自己写一个小程序完成这项工作)
Select Bfilename('X$ALERT_LOG$X', '&fname') From dual;下面图示plsql developer中的操作方法:
点击
点击保存按钮, 可以将内容保存到本地文件.
4. 保存归档alert文件
上面的方法,只能查看最新的alert文件, 下面的方法可以将alert文件归档到数据库中, 以便将来比较分析用.
drop table alert_log_lob;
create table alert_log_lob
( load_date date default sysdate,
BCONTENT BLOB);
CREATE OR REPLACE PACKAGE Pkg_Alert IS
PROCEDURE Load_Alert_To_Lob(Pfilename Varchar2);
PROCEDURE Load_Alert(Pfilename VARCHAR2, prefresh Varchar2 Default 'Y');
END Pkg_Alert;
CREATE OR REPLACE PACKAGE BODY Pkg_Alert IS
g_last_pos Number ;
g_last_line Number ;
PROCEDURE Load_Alert_To_Lob(Pfilename VARCHAR2) IS
Dest_Loc1 BLOB;
Src_Loc BFILE;
Amount INTEGER := 4000;
BEGIN
INSERT INTO Alert_Log_Lob
VALUES (SYSDATE, Empty_Blob())
RETURNING Bcontent INTO Dest_Loc1;
Src_Loc := Bfilename('X$ALERT_LOG$X', Pfilename);
Dbms_Lob.OPEN(Src_Loc, Dbms_Lob.Lob_Readonly);
Dbms_Lob.OPEN(Dest_Loc1, Dbms_Lob.Lob_Readwrite);
Amount := Dbms_Lob.Getlength(Src_Loc);
Dbms_Lob.Loadfromfile(Dest_Loc1, Src_Loc, Amount);
Dbms_Lob.CLOSE(Dest_Loc1);
Dbms_Lob.CLOSE(Src_Loc);
COMMIT;
END;
PROCEDURE Load_Alert(Pfilename VARCHAR2, prefresh Varchar2 Default 'Y') As
.......
END Pkg_Alert;
这样, 只要执行:
exec pkg_alert.load_alert_to_lob('&fname')就可以将alert文件保存到alert_log_lob表中. 从这个表中查看保存的方法可以参考前面的内容.
后续内容: 在数据库中远程分析服务器上的alert文件(2)