logmnr挖掘有一个基本条件就是必须打开附加日志
SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SUPPLEME
--------
YES
如果未开启,需要手动开启
alter database add supplemental log data;
1)要安装LogMiner工具,必须首先要运行下面这样两个脚本,
@?/rdbms/admin/dbmslsm.sql
@?/rdbms/admin/dbmslsmd.sql.
这两个脚本必须均以SYS用户身份运行。其中第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件。第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。
2)修改UTL_FILE_DIR目录,这个目录让我们存放数据字典的,明白的说就是把日志通过LogMiner装换成数据字典存放的目录
SQL> alter system set UTL_FILE_DIR='$ORACLE_BASE/log_utl_file' scope=spfile;---错误
SQL> alter system set UTL_FILE_DIR='/u01/app/oracle/log_utl_file' scope=spfile;---最好是用绝对路径
要事先声明$ORACLE_BASE/log_utl_files,这个目录要先创建好,最好是属于oracle用户或者oracle用户有读写的权限。不然会报错:
ERROR at line 1:
ORA-01336: specified dictionary file cannot be opened
ORA-29280: invalid directory path
ORA-06512: at "SYS.DBMS_LOGMNR_INTERNAL", line 5972
ORA-06512: at "SYS.DBMS_LOGMNR_INTERNAL", line 6062
ORA-06512: at "SYS.DBMS_LOGMNR_D", line 12
ORA-06512: at line 1
3)创建字典文件
execute dbms_logmnr_d.build(dictionary_filename => 'logmr.ora',dictionary_location => '/oracle/app/oracle/log_utl_file');
EXECUTE dbms_logmnr_d.build('dictionary.ora','/oracle/app/oracle/log_utl_files',options => dbms_logmnr_d.store_in_flat_file);
也可以将字典指定到在线日志中
EXECUTE dbms_logmnr_d.build(options => dbms_logmnr_d.store_in_redo_logs);
4)增加要分析的日志
execute dbms_logmnr.ADD_LOGFILE(LOGFILENAME=>'/oracle/app/oracle/oradata/orcl/redo03.log',OPTIONS=>dbms_logmnr.new);
execute dbms_logmnr.add_logfile(LogFileName=>'/oracle/app/oracle/oradata/orcl/redo02.log',Options=>dbms_logmnr.addfile);
。。。。。
可以添加多个
5)开始分析
execute dbms_logmnr.start_logmnr(DictFileName=>'/oracle/app/oracle/log_utl_files/logmr.ora');
6)查询分析结果
到dictionary下去查询DML语句
或者在在线日志的视图中查找
SELECT sql_redo FROM v$logmnr_contents WHERE username='TEST' AND table_name='TTT';
7)分析后,删除日志文件
execute dbms_logmnr.add_logfile(LogFileName=>'/oracle/app/oracle/product/10.2.0/db_1/dbs/arch1_11_851298898.dbf',Options=>dbms_logmnr.REMOVEFILE);
8)退出logminer
exec dbms_logmnr.END_LOGMNR;
SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SUPPLEME
--------
YES
如果未开启,需要手动开启
alter database add supplemental log data;
1)要安装LogMiner工具,必须首先要运行下面这样两个脚本,
@?/rdbms/admin/dbmslsm.sql
@?/rdbms/admin/dbmslsmd.sql.
这两个脚本必须均以SYS用户身份运行。其中第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件。第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。
2)修改UTL_FILE_DIR目录,这个目录让我们存放数据字典的,明白的说就是把日志通过LogMiner装换成数据字典存放的目录
SQL> alter system set UTL_FILE_DIR='$ORACLE_BASE/log_utl_file' scope=spfile;---错误
SQL> alter system set UTL_FILE_DIR='/u01/app/oracle/log_utl_file' scope=spfile;---最好是用绝对路径
要事先声明$ORACLE_BASE/log_utl_files,这个目录要先创建好,最好是属于oracle用户或者oracle用户有读写的权限。不然会报错:
ERROR at line 1:
ORA-01336: specified dictionary file cannot be opened
ORA-29280: invalid directory path
ORA-06512: at "SYS.DBMS_LOGMNR_INTERNAL", line 5972
ORA-06512: at "SYS.DBMS_LOGMNR_INTERNAL", line 6062
ORA-06512: at "SYS.DBMS_LOGMNR_D", line 12
ORA-06512: at line 1
3)创建字典文件
execute dbms_logmnr_d.build(dictionary_filename => 'logmr.ora',dictionary_location => '/oracle/app/oracle/log_utl_file');
EXECUTE dbms_logmnr_d.build('dictionary.ora','/oracle/app/oracle/log_utl_files',options => dbms_logmnr_d.store_in_flat_file);
也可以将字典指定到在线日志中
EXECUTE dbms_logmnr_d.build(options => dbms_logmnr_d.store_in_redo_logs);
4)增加要分析的日志
execute dbms_logmnr.ADD_LOGFILE(LOGFILENAME=>'/oracle/app/oracle/oradata/orcl/redo03.log',OPTIONS=>dbms_logmnr.new);
execute dbms_logmnr.add_logfile(LogFileName=>'/oracle/app/oracle/oradata/orcl/redo02.log',Options=>dbms_logmnr.addfile);
。。。。。
可以添加多个
5)开始分析
execute dbms_logmnr.start_logmnr(DictFileName=>'/oracle/app/oracle/log_utl_files/logmr.ora');
6)查询分析结果
到dictionary下去查询DML语句
或者在在线日志的视图中查找
SELECT sql_redo FROM v$logmnr_contents WHERE username='TEST' AND table_name='TTT';
7)分析后,删除日志文件
execute dbms_logmnr.add_logfile(LogFileName=>'/oracle/app/oracle/product/10.2.0/db_1/dbs/arch1_11_851298898.dbf',Options=>dbms_logmnr.REMOVEFILE);
8)退出logminer
exec dbms_logmnr.END_LOGMNR;
9)注意logmnr会话的有效期是在当前用户的当前会话下,中间不可以conn其他用户或者在其他的session查询
本文参照了Dave的http://blog.csdn.net/tianlesoftware/article/details/5604497