设为首页 收藏本站
查看: 1046|回复: 0

[经验分享] Oracle logminer 日志分析工具使用

[复制链接]

尚未签到

发表于 2018-9-14 09:54:52 | 显示全部楼层 |阅读模式
  前几天去面试ORACLE DBA 面试官问我这样一个问题:在生产环境中,有一个表,里面没有日期相关的字段,最后一次修改这个表可能在一个月前,你如何找出这个表最后修改的记录。我听到这个题目蒙了,我想到了如果能够分析数据库归档日志就好了,于是就这样答了一句,就答不上来了,回来后上网查了下才知道可以通过logminger分析,下面是我今天整理的使用笔记
  1.安装LOGMNR包,脚本在$ORACLE_HOME/rdbms/admin路径下
  SQL> @/u01/app/oracle/product/11.2.0/rdbms/admin/dbmslm.sql
  Package created.
  Grant succeeded.
  Synonym created.
  SQL> @/u01/app/oracle/product/11.2.0/rdbms/admin/dbmslmd.sql
  Package created.
  Synonym created.
  SQL> @/u01/app/oracle/product/11.2.0/rdbms/admin/dbmslms.sql
  Package created.
  No errors.
  Grant succeeded.
  SQL>
  2.设定UTL_FILE_DIR的初始值,该参数值为服务器中放置数据字典文件的目录,若过设置的目录不存在,需要创建。

  SQL>>
  System>  SQL> host mkdir -p /u01/app/oracle/dict/logs
  SQL> shutdown immediate;
  Database closed.
  Database dismounted.
  ORACLE instance shut down.
  SQL> startup
  ORACLE instance started.
  Total System Global Area  434249728 bytes

  Fixed>
  Variable>  Database Buffers           88080384 bytes
  Redo Buffers                4214784 bytes
  Database mounted.
  Database opened.
  重启完成检查修改是否生效
  SQL> show parameter utl_file_dir
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  utl_file_dir                         string      /u01/app/oracle/dict/logs
  3.通过oracle提供的包dbms_logmnr_d创建数据字典文件,通过调用存储过程build来创建,下面贴出了,该过程调用的变量名,这里传入两个变量的值就可以了,变量dictionary_filename为生成字典的名字,变量dictionary_location就是utl_file_dir设置的值
  PROCEDURE  build
  (dictionary_filename IN VARCHAR2 DEFAULT '',
  dictionary_location IN VARCHAR2 DEFAULT '',
  options IN NUMBER DEFAULT 0);
  在创建数据字典文件前,首先创建一个测试表用作实验分析步骤如下
  (1)首先切换下日志,当然这不是必须的

  SQL>>
  System>  (2)查看当前在线日志number
  SQL> select group#,status from v$log;
  GROUP# STATUS
  ---------- ----------------
  1 CURRENT
  2 INACTIVE
  3 ACTIVE
  (3)创建测试表
  SQL> create table test_1 (id int, name varchar2(10));
  Table created.
  (4)插入3行测试数据
  SQL> insert into test_1 values (1,'a');
  1 row created.
  SQL> insert into test_1 values (2,'b');
  1 row created.
  SQL> insert into test_1 values (3,'c');
  1 row created.
  SQL> commit;
  Commit complete.
  (5)我们知道当commit的时候,一定会触发lgwr进程写日志,所以查询当前日志组的文件名,member的值就是我们需要分析的日志,这里1号日志组有2个成员,由于日志成员互为镜像,所以使用其中的一个成员来分析就可以了。
  SQL> col member for a30;
  SQL> select group#,member from v$logfile where group#=(select group# from v$log where status='CURRENT');
  GROUP# MEMBER
  ---------- ------------------------------
  1 +DATA/orcl/onlinelog/group1_1.
  ora
  1 +FRA/orcl/onlinelog/group1_2.o
  ra
  (6)执行下面语句生成字典到/u01/app/oracle/dict/logs/dict.ora
  SQL> execute dbms_logmnr_d.build(dictionary_filename => 'dict.ora',dictionary_location => '/u01/app/oracle/dict/logs');
  PL/SQL procedure successfully completed.
  存储过程执行完成后到/u01/app/oracle/dict/logs这个目录下验证是否生成了dict.ora文件
  [oracle@localhost logs]$ pwd;ls
  /u01/app/oracle/dict/logs
  dict.ora
  4.数据字典文件成功生成后就可以通过调用dbms_logmnr包提供的存储过程add_logfile来添加需要分析的redo和归档日志,下面是存储过程add_logfile的变量
  PROCEDURE add_logfile(
  LogFileName    IN  VARCHAR2,
  OptionsIN  BINARY_INTEGER default ADDFILE );
  执行下面命令添加日志文件
  SQL> execute dbms_logmnr.add_logfile(logfilename=>'+FRA/orcl/archivelog/2013_08_16/thread_1_seq_20.321.823621023',options=>dbms_logmnr.new);
  PL/SQL procedure successfully completed.
  5.日志文件添加完成后,调用dbms_logmnr.start_logmnr过程分析该日志,这个过程只需要传入一个变量值,就是前面创建的数据字典名。如果日志比较大可能分析的时间较长
  SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/u01/app/oracle/dict/logs/dict.ora');
  PL/SQL procedure successfully completed.
  6. 执行完成后我们可以从v$logmnr_contents视图中得到刚才分析的结果
  SQL> select sql_redo from v$logmnr_contents where table_name='TEST_1';
  SQL_REDO
  --------------------------------------------------------------------------------
  create table test_1 (id int, name varchar2(10));
  insert into "SYS"."TEST_1"("ID","NAME") values ('1','a');
  insert into "SYS"."TEST_1"("ID","NAME") values ('2','b');
  insert into "SYS"."TEST_1"("ID","NAME") values ('3','c');
  7.退出logmnr
  SQL> execute dbms_logmnr.end_logmnr;
  PL/SQL procedure successfully completed.
  在前面反复的实验过程中我又重新创建了测试表发现分析出来的结果没有我们执行的sql,我在网上查了一些资料才发现,如果要分析新的对象必须重新创建数据库字典,注意,v$logmnr_contents内容保存的日志的内容存放在pga中,只在当前会话有效,如果想长期保存分析,可以在当前会话用create table tablename as select * from v$logmnr_contents语句来持久保存。
  如果只想获取dml的操作可以通过执行下面语句进行分析:
  SQL> execute dbms_logmnr.start_logmnr (options=>dbms_logmnr.dict_from_online_catalog);
  如果想添加多个日志列表,例如添加一个归档日志如下:
  SQL> execute dbms_logmnr.add_logfile(logfilename=>'+FRA/orcl/archivelog/2013_08_16/thread_1_seq_23.324.823621999',options=>dbms_logmnr.addfile);
  限制日志分析内容,例如分析2013/8/16的如下:
  EXECUTE dbms_logmnr.start_logmnr(DictFileName => '/u01/data1/oracle/logs/dict.ora ',  StartTime => to_date('2013-08-16 00:00:00','YYYY-MM-DD HH24:MI:SS'), EndTime => to_date('2013-08-16 23:59:59','YYYY-MM-DD HH24:MI:SS '));


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-582058-1-1.html 上篇帖子: Oracle查询语句的优化-记录一 下篇帖子: Install oracle software silent mode
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表