oracle怎么从日志中找到以前执行过的sql? 本帖最后由 bdzm 于 2009-08-27 10:20:25 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Spotlight 可以用这个工具! 不知道是重起服务器还是其他什么原因,v$sql 表中只能查到3天内的,还有其他地方能查到吗? oracle有个审计的功能,但是前提是你必须先打开,看楼主的情况貌似没打开......关注一下,也想知道没打开审计的情况下怎么查找以前的记录 数据库一重启,v$sql中的数据就清空的,其他好象没什么方法。redo日志记的信息太过明细,不是用户原来真实的语句 如果是归档的,并且归档都在,那么可以使用logMiner查找归档文件,可以找到你归档文件里任何一个SQL,就是慢...... 归档日志,并不是真实的记录你的sql语句的 用Oracle Logminer ...http://user.qzone.qq.com/251097186/blog/1251196695可以从redo,归档 日志里查出sql的执行时间,SCN, 用户,sql等事务操作信息...LogMiner用于分析重做日志和归档日志所记载的事务操作。一、确定数据库的逻辑损坏时间。假定某个用户执行drop table误删除了重要表sales,通过LogMiner可以准确定位该误操作的执行时间和SCN值,然后通过基于时间恢复或者基于SCN恢复可以完全恢复该表数据。二、确定事务级要执行的精细逻辑恢复操作。假定某些用户在某表上执行了一系列DML操作并提交了事务,并且其中某个用户的DML操作存在错误。通过LogMiner可以取得任何用户的DML操作及相应的UNDO操作,通过执行UNDO操作可以取消用户的错误操作。三、执行后续审计。通过LogMiner可以跟踪Oracle数据库的所有DML、DDL和DCL操作,从而取得执行这些操作的时间顺序、执行这些操作的用户等信息。用摘取LogMiner字典到字典文件分析DDL操作:1、进行DDL操作,以便分析SQL> conn scott/admin已连接。SQL> drop table emp;表已删除。SQL> drop table dept;表已删除。SQL> conn /as sysdba已连接。SQL> alter system switch logfile;系统已更改。2、使用字典文件,请查看数据库是否配置utl_file_dir,这个参数为字典文件的目录。配置该参数后,需要重启数据库SQL> show user; USER 为 "SYS" SQL> show parameter utl; NAME TYPE VALUE ------------------------------------ ----------- ------------ create_stored_outlines string utl_file_dir string SQL> alter system set utl_file_dir='D:\oracle\logminer' scope=spfile;System altered.SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startupORACLE instance started.SQL> show parameter utl NAME TYPE VALUE ------------------------------------ ----------- ----------- create_stored_outlines string utl_file_dir string D:\oracle\logminer 3、建立字典文件:SQL> execute dbms_logmnr_d.build ('dict.ora','D:\oracle\logminer',dbms_logmnr_d.store_in_flat_file); PL/SQL 过程已成功完成。4、建立日志分析列表:SQL> execute dbms_logmnr.add_logfile(logfilename=>'D:\oracle\arch\TEST\ARCHIVELOG\2009_08_25\O1_MF_1_32_597FQD7B_.ARC',options=>dbms_logmnr.new);PL/SQL 过程已成功完成。SQL> execute dbms_logmnr.add_logfile(logfilename=>'D:\oracle\arch\TEST\ARCHIVELOG\2009_08_25\O1_MF_1_30_597B5P7B_.ARC',options=>dbms_logmnr.addfile);PL/SQL 过程已成功完成。5、启动LogMinerSQL> execute dbms_logmnr.start_logmnr(dictfilename=>'D:\oracle\logminer\dict.ora',options=>dbms_logmnr.ddl_dict_tracking);PL/SQL 过程已成功完成。6、查询分析日志结果:SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents where lower(sql_redo) like '%table%'; USERNAME SCN TIMESTAMP SQL_REDO-------- ---------- -------------- ----------------------------------- 1647538 25-8月 -09 ALTER TABLE "SCOTT"."EMP" RENAME CONSTRAINT "PK_EMP" TO "BIN$f/mFjN+nTmaYjrb17YU80w==$0" ; 1647550 25-8月 -09 ALTER TABLE "SCOTT"."EMP" RENAME TO "BIN$E5UujHaTR+uItpLtzN0Ddw==$0" ; 1647553 25-8月 -09 drop table emp AS "BIN$E5UujHaTR+uItpLtzN0Ddw==$0" ; 1647565 25-8月 -09 ALTER TABLE "SCOTT"."DEPT" RENAME CONSTRAINT "PK_DEPT" TO "BIN$3imFL+/1SqONFCB7LoPcCg==$0" ; 1647571 25-8月 -09 ALTER TABLE "SCOTT"."DEPT" RENAME TO "BIN$kYKBLvltRb+vYaT6RkaRiA==$0"; 1647574 25-8月 -09 drop table dept AS "BIN$kYKBLvltRb+vYaT6RkaRiA==$0" ; 或者其他的查询:SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents where username='SYS'; USERNAME TIMESTAMP SQL_REDO -------- ------------------- -------------------------------------------------- USERNAME SCN TIMESTAMP SQL_REDO-------- ---------- -------------- -----------------------------------SYS 1647487 25-8月 -09 set transaction read write;SYS 1647488 25-8月 -09 alter user scott account unlock;SYS 1647490 25-8月 -09 UnsupportedSYS 1647492 25-8月 -09 commit; 7、结束LogMinerSQL> execute dbms_logmnr.end_logmnr;PL/SQL 过程已成功完成。注意,v$logmnr_contents内容保存了日志的内容,只在当前会话有效,如果想长期保存分析,可以在当前会话用create table tablename as select * from v$logmnr_contents语句来持久保存。 归档中的的确不是原始的SQL,只能做为参考,如果是7天内的,楼主可以看下dba_hist_sqlstat 用第三的工具如 Toad 比较方便点,不用写SQL这么麻烦了,在界面上点点就可以了...Database-->Diagnose-->LogMiner 然后直接下一步就可以看到了...注:Toad的版本不一样, 界面有所查遍,我的是Toad 9.6的.. 多谢楼上各位大虾指点,我现在就是想查一个删除动作,大概是1,2个月以前的,有没有简单的查看redo的命令? 关于oracle存储过程中使用变量作为表名 相同关键字取时间最大的记录,求SQL 问题! 用SQL查询当月过生日的人,不计较年份。 例子4:求出每一个部门里赚钱最多的那个人的名字 装了数据库之后,电脑每天开机都自检. 关于SQLPLUS中的连接变量(bind)的疑惑 求助一个批处理文件? 我是用9i,发觉我修改init.ora数据库的值重启后都没变,如何知道数据库正在使用哪个配置文件? 急!急! SQL脚本向Oracle脚本转换中的几个问题. ORACLE里实现锁的机制和其他数据库有什么不同 关于RAC的问题!急!
关注一下,也想知道没打开审计的情况下怎么查找以前的记录
http://user.qzone.qq.com/251097186/blog/1251196695可以从redo,归档 日志里查出sql的执行时间,SCN, 用户,sql等事务操作信息...LogMiner用于分析重做日志和归档日志所记载的事务操作。
一、确定数据库的逻辑损坏时间。假定某个用户执行drop table误删除了重要表sales,通过LogMiner可以准确定位该误操作的执行时间和SCN值,然后通过基于时间恢复或者基于SCN恢复可以完全恢复该表数据。
二、确定事务级要执行的精细逻辑恢复操作。假定某些用户在某表上执行了一系列DML操作并提交了事务,并且其中某个用户的DML操作存在错误。通过LogMiner可以取得任何用户的DML操作及相应的UNDO操作,通过执行UNDO操作可以取消用户的错误操作。
三、执行后续审计。通过LogMiner可以跟踪Oracle数据库的所有DML、DDL和DCL操作,从而取得执行这些操作的时间顺序、执行这些操作的用户等信息。
用摘取LogMiner字典到字典文件分析DDL操作:1、进行DDL操作,以便分析
SQL> conn scott/admin
已连接。
SQL> drop table emp;
表已删除。
SQL> drop table dept;
表已删除。
SQL> conn /as sysdba
已连接。
SQL> alter system switch logfile;
系统已更改。2、使用字典文件,请查看数据库是否配置utl_file_dir,这个参数为字典文件的目录。配置该参数后,需要重启数据库
SQL> show user;
USER 为 "SYS"
SQL> show parameter utl;
NAME TYPE VALUE
------------------------------------ ----------- ------------
create_stored_outlines string
utl_file_dir string
SQL> alter system set utl_file_dir='D:\oracle\logminer' scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
SQL> show parameter utl
NAME TYPE VALUE
------------------------------------ ----------- -----------
create_stored_outlines string
utl_file_dir string D:\oracle\logminer 3、建立字典文件:
SQL> execute dbms_logmnr_d.build ('dict.ora','D:\oracle\logminer',dbms_logmnr_d.store_in_flat_file);
PL/SQL 过程已成功完成。4、建立日志分析列表:
SQL> execute dbms_logmnr.add_logfile(logfilename=>'D:\oracle\arch\TEST\ARCHIVELOG\2009_08_25\O1_MF_1_32_597FQD7B_.ARC',options=>dbms_logmnr.new);
PL/SQL 过程已成功完成。SQL> execute dbms_logmnr.add_logfile(logfilename=>'D:\oracle\arch\TEST\ARCHIVELOG\2009_08_25\O1_MF_1_30_597B5P7B_.ARC',options=>dbms_logmnr.addfile);
PL/SQL 过程已成功完成。5、启动LogMiner
SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'D:\oracle\logminer\dict.ora',options=>dbms_logmnr.ddl_dict_tracking);
PL/SQL 过程已成功完成。6、查询分析日志结果:SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents where lower(sql_redo) like '%table%';
USERNAME SCN TIMESTAMP SQL_REDO
-------- ---------- -------------- -----------------------------------
1647538 25-8月 -09 ALTER TABLE "SCOTT"."EMP" RENAME CONSTRAINT "PK_EMP" TO "BIN$f/mFjN+nTmaYjrb17YU80w==$0" ;
1647550 25-8月 -09 ALTER TABLE "SCOTT"."EMP" RENAME TO "BIN$E5UujHaTR+uItpLtzN0Ddw==$0" ;
1647553 25-8月 -09 drop table emp AS "BIN$E5UujHaTR+uItpLtzN0Ddw==$0" ;
1647565 25-8月 -09 ALTER TABLE "SCOTT"."DEPT" RENAME CONSTRAINT "PK_DEPT" TO "BIN$3imFL+/1SqONFCB7LoPcCg==$0" ;
1647571 25-8月 -09 ALTER TABLE "SCOTT"."DEPT" RENAME TO "BIN$kYKBLvltRb+vYaT6RkaRiA==$0";
1647574 25-8月 -09 drop table dept AS "BIN$kYKBLvltRb+vYaT6RkaRiA==$0" ;
或者其他的查询:SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents where username='SYS';
USERNAME TIMESTAMP SQL_REDO
-------- ------------------- --------------------------------------------------
USERNAME SCN TIMESTAMP SQL_REDO
-------- ---------- -------------- -----------------------------------
SYS 1647487 25-8月 -09 set transaction read write;
SYS 1647488 25-8月 -09 alter user scott account unlock;
SYS 1647490 25-8月 -09 Unsupported
SYS 1647492 25-8月 -09 commit;
7、结束LogMiner
SQL> execute dbms_logmnr.end_logmnr;
PL/SQL 过程已成功完成。注意,v$logmnr_contents内容保存了日志的内容,只在当前会话有效,如果想长期保存分析,可以在当前会话用create table tablename as select * from v$logmnr_contents语句来持久保存。