关于logminer

关于logminer

   Oracle LogMiner 允许我们通过SQL 查询重做日志或者归档日志。用户数据和数据字典的任何改变都会记录在重做日志中,因此,重做日志中包含我们还原数据库的所有相关信息。
   1、查找或者纠正可能的用户错误。由于用户逻辑错误改变数据,我们可以通过此种方式恢复数据到正常状态。
   2、用于细粒度的事务级的数据库恢复。
   2、用于性能调忧或者空间规划。我们可以统计出用户insert、delete、update最频繁的表,用以性能调忧或者空间规划。
   3、用于审计。重做日志中包含所有的DML和DDL的执行信息,因此可以用于数据库的审计。


下面我们讨论如何使用logminer:
1、创建测试表  test_logmnr

  1. SQL> conn mis/mis
  2. 已连接。
  3. SQL> create table test_logmnr(ID number,NAME varchar2(30));
  4. 表已创建。
  5. SQL> insert into test_logmnr values(1,'aaaaaaaa');
  6. 已创建 1 行。
  7. SQL>  insert into test_logmnr values(2,'bbbbbbb');
  8. 已创建 1 行。
  9. SQL> insert into test_logmnr values(3,  'cccccccc');
  10. 已创建 1 行。
  11. SQL> set time on;
  12.  11:01:46 SQL> commit;
  13. 提交完成。

2、先要安装logminer的两个包;要求SYS用户运行下面两个sql:

$ORACLE_HOME/rdbms/admin/dbmslm.sql
$ORACLE_HOME/rdbms/admin/dbmslmd.sql

 

  1. 11:01:49 SQL> conn sys/oracle as sysdba
  2. 已连接。
  3. 11:03:26 SQL> @C:/oracle/product/10.2.0/db_1/RDBMS/ADMIN/dbmslm.sql
  4. 程序包已创建。
  5. 授权成功。
  6. 11:04:04 SQL>  @C:/oracle/product/10.2.0/db_1/RDBMS/ADMIN/dbmslmd.sql
  7. 程序包已创建。

3、添加参数UTL_FILE_DIR,该参数为放置数据字典文件的目录,修改完毕该参数后要重新启动数据库。


  1. 11:05:54 SQL>  alter system  set UTL_FILE_DIR ='D:/logs' scope = spfile;
  2. 系统已更改。
  3. 11:06:11 SQL> shutdown immediate
  4. 数据库已经关闭。
  5. 已经卸载数据库。
  6. ORACLE 例程已经关闭。
  7. 11:06:47 SQL> startup
  8. ORACLE 例程已经启动。
  9. Total System Global Area  209715200 bytes
  10. Fixed Size                  1248164 bytes
  11. Variable Size             100664412 bytes
  12. Database Buffers          100663296 bytes
  13. Redo Buffers                7139328 bytes
  14. 数据库装载完毕。
  15. 数据库已经打开。

4、创建数据字典文件,创建数据字典是让LogMiner引用涉及到内部数据字典中的部分时使用对象的名称,
   而不是系统内部的16进制的ID。如果我们要分析的数据库中的表有变化,影响到库的数据字典也发生变化,就需要重新创建该字典。


 

  1. 11:07:12 SQL> EXECUTE dbms_logmnr_d.build(dictionary_filename =>'logm.ora',dictionary_location =>'D:/logs');
  2. PL/SQL 过程已成功完成。

5、添加要分析的日志文件。

Logminer可以用来分析在线的重做日志文件和归档日志文件。如果以移除文件可以用dbms_logmnr. REMOVEFILE选项。

 

 

  1. SQL> select * from v$logfile;
  2.     GROUP# STATUS  TYPE    MEMBER                                                                               
  3. ---------- ------- ------- -------------------------------------------------------------------------
  4.          3         ONLINE  C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03.LOG                                     
  5.          2 STALE   ONLINE  C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG                                     
  6.          1 STALE   ONLINE  C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG 
  7. SQL> EXECUTE dbms_logmnr.add_logfile(LogFileName=>'C:/oracle/product/10.2.0/oradata/orcl/redo03.log',Options=>dbms_logmnr.new);
  8. PL/SQL 过程已成功完成。
  9. SQL> EXECUTE dbms_logmnr.add_logfile(LogFileName=>'C:/oracle/product/10.2.0/oradata/orcl/redo01.log',Options=>dbms_logmnr.addfile);
  10. PL/SQL 过程已成功完成。
  11. SQL>  EXECUTE dbms_logmnr.add_logfile(LogFileName=>'C:/oracle/product/10.2.0/oradata/orcl/redo02.log',Options=>dbms_logmnr.addfile);
  12. PL/SQL 过程已成功完成。

6、改变数据。

  1. SQL> select * from test_logmnr;
  2.         ID NAME
  3. ---------- ------------------------------
  4.          1 aaaaaaaa
  5.          2 bbbbbbb
  6.          3 cccccccc
  7. SQL>  update test_logmnr set name = 'updated' where ID =1;
  8. 已更新 1 行。
  9. SQL> commit;
  10. 提交完成。

7、日志分析

  1. SQL>  EXECUTE dbms_logmnr.start_logmnr(DictFileName=>'D:/logs/logm.ora');
  2. PL/SQL 过程已成功完成。

也可以添加相关的限制条件。相关的参数如下:
参数 参数类型 默认值 含义
StartScn 数字型 0 分析重作日志中SCN≥StartScn日志文件部分
EndScn 数字型 0 分析重作日志中SCN≤EndScn日志文件部分
StartTime 日期型 1998-01-01 分析重作日志中时间戳≥StartTime的日志文件部分
EndTime 日期型 2988-01-01 分析重作日志中时间戳≤EndTime的日志文件部分
DictFileName 字符型 字典文件该文件包含一个数据库目录的快照。
使用该文件可以使得到的分析结果是可以理解的文本形式,而非系统内部的16进制 。


  1. 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这个会话的生存期内存在。

  1. SQL> SELECT sql_redo FROM v$logmnr_contents WHERE  seg_name ='TEST_LOGMNR';
  2. SQL_REDO
  3. --------------------------------------------------------------------------------
  4. create table test_logmnr(ID number,NAME varchar2(30));
  5. insert into "MIS"."TEST_LOGMNR"("ID","NAME") values ('1','aaaaaaaa');
  6. insert into "MIS"."TEST_LOGMNR"("ID","NAME") values ('2','bbbbbbb');
  7. insert into "MIS"."TEST_LOGMNR"("ID","NAME") values ('3','cccccccc');
  8. update "MIS"."TEST_LOGMNR" set "NAME" = 'updated' where "NAME" = 'aaaaaaaa' and
  9. ROWID = 'AAANQYAAGAAAC7WAAA';

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值