热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LogMiner挖挖挖

LogMiner是Oracle推出的可分析数据库redolog和archivelog内容的工具,可通过日志分析所有对数据库的DDL和DML操作,也可分析出操作时间与操作时的SCN和


作者  陈康·沃趣科技数据库技术专家

出品  沃趣科技


| Log Miner简介

Log Miner是Oracle自Oracle 8i以后推出的一个可以分析数据库redo log和archivelog内容的工具,可以通过日志分析所有对数据库的DDL和DML操作,也可以分析出操作的时间与操作时的SCN和进行操作的机器,对于DML操作还可以查询出还原操作的sql。


| Log Miner组成

  • 源数据库产生LogMiner分析的所有重做日志文件的数据库

  • 挖掘数据库是执行LogMiner分析时使用的数据库。

  • LogMiner数据字典是LogMiner使用字典将内部对象标识符和数据类型转换为可读数据。如果没有字典,Log Miner分析的结果会显示为二进制数据。


| Log Miner数据字典选项

当LogMiner分析重做数据时,需要一个数据字典将日志的对象ID转换为可读数据。LogMiner提供了三个使用数据字典的方式。

1、使用在线目录( Online Catalog) 

使用catalog的数据字典,必须在源数据库执行。启动命令为:

SQL> execute dbms_logmnr.start_logmnr (options=>dbms_logmnr.dict_from_online_catalog);


2、将LogMiner字典提取到archive log。启动命令为:

SQL> execute dbms_logmnr_d.build(options=>dbms_logmnr_d.store_in_redo_logs);
使用这种操作的


3、将LogMiner字典提取到操作系统文件。启动命令为:

SQL> execute dbms_logmnr_d.build ('directory_name''/xxx/xxx/',dbms_logmnr_d.store_in_flat_file);
使用这种方式的话,需要设置utl_file_dir参数,该参数需要重启才能生效。


这个工具使用起来并不复杂。由于将Log Miner数据字典提取到操作系统文件在未设置参数的情况下需要重启数据库,使用场景比较狭隘,所以以下测试场景为使用Online catalog数据字典模式和将字典提取到redo log。


| 测试场景

1、确认数据库开启了补充日志

sys@RAC11G>select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SUPPLEME
--------
YES
--如果返回结果为no,通过以下命令开启
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;


注意:在使用Log Miner分析的日志文件之前,必须启用补充日志。 
启用补充日志时,会在重做日志流中记录其他信息。如果不开启,LogMiner的挖掘的一些信息无法正常显示。

2、创建测试表,并做一些DML与DDL操作

sys@RAC11G> create table test1 (NAME varchar2(20), ID number);
Table created.
sys@RAC11G>insert into test1 values('x','1');
row created.
sys@RAC11G>insert into test1 values('xx','2');
row created.
sys@RAC11G>insert into test1 values('xxx','3');
row created.
sys@RAC11G>commit;
Commit complete.
sys@RAC11G>update test1 set name = 'xxxx' where id =3;
row updated.
sys@RAC11G>commit;
Commit complete.
sys@RAC11G>truncate table test1;
Table truncated.


3、切换归档日志

sys@RAC11G>alter system switch logfile;
System altered.
sys@RAC11G>alter system switch logfile;
System altered.
--然后查看最后生成的归档日志
sys@RAC11G>select * from (select name  from v$archived_log where name like '%archive%'  order by SEQUENCE# desc ) where rownum <3;
NAME
---------------------------------------------------------------------------------------------------------------------------------------
+DATADG/rac11g/archivelog/2018_10_14/thread_1_seq_293.847.989533723
+DATADG/rac11g/archivelog/2018_10_14/thread_1_seq_292.846.989533631


4、Log Miner添加需要分析的归档日志

--添加日志
sys@RAC11G> execute dbms_logmnr.add_logfile(logfilename=>'+DATADG/rac11g/archivelog/2018_10_14/thread_1_seq_293.847.989533723',optiOns=>dbms_logmnr.new);
PL/SQL procedure successfully completed.
--添加多个日志,使用DBMS_LOGMNR.ADDFILE选项
sys@RAC11G>execute dbms_logmnr.add_logfile(logfilename=>'+DATADG/rac11g/archivelog/2018_10_14/thread_1_seq_292.846.989533631',optiOns=>DBMS_LOGMNR.ADDFILE);

PL/SQL procedure successfully completed.


5、启动Log Miner

sys@RAC11G>execute dbms_logmnr.start_logmnr(optiOns=>dbms_logmnr.dict_from_online_catalog);
PL/SQL procedure successfully completed.


6、通过视图v$logmnr_contents进行分析结果查询

v$logmnr_contents只有在开启了Log Miner后才可以进行查询

select to_char(timestamp,'yyyy-mm-dd hh24:mm:ss'),
operation,
username,
SESSION_INFO,
sql_redo 
from v$logmnr_contents
where table_name = 'TEST1';
TO_CHAR(TIMESTAMP,' OPERATION                USERNAME        SESSION_INFO                                SQL_REDO
------------------- -------------------------------- --------------- --------------------------------------------------------------------------- ---------------------------------------------------------------------------
2018-10-14 22:10:50 DDL                  SYS         login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS  create table test1 (NAME varchar2(20), ID number);
                                 _terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@11gnode1 (TNS V
                                 1-V3)
2018-10-14 22:10:29 INSERT               SYS         login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS insert into "SYS"."TEST1"("NAME","ID"values ('x','1');
                                 _terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@11gnode1 (TNS V
                                 1-V3)
2018-10-14 22:10:33 INSERT               SYS         login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS insert into "SYS"."TEST1"("NAME","ID"values ('xx','2');
                                 _terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@11gnode1 (TNS V
                                 1-V3)
2018-10-14 22:10:37 INSERT               SYS         login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS insert into "SYS"."TEST1"("NAME","ID"values ('xxx','3');
                                 _terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@11gnode1 (TNS V
                                 1-V3)
2018-10-14 22:10:51 UPDATE               SYS         login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS update "SYS"."TEST1" set "NAME" = 'xxxx' where "NAME" = 'xxx' and ROWID = '
                                 _terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@11gnode1 (TNS V AAAE6eAABAAAKHBAAC'
;
                                 1-V3)
2018-10-14 22:10:12 DDL                  SYS         login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS truncate table test1;
                                 _terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@11gnode1 (TNS V
                                 1-V3)
.


7、关闭Log Miner

EXECUTE DBMS_LOGMNR.END_LOGMNR();


注意:Log Miner的数据只存在PGA中,如果查询的会话断开连接,Log Miner也会随之关闭。

8、将数据字典提取到redo log

sys@RAC11G>EXECUTE DBMS_LOGMNR_D.BUILD (OPTIONS => DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
PL/SQL procedure successfully completed.
根据字典的大小,它可能包含在多个归档文件中。如果已归档相关的重做日志文件,则可以找出包含提取的字典的开头和结尾的归档日志。可以查询V$ARCHIVED_LOG视图
sys@RAC11G>SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN='YES';

NAME
---------------------------------------------------------------------------------------------------------------------------------------
+DATADG/rac11g/archivelog/2018_10_15/thread_1_seq_308.869.989570647
sys@RAC11G>SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END='YES';
NAME
---------------------------------------------------------------------------------------------------------------------------------------
+DATADG/rac11g/archivelog/2018_10_15/thread_1_seq_309.871.989570649


9、添加包含数据字典的归档日志以及需要分析的归档日志

sys@RAC11G>execute dbms_logmnr.add_logfile(logfilename=>'+DATADG/rac11g/archivelog/2018_10_15/thread_1_seq_308.869.989570647',optiOns=>dbms_logmnr.new);
PL/SQL procedure successfully completed.
sys@RAC11G>execute dbms_logmnr.add_logfile(logfilename=>'+DATADG/rac11g/archivelog/2018_10_15/thread_1_seq_309.871.989570649',optiOns=>dbms_logmnr.addfile);

PL/SQL procedure successfully completed.
sys@RAC11G>execute dbms_logmnr.add_logfile(logfilename=>'+DATADG/rac11g/archivelog/2018_10_14/thread_1_seq_293.847.989533723',optiOns=>dbms_logmnr.addfile);

PL/SQL procedure successfully completed.
sys@RAC11G>execute dbms_logmnr.add_logfile(logfilename=>'+DATADG/rac11g/archivelog/2018_10_14/thread_1_seq_292.846.989533631',optiOns=>dbms_logmnr.addfile);

PL/SQL procedure successfully completed.


10、启动Log Miner

sys@RAC11G> execute dbms_logmnr.start_logmnr(optiOns=>dbms_logmnr.DICT_FROM_REDO_LOGS);
PL/SQL procedure successfully completed.


11、通过视图v$logmnr_contents进行分析结果查询

select to_char(timestamp,'yyyy-mm-dd hh24:mm:ss'),
operation,
username,
SESSION_INFO,
sql_redo 
from v$logmnr_contents
7    where table_name = 'TEST1';
TO_CHAR(TIMESTAMP,' OPERATION                USERNAME
------------------- -------------------------------- ------------------------------
SESSION_INFO
---------------------------------------------------------------------------------------------------------------------------------------
SQL_REDO
---------------------------------------------------------------------------------------------------------------------------------------
2018-10-14 22:10:50 DDL                  SYS
login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS_terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@
11gnode1 (TNS V1-V3)
create table test1 (NAME varchar2(20), ID number);
2018-10-14 22:10:29 INSERT               SYS
login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS_terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@
11gnode1 (TNS V1-V3)
insert into "SYS"."TEST1"("COL 1","COL 2"values (HEXTORAW('78'),HEXTORAW('c102'));
2018-10-14 22:10:33 INSERT               SYS
login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS_terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@
11gnode1 (TNS V1-V3)
insert into "SYS"."TEST1"("COL 1","COL 2"values (HEXTORAW('7878'),HEXTORAW('c103'));
2018-10-14 22:10:37 INSERT               SYS
login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS_terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@
11gnode1 (TNS V1-V3)
insert into "SYS"."TEST1"("COL 1","COL 2"values (HEXTORAW('787878'),HEXTORAW('c104'));
2018-10-14 22:10:51 UPDATE               SYS
login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS_terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@
11gnode1 (TNS V1-V3)
update "SYS"."TEST1" set "COL 1" = HEXTORAW('78787878'where "COL 1" = HEXTORAW('787878'and ROWID = 'AAAE6eAABAAAKHBAAC';
2018-10-14 22:10:12 DDL                  SYS
login_username=SYS client_info= OS_username=oracle Machine_name=11gnode1 OS_terminal=pts/5 OS_process_id=17273 OS_program_name=sqlplus@
11gnode1 (TNS V1-V3)
truncate table test1;


| Log Miner的一些限制

当然,这个工具也有一定的限制

  • 源数据库与挖掘数据库

    • 源数据库和挖掘数据库都必须在同一操作系统平台上运行。

    • 挖掘数据库可以与源数据库相同或完全独立。

    • 挖掘数据库必须运行与源数据库相同的版本或更高版本的Oracle数据库软件。

    • 挖掘数据库必须使用源数据库使用的相同字符集(或字符集的超集)。

  • Log Miner 数据字典

    • 数据字典必须由源数据库生成。

  • 归档日志

    • 每次分析的所有归档日志必须由相同的源数据生成。

    • 必须与同一数据库关联RESETLOGS SCN。

    • 必须来自8i或更高版本的Oracle数据库。

这些限制都不算苛刻,如果灵活使用这个工具的话,可以使归档日志利用最大化,在关键时间有非常大的作用。


|  作者简介

陈康,沃趣科技数据库技术专家

主要参与公司产品实施、测试、维护以及优化。


点击查看招聘信息


相关链接

沃趣微讲堂 | PXC、MGC&MGR原理与实践对比(四)

sysbench花式采坑之一:自增值导致的TPS不可靠

删用户删表空间的操作还能flashback回来吗?

18C新特性之PDB snapshot Carousel,够用吗?

容器化 RDS:借助火焰图定位Kubernetes性能问题

沃趣微讲堂 | 深入浅出Kubernetes存储(三):源码分析

沃趣微讲堂 | Oracle集群技术(三):被误传的集群自启动

buffer busy waits引起的会话突增


更多干货,欢迎来撩~



推荐阅读
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 本文提供了关于数据库设计的建议和注意事项,包括字段类型选择、命名规则、日期的加入、索引的使用、主键的选择、NULL处理、网络带宽消耗的减少、事务粒度的控制等方面的建议。同时还介绍了使用Window Functions进行数据处理的方法。通过遵循这些建议,可以提高数据库的性能和可维护性。 ... [详细]
  • Redis通用指令及数据库操作详解
    本文详细介绍了Redis中的通用指令,包括key的基本操作、扩展操作和查询模式,以及数据库的基本操作和相关操作。同时还解决了key重复问题,并提供了解决方案。文章内容参考了黑马Redis教程。 ... [详细]
  • PreparedStatement防止SQL注入
    添加数据:packagecom.hyc.study03;importcom.hyc.study02.utils.JDBCUtils;importjava.sql ... [详细]
author-avatar
李雪萱849
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有