关于logminer
Oracle LogMiner 允许我们通过SQL 查询重做日志或者归档日志。用户数据和数据字典的任何改变都会记录在重做日志中,因此,重做日志中包含我们还原数据库的所有相关信息。
1、查找或者纠正可能的用户错误。由于用户逻辑错误改变数据,我们可以通过此种方式恢复数据到正常状态。
2、用于细粒度的事务级的数据库恢复。
2、用于性能调忧或者空间规划。我们可以统计出用户insert、delete、update最频繁的表,用以性能调忧或者空间规划。
3、用于审计。重做日志中包含所有的DML和DDL的执行信息,因此可以用于数据库的审计。
下面我们讨论如何使用logminer:
1、创建测试表 test_logmnr
- SQL> conn mis/mis
- 已连接。
- SQL> create table test_logmnr(ID number,NAME varchar2(30));
- 表已创建。
- SQL> insert into test_logmnr values(1,'aaaaaaaa');
- 已创建 1 行。
- SQL> insert into test_logmnr values(2,'bbbbbbb');
- 已创建 1 行。
- SQL> insert into test_logmnr values(3, 'cccccccc');
- 已创建 1 行。
- SQL> set time on;
- 11:01:46 SQL> commit;
- 提交完成。
2、先要安装logminer的两个包;要求SYS用户运行下面两个sql:
$ORACLE_HOME/rdbms/admin/dbmslm.sql
$ORACLE_HOME/rdbms/admin/dbmslmd.sql
- 11:01:49 SQL> conn sys/oracle as sysdba
- 已连接。
- 11:03:26 SQL> @C:/oracle/product/10.2.0/db_1/RDBMS/ADMIN/dbmslm.sql
- 程序包已创建。
- 授权成功。
- 11:04:04 SQL> @C:/oracle/product/10.2.0/db_1/RDBMS/ADMIN/dbmslmd.sql
- 程序包已创建。
3、添加参数UTL_FILE_DIR,该参数为放置数据字典文件的目录,修改完毕该参数后要重新启动数据库。
- 11:05:54 SQL> alter system set UTL_FILE_DIR ='D:/logs' scope = spfile;
- 系统已更改。
- 11:06:11 SQL> shutdown immediate
- 数据库已经关闭。
- 已经卸载数据库。
- ORACLE 例程已经关闭。
- 11:06:47 SQL> startup
- ORACLE 例程已经启动。
- Total System Global Area 209715200 bytes
- Fixed Size 1248164 bytes
- Variable Size 100664412 bytes
- Database Buffers 100663296 bytes
- Redo Buffers 7139328 bytes
- 数据库装载完毕。
- 数据库已经打开。
4、创建数据字典文件,创建数据字典是让LogMiner引用涉及到内部数据字典中的部分时使用对象的名称,
而不是系统内部的16进制的ID。如果我们要分析的数据库中的表有变化,影响到库的数据字典也发生变化,就需要重新创建该字典。
- 11:07:12 SQL> EXECUTE dbms_logmnr_d.build(dictionary_filename =>'logm.ora',dictionary_location =>'D:/logs');
- PL/SQL 过程已成功完成。
5、添加要分析的日志文件。
Logminer可以用来分析在线的重做日志文件和归档日志文件。如果以移除文件可以用dbms_logmnr. REMOVEFILE选项。
- SQL> select * from v$logfile;
- GROUP# STATUS TYPE MEMBER
- ---------- ------- ------- -------------------------------------------------------------------------
- 3 ONLINE C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03.LOG
- 2 STALE ONLINE C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG
- 1 STALE ONLINE C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG
- SQL> EXECUTE dbms_logmnr.add_logfile(LogFileName=>'C:/oracle/product/10.2.0/oradata/orcl/redo03.log',Options=>dbms_logmnr.new);
- PL/SQL 过程已成功完成。
- SQL> EXECUTE dbms_logmnr.add_logfile(LogFileName=>'C:/oracle/product/10.2.0/oradata/orcl/redo01.log',Options=>dbms_logmnr.addfile);
- PL/SQL 过程已成功完成。
- SQL> EXECUTE dbms_logmnr.add_logfile(LogFileName=>'C:/oracle/product/10.2.0/oradata/orcl/redo02.log',Options=>dbms_logmnr.addfile);
- PL/SQL 过程已成功完成。
6、改变数据。
- SQL> select * from test_logmnr;
- ID NAME
- ---------- ------------------------------
- 1 aaaaaaaa
- 2 bbbbbbb
- 3 cccccccc
- SQL> update test_logmnr set name = 'updated' where ID =1;
- 已更新 1 行。
- SQL> commit;
- 提交完成。
7、日志分析
- SQL> EXECUTE dbms_logmnr.start_logmnr(DictFileName=>'D:/logs/logm.ora');
- PL/SQL 过程已成功完成。
也可以添加相关的限制条件。相关的参数如下:
参数 参数类型 默认值 含义
StartScn 数字型 0 分析重作日志中SCN≥StartScn日志文件部分
EndScn 数字型 0 分析重作日志中SCN≤EndScn日志文件部分
StartTime 日期型 1998-01-01 分析重作日志中时间戳≥StartTime的日志文件部分
EndTime 日期型 2988-01-01 分析重作日志中时间戳≤EndTime的日志文件部分
DictFileName 字符型 字典文件该文件包含一个数据库目录的快照。
使用该文件可以使得到的分析结果是可以理解的文本形式,而非系统内部的16进制 。
- SQL> EXECUTE dbms_logmnr.start_logmnr(DictFileName =>'D:/logs/logm.ora',StartTime=> to_date('2008-10-12 11:00:00','YYYY-MM-DD HH24:MI:SS') ,EndTime =>to_date('2008-10-12 23:59:59','YYYY-MM-DD HH24:MI:SS '));
8、查询分析结果。
时候可以对v$logmnr_contents查询来得到你想要得结果。v$logmnr_contents只在dbms_logmnr.start_logmnr这个会话的生存期内存在。
- SQL> SELECT sql_redo FROM v$logmnr_contents WHERE seg_name ='TEST_LOGMNR';
- SQL_REDO
- --------------------------------------------------------------------------------
- create table test_logmnr(ID number,NAME varchar2(30));
- insert into "MIS"."TEST_LOGMNR"("ID","NAME") values ('1','aaaaaaaa');
- insert into "MIS"."TEST_LOGMNR"("ID","NAME") values ('2','bbbbbbb');
- insert into "MIS"."TEST_LOGMNR"("ID","NAME") values ('3','cccccccc');
- update "MIS"."TEST_LOGMNR" set "NAME" = 'updated' where "NAME" = 'aaaaaaaa' and
- ROWID = 'AAANQYAAGAAAC7WAAA';