logmnr使用
logminer 工具的使用
Oracle LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle 重作日志文件(归档日志文件)中的具体内容,特别是,该工具可以分析出所有对于数据库操作的DML(insert、update、delete等)语句,另外还可分析得到一些必要的回滚SQL语句。该工具特别适用于调试、审计或者回退某个特定的事务。
LogMiner分析工具实际上是由一组PL/SQL包和一些动态视图(Oracle8i内置包的一部分)组成,它作为Oracle数据库的一部分来发布,是8i产品提供的一个完全免费的工具。但该工具和其他Oracle内建工具相比使用起来显得有些复杂,主要原因是该工具没有提供任何的图形用户界面(GUI)。本文将详细介绍如何安装以及使用该工具。
一、LogMiner的用途
日志文件中存放着所有进行数据库恢复的数据,记录了针对数据库结构的每一个变化,也就是对数据库操作的所有DML语句。
在Oracle
8i之前,Oracle没有提供任何协助数据库管理员来读取和解释重作日志文件内容的工具。系统出现问题,对于一个普通的数据管理员来讲,唯一可以作的工作就是将所有的log文件打包,然后发给Oracle公司的技术支持,然后静静地等待Oracle
公司技术支持给我们最后的答案。然而从8i以后,Oracle提供了这样一个强有力的工具-LogMiner。
LogMiner 工具即可以用来分析在线,也可以用来分析离线日志文件,即可以分析本身自己数据库的重作日志文件,也可以用来分析其他数据库的重作日志文件。
总的说来,LogMiner工具的主要用途有:
1. 跟踪数据库的变化:可以离线的跟踪数据库的变化,而不会影响在线系统的性能。
2. 回退数据库的变化:回退特定的变化数据,减少point-in-time recovery的执行。
3. 优化和扩容计划:可通过分析日志文件中的数据以分析数据增长模式。
二、安装LogMiner
如果未安装过提示无法使用这个dbms包,则可以用SYSDBA登陆,然后依次执行:
@$Oracle_HOME\rdbms\admin\dbmslm.sql;
@$ORACLE_HOME\rdbms\admin\dbmslmd.sql;
第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件。
第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。
三、开始
3.1 环境介绍:
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
3.2 设置参数utl_file_dir
[oracle@Oracle11g ~]$ mkdir -p /u01/logmnr_more
SYS @ prod
> show parameter utl_file_dir ;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir string
SYS @ prod > alter system set utl_file_dir='/u01/logmnr_more' scope=spfile;
System altered.
SYS
@ prod >startup
force
ORACLE instance started.
Total System Global Area 314572800 bytes
Fixed Size 1219184 bytes
Variable Size 79693200 bytes
Database Buffers 230686720 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
SYS @ prod >show parameter utl_file_dir ;
NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
utl_file_dir string /u01/logmnr_more
——建立数据字典文件dict.ora
SYS @ prod >execute dbms_logmnr_d.build('dict.ora','/u01/logmnr_more',dbms_logmnr_d.store_in_flat_file);
PL/SQL procedure successfully completed.
3.3 对redo log 进行挖掘,找出在某个时间点所作的DDL 或DML 操作(包括:时间点、datablock scn 、sql语句)
1) 对DML 分析
SQL> delete from owner.emp;
3 rows deleted.
SQL> commit;
Commit complete.
SQL> insert into owner.emp select * from scot.emp;
SQL> commit;
Commit complete.
SYS @ prod > select * from owner.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
——查看当前日志组
SYS @ prod > select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
1 1 7 52428800 512 1 YES ACTIVE 1038204 16-SEP-14 1049618 05-NOV-17
2 1 8 52428800 512 1 NO CURRENT 1049618 05-NOV-17 2.8147E+14
3 1 6 52428800 512 1 YES INACTIVE 1016929 16-SEP-14 1038204 16-SEP-14
SQL> alter system archive log current; ——使当前日志组归档
System altered.
SYS @ prod > select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
1 1 7 52428800 512 1 YES ACTIVE 1038204 16-SEP-14 1049618 05-NOV-17
2 1 8 52428800 512 1 YES ACTIVE 1049618 05-NOV-17 1050691 05-NOV-17
3 1 9 52428800 512 1 NO CURRENT 1050691 05-NOV-17 2.8147E+14
2) 启用logmnr
——添加database补充日志
SYS @ prod > alter database add supplemental log data; ——不添加后面会出错
Database altered.
——查询日志(归档日志和当前日志)
SYS @ prod > select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
1 1 7 52428800 512 1 YES ACTIVE 1038204 16-SEP-14 1049618 05-NOV-17
2 1 8 52428800 512 1 YES ACTIVE 1049618 05-NOV-17 1050691 05-NOV-17
3 1 9 52428800 512 1 NO CURRENT 1050691 05-NOV-17 2.8147E+14
SQL> select member from v$logfile;——当前日志
MEMBER
--------------------------------------------------
/u01/app/oracle/oradata/prod/redo01.log
/u01/app/oracle/oradata/prod/redo02.log
/u01/app/oracle/oradata/prod/redo03.log
SQL> select name from v$archived_log;——查看归档日志信息
NAME
-------------------
/u01/arch_dir/prod/1_7_858439997.dbf
/u01/arch_dir/prod/1_8_858439997.dbf
——添加日志,分析【添加的日志应该是切换前的日志,归档日志是最后一个日志】
SYS @ prod > execute dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/prod/redo02.log',options=>dbms_logmnr.new);
PL/SQL procedure successfully completed.
SYS @ prod > execute dbms_logmnr.add_logfile(logfilename=>'/u01/arch_dir/prod/1_7_858439997.dbf',options=>dbms_logmnr.addfile);
PL/SQL procedure successfully completed.
——执行logmnr 分析
SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
PL/SQL procedure successfully completed.
——查询分析结果
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> col username for a10
SQL> col timestamp for a10
SQL> col sql_redo for a100
SQL> select username,scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') time1 ,sql_redo from v$logmnr_contents where username ='OWNER' order by time1 desc
USERNAME SCN TIMESTAMP SQL_REDO
--------------- ---------- ------------------- --------------------------------------------------
OWNER 1043876 2017-11-04 22:03:40
insert into "OWNER"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7499','ALLEN','SALESMAN','7698',TO_DATE('1981-02-20 00:00:00', 'yyyy-mm-dd hh24:mi:ss'),'1600','300','30');
OWNER 1043876 2017-11-04 22:03:40
insert into "OWNER"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7521','WARD','SALESMAN','7698',TO_DATE('1981-02-22 00:00:00', 'yyyy-mm-dd hh24:mi:ss'),'1250','500','30');
OWNER 1043876 2017-11-04 22:03:40
insert into "OWNER"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7566','JONES','MANAGER','7839',TO_DATE('1981-04-02 00:00:00', 'yyyy-mm-dd hh24:mi:ss'),'2975',NULL,'20');
OWNER 1043876 2017-11-04 22:03:40
insert into "OWNER"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7654','MARTIN','SALESMAN','7698',TO_DATE('1981-09-28 00:00:00', 'yyyy-mm-dd hh24:mi:ss'),'1250','1400','30');
——结束日志分析
SQL> execute dbms_logmnr.end_logmnr;
PL/SQL procedure successfully completed.
2) 对DDL 操作分析
SCOTT @ prod > drop table tb01;
Table dropped.
SCOTT @ prod > create table tb01(id int) tablespace users;
Table created.
SCOTT @ prod > insert into tb01 values(1);
1 row created.
SCOTT @ prod > commit;
Commit complete.
——设置logmnr 参数,存放数据字典文件
——查看日志信息
SQL> select name,sequence# from v$archived_log;
/u01/app/oracle/flash_recovery_area/PROD/archivelog/2013_03_01/o1_mf_1_44_8lz8xwqz_.arc
44
/u01/app/oracle/flash_recovery_area/PROD/archivelog/2013_03_01/o1_mf_1_45_8lz9fqxg_.arc
45
/u01/app/oracle/flash_recovery_area/PROD/archivelog/2013_03_01/o1_mf_1_46_8lzb48og_.arc
46
SYS @ prod > select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
1 1 46 52428800 1 YES INACTIVE 873198 01-MAR-13
2 1 47 52428800 1 NO CURRENT 893931 01-MAR-13
3 1 45 52428800 1 YES INACTIVE 872875 01-MAR-13
SYS @ prod > select group#,member from v$logfile;
GROUP# MEMBER
---------- --------------------------------------------------
1 /u01/app/oracle/oradata/prod/redo01.log
2 /u01/app/oracle/oradata/prod/redo02.log
3 /u01/app/oracle/oradata/prod/redo03.log
——添加日志分析
SYS @ prod > execute dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/prod/redo02.log',options=>dbms_logmnr.new);
PL/SQL procedure successfully completed.
SYS @ prod > execute dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/flash_recovery_area/PROD/archivelog/2013_03_01/o1_mf_1_46_8lzb48og_.arc',options=>dbms_logmnr.addfile);
PL/SQL procedure successfully completed.
——执行分析
SYS @ prod >execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora',options=>dbms_logmnr.ddl_dict_tracking);
PL/SQL procedure successfully completed.
——查看分析结果
SYS @ prod >alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SYS @ prod >select username,scn,timestamp,sql_redo from v$logmnr_contents where username='SCOTT' and lower(sql_redo) like '%table%';
USERNAME SCN TIMESTAMP SQL_REDO
---------- ---------- ------------------- --------------------------------------------------
SCOTT 851229 2012-03-23 15:45:22 drop table tb01 purge;
SCOTT 851264 2012-03-23 15:45:45 create table tb01(id int) tablespace test;
SQL> execute dbms_logmnr.end_logmnr;
PL/SQL procedure successfully completed.
***********************************以上接案例2*****************************
logmnr使用的更多相关文章
- Oracle logmnr工具分析日志脚本
在oracle:对logmnr工具分析日志这个不陌生:对数据恢复应用场景经常用到:这里为了方便对归档日志进行分析: 当然网上有一个logmnr界面的工具:感觉很人性化:下载需要积分:为此写一个脚本. ...
- 日志挖掘Logmnr
日志挖掘 9.1 日志中数据用途 所有对用户数据以及数据字典的改变全部被保存在联机日志中.当然nologging,insert/*+append+/情况比较特殊除外,因此归档日志可以用来做数据库的恢复 ...
- DBA手记(学习) - LOGMNR 简单而强大的工具
LOGMNR首先执行一个ddl(或dml)操作,以记录重做信息: SYS@ ora11g>conn scott/tigerConnected.SCOTT@ ora11g>alter sys ...
- LOGMNR分析redo log和archive log教程
自Oracle 11g起,无需设置UTL_FILE_DIR就可以使用LOGMNR对本地数据库的日志进行分析,以下是使用LOGMNR的DICT_FROM_ONLINE_CATALOG分析REDO和归档日 ...
- 【Oracle】使用logmnr挖掘日志
使用Logmnr挖掘日志的详细步骤如下: 1. 查看日志状态及位置 col member for a45 select group#,status from v$log; select group#, ...
- 通过LOGMNR查找程式带入的实际值
生产库中出现了大量的锁表,需要得到当时程式执行的SQL以及其带入的值 1.查看SQL SELECT SQL_ID FROM V$SESSION WHERE SID=(SELECT FINAL_BLOC ...
- 通过logmnr找到被修改前的存储过程
1.找到存储过程被修改时的归档日志 SELECT NAME FROM V$ARCHIVED_LOG WHERE FIRST_TIME BETWEEN TO_DATE('20191118080000', ...
- 记一次使用logmnr查找操作人流程
经常遇到开发的需求,帮我查一下是谁修改了表里面的记录,是谁对表进行了DDL操作,此类问题可以使用logmnr解决 1.根据操作时间定位归档日志 SELECT name FROM V$ARCHIVED_ ...
- 使用logmnr方法找回被误删除Oracle的数据的脚本
俗话说,常在河边走,哪有不湿鞋的.作为一个经常与数据库打交道的程序员,偶尔不小心误删除或误操作的数据也是在所难免的.如果是Oracle数据库,这里给您介绍一种从日志中找回数据的办法,下面这个地址是我以 ...
随机推荐
- String、StringBuffer 的使用 ,两个面试问题
1>统计不同类型字符个数 public static void main(String[] args) { //案例:统计不同类型字符个数 String password = "abZ ...
- pgAdmin的数据恢复
DOC 本地添加server 1.设置备份.恢复的exe路径.一般在pgAdmin的安装路径下可以找到 2.恢复restore,备份backup
- python运维小技巧
以下实验均在Linux上进行 1.一秒钟启动一个下载服务器 python版本 python2: #python -m SimpleHTTPServer Serving HTTP on 0.0.0.0 ...
- 【BZOJ 5125】小Q的书架
Problem Description 小 \(Q\) 有 \(n\) 本书,每本书有一个独一无二的编号,现在它们正零乱地在地上排成了一排. 小 \(Q\) 希望把这一排书分成恰好 \(k\) 段,使 ...
- 小米MAX开发者选项 以及如何连接MAC开发RN
打开开发者选项:设置--我的设备---全部参数-- 多次点击MiUI版本 打开开发者选项 然后返回到设置的主页面里面的更多设置就可以看到开发者选项了 在开发者选项中打开 USB调试/USB安装 将启动 ...
- 利用logstash从mysql同步数据到ElasticSearch
前面一篇已经把logstash和logstash-input-jdbc安装好了. 下面就说下具体怎么配置. 1.先在安装目录bin下面(一般都是在bin下面)新建两个文件jdbc.conf和jdbc. ...
- Eclipse调试DEBUG时快速查看某个变量的值的快捷键、快速跳转到某行的快捷键
Eclipse调试DEBUG时快速查看某个变量的值的快捷键 Ctrl + Shift + i
- [原][粒子特效][spark]深入浅出osgSpark
背景: 目前我使用的spark粒子特效库是2.0 这个库好像是原来鬼火引擎的一部分,需要从github上找 现在我要将其使用到我自己开发的基于osgearth开的三维地图引擎中 步骤: 1.编译spa ...
- git批量删除文件和批量提交
1. 单个删除文件: ① 通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:(可选操作,可直接执行②删除) $ rm test.txt ② 确实要从版本库中删除该文件,那就用命令git rm ...
- 谈谈JAVA实现节假日验证
我们需要两个类,第一个类: 我们叫它验证类. 第二个类: 它是对法定节假日的抽象. 第一步开始: 当验证类被初始化的时候,会加载本年的所有法定节假日到一个list里: thisYearHolidays ...