百度了一下:从目前来看,分析Oracle日志的唯一方法就是使用Oracle公司提供的LogMiner来进行, Oracle数据库的所有更改都记录在日志中,但是原始的日志信息我们根本无法看懂,而LogMiner就是让我们看懂日志信息的工具。从这一点上看,它和tkprof差不多,一个是用来分析日志信息,一个则是格式化跟踪文件。通过对日志的分析我们可以实现下面的目的: 1、查明数据库的逻辑更改; 2、侦察并更正用户的误操作; 3、执行事后审计; 4、执行变化分析。 不仅如此,日志中记录的信息还包括:数据库的更改历史、更改类型(INSERT、UPDATE、DELETE、DDL等)、更改对应的SCN 号、以及执行这些操作的用户信息等,LogMiner在分析日志时,将重构等价的SQL语句和UNDO语句(分别记录在 V$LOGMNR_CONTENTS视图的SQL_REDO和SQL_UNDO中)。这里需要注意的是等价语句,而并非原始SQL语句,例如:我们最初执行的是“delete a where c1 <>'cyx';”,而LogMiner重构的是等价的6条DELETE语句。所以我们应该意识到V$LOGMNR_CONTENTS视图中显示的并非是原版的现实,从数据库角度来讲这是很容易理解的,它记录的是元操作,因为同样是“delete a where c1 <>'cyx';”语句,在不同的环境中,实际删除的记录数可能各不相同,因此记录这样的语句实际上并没有什么实际意义,LogMiner重构的是在实际情况下转化成元操作的多个单条语句。更多:http://hi.baidu.com/linrw/blog/item/ea149cd70cd12fd7a044df4e.html
CREATE TRIGGER MYTRIGGER BEFORE INSERT ON MYTABLE FOR EACH ROW W_USER VARCHAR2(30); BEGIN SELECT USER INTO W_USER FROM DUAL; IF W_USER='ORA1' THEN INSERT INTO MYTABLE_LOG(COL1,...,USER_NAME,LOG_DATE) VALUES (:NEW.COL1,...W_USER,SYSDATE); END IF; END;
就是说什么时候执行了什么动作,更改的数据ID。过程是job调用的 数据量不大
/*************你是要这个效果吧**********************/ --读取文件时,指定文件名一定要预先存在,否则程序会失败(MY_LOGFILE) create or replace directory MY_LOGFILE as 'd:/';create or replace procedure proc_name is Out_File UTL_FILE.FILE_TYPE; filename varchar2(80); v_result varchar2(200); proc_name varchar2(50) := 'proc_name'; proc_num number(3); b varchar2(1); begin select '1' into b from dual; proc_num := -10; select '11111' into b from dual; proc_num := -20;
exception when others then v_result := to_char(proc_num) ||' '|| substr(sqlerrm,1,180); --写入文件日志 filename:='logfile_'||to_char(sysdate,'yyyy-mm-dd hh24-mi-ss')||'.log';--文件名 --读取文件时,指定文件名一定要预先存在,否则程序会失败(MY_LOGFILE) Out_File:=UTL_FILE.fopen('MY_LOGFILE',filename,'a'); --写入异常 UTL_FILE.put_line(Out_File,v_result); UTL_FILE.FCLOSE(Out_File); rollback; end proc_name;
--读取文件时,指定文件名一定要预先存在,否则程序会失败(MY_LOGFILE) create or replace directory MY_LOGFILE as 'd:/'; create or replace procedure proc_name is Out_File UTL_FILE.FILE_TYPE; filename varchar2(80); v_result varchar2(200); proc_name varchar2(50) := 'proc_name'; proc_num number(3); b varchar2(1); begin select '1' into b from dual; proc_num := -10; select '11111' into b from dual; proc_num := -20;
exception when others then v_result := proc_name||' '||to_char(proc_num) ||' '|| substr(sqlerrm,1,180); --写入文件日志 filename:='logfile_'||to_char(sysdate,'yyyy-mm-dd')||'.properties';--文件名 --读取文件时,指定文件名一定要预先存在,否则程序会失败(MY_LOGFILE) Out_File:=UTL_FILE.fopen('MY_LOGFILE',filename,'a'); --写入异常 UTL_FILE.put_line(Out_File,v_result); UTL_FILE.FCLOSE(Out_File); rollback; end proc_name;
v_result varchar2(200);
proc_name varchar2(50) := 'proc_name';
proc_num number(3);
begin
......................
proc_num := -10;
......................
proc_num := -20;
......................
proc_num := -30;
exception
when others then
v_result := to_char(proc_num) ||' '|| substr(sqlerrm,1,180);
--写入异常日志的过程
proc_log(proc_name, v_result);
end proc_name;
create or replace procedure proc_log()
begin
inster into log_name.....
end;
我知道要在什么地方放...具体的过程该怎么写,不是记录到表中,如果要过程,那应该在过程中创建一个日志文件,然后追加日志内容,可ORACLE中该如何写呢??谢谢
Oracle的日志是Oracle自己產生的。
你想人為追加日志?貌似不可以。
只能記錄到表中。。-------
要截取插入的动作用AUDIT就可以完成,但是要截取插入的纪录信息就必须用触发器来完成.
CREATE TRIGGER MYTRIGGER
BEFORE INSERT ON MYTABLE
FOR EACH ROW
W_USER VARCHAR2(30);
BEGIN
SELECT USER INTO W_USER FROM DUAL;
IF W_USER='ORA1' THEN
INSERT INTO MYTABLE_LOG(COL1,...,USER_NAME,LOG_DATE)
VALUES (:NEW.COL1,...W_USER,SYSDATE);
END IF;
END;
数据量不大
/*************你是要这个效果吧**********************/
--读取文件时,指定文件名一定要预先存在,否则程序会失败(MY_LOGFILE)
create or replace directory MY_LOGFILE as 'd:/';create or replace procedure proc_name is
Out_File UTL_FILE.FILE_TYPE;
filename varchar2(80);
v_result varchar2(200);
proc_name varchar2(50) := 'proc_name';
proc_num number(3);
b varchar2(1);
begin
select '1' into b from dual;
proc_num := -10;
select '11111' into b from dual;
proc_num := -20;
exception
when others then
v_result := to_char(proc_num) ||' '|| substr(sqlerrm,1,180);
--写入文件日志
filename:='logfile_'||to_char(sysdate,'yyyy-mm-dd hh24-mi-ss')||'.log';--文件名
--读取文件时,指定文件名一定要预先存在,否则程序会失败(MY_LOGFILE)
Out_File:=UTL_FILE.fopen('MY_LOGFILE',filename,'a');
--写入异常
UTL_FILE.put_line(Out_File,v_result);
UTL_FILE.FCLOSE(Out_File);
rollback;
end proc_name;
--读取文件时,指定文件名一定要预先存在,否则程序会失败(MY_LOGFILE)
create or replace directory MY_LOGFILE as 'd:/'; create or replace procedure proc_name is
Out_File UTL_FILE.FILE_TYPE;
filename varchar2(80);
v_result varchar2(200);
proc_name varchar2(50) := 'proc_name';
proc_num number(3);
b varchar2(1);
begin
select '1' into b from dual;
proc_num := -10;
select '11111' into b from dual;
proc_num := -20;
exception
when others then
v_result := proc_name||' '||to_char(proc_num) ||' '|| substr(sqlerrm,1,180);
--写入文件日志
filename:='logfile_'||to_char(sysdate,'yyyy-mm-dd')||'.properties';--文件名
--读取文件时,指定文件名一定要预先存在,否则程序会失败(MY_LOGFILE)
Out_File:=UTL_FILE.fopen('MY_LOGFILE',filename,'a');
--写入异常
UTL_FILE.put_line(Out_File,v_result);
UTL_FILE.FCLOSE(Out_File);
rollback;
end proc_name;