SEO外包平台,我们为您提供专业的企业网站SEO整站优化外包服务 SEO设置

SEO外包平台

专注于企业网站SEO整站优化外包服务

分析oracle的联机日志和归档日志

作者:jcmp      发布时间:2021-04-24      浏览量:0
@ TOC分析ORACL的联机日志和

@ TOC分析ORACL的联机日志和归档日志

一、logminer和配置

二、安装logminer

以sqlplus / as sysdba登录系统数据库系统,ORACLE默认安装logminer,如果没有安装,执行SQL脚本安装。

--安装logminerSQL>@$ORACLE_HOME/rdbms/admin/dbmslm.sql--安装logminer所需要的数据字典SQL>@$ORACLE_HOME/rdbms/admin/dbmslmd.sql。

普通用户执行logminer需要进行赋权

--使TEST1用户具备执行logminer的权限GRANT EXECUTE ON DBMS_LOGMNR TO TEST1。

三、为logminer创建单独的表空间

默认情况下logminer生成的表和数据都是在system表空间下,很容易就把system撑爆从而引发问题。 因此需要创建单独的表空间,并制定logminer使用该表空间:

EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE('logmnrts$')。

四、跟踪ddl语句

EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS =>DBMS_LOGMNR.DDL_DICT_TRACKING);--当使用Online catalog时,是不能使用该参数的。

五、设置数据字典

使用logminer需要指定数据字典,在没有数据字典的情况下表,表名和字段名都会显示为Object#1111和col#1,col#2,阅读起来非常的不方便。可以提取数据字典文件,或者使用当前数据库的联机目录作为字典源,目的都是能让logminer“知道”表名和表的字段名。

六、将数据字典提取为Flat File

以sqlplus / as sysdba登录,修改数据库spfile参数,并重启数据库(生产环境慎用!)。

ALTER SYSTEM SET UTL_FILE_DIR ='/home/oracle' SCOPE=SPFILE;SHUTDOWN IMMEDIATE;STARTUP;--登录数据库提取EXECUTE DBMS_LOGMNR_D.BUILD('dictionary.ora', '/home/oracle');

要特别注意一个问题,我在测试环境上执行这条命令以后,ORACLE大概卡顿了20分钟,最后返回一个提示信息:总线错误(吐核)……还吐核。。你咋不再来二两花生米呢 其实那个错误,从日志里看应该是core dumped,内核已转储,也就是确实遇到了系统问题。此时服务器能正常使用,但是所有跟oracle用户的功能都废了,自然也包括数据库服务器。执行reboot重启也是长时间无反应,接了个显示器一看,服务器已经在那里装死了。16核64G服务器配置应该也不算低。我现在还不确定这个问题是服务器本身就有错误,还是那条命令导致的,反正我是强烈建议在生产环境上 慎用 。如果真要执行的话,最好先跟信息中心那边协商好,万一真出问题了能直接到机房去按电源重启。 反正我是最后按电源重启解决。

七、将数据字典提取为Redo Log

这种方式用的比较广泛,大多是异地挖掘,比如数据是在生产环境数据库上,把归档日志拷贝到本地数据库服务器上,只要本地数据库开启了归档并且处于OPEN状态就可以进行分析。但是要注意必须有对应的数据字典。 网络上很多说法都是用DBMS_LOGMNR_D.BUILD把数据字典提取到挖掘数据库的在线日志中,但是我自己试了不行,我觉得原因就是拷贝的归档日志文件中并不包含对应的数据字段,最后解析出来的SQL都是unknown,col#,object#。另外一种可能,就是归档期间内有数据库的重启、重建表空间等操作,导致归档的数据字典和当前的不一致了。因此以后还是做好数据字典的备份。

--开启附加日志,提取需要ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;--提取字典EXECUTE DBMS_LOGMNR_D.BUILD(OPTIONS=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);

八、使用联机日志作为数据源(推荐)

EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);

使用联机日志作为数据源,是最快的方式,但是局限是如果表上发生过ddl语句,那么就无法分析ddl之前的SQL。因为联机日志在ddl之后就失效了。

至此logminer的安装完成

九、分析在线日志

SQL> select member from v$logfile;MEMBER--------------------------------------------------------------------------------+DATA01/xxxxxx/onlinelog/redo_01_01.log+DATA01/xxxxxx/onlinelog/redo_02_01.log+DATA01/xxxxxx/onlinelog/redo_03_01.log+DATA01/xxxxxx/onlinelog/redo_04_01.log+DATA01/xxxxxx/onlinelog/redo_05_01.log+DATA01/xxxxxx/onlinelog/redo_05_02.log+DATA01/xxxxxx/onlinelog/redo_06_01.log+DATA01/xxxxxx/onlinelog/redo_06_02.log+DATA01/xxxxxx/onlinelog/redo_07_01.log+DATA01/xxxxxx/onlinelog/redo_07_02.log+DATA01/xxxxxx/onlinelog/redo_08_01.logMEMBER--------------------------------------------------------------------------------+DATA01/xxxxxx/onlinelog/redo_08_02.log+DATA01/xxxxxx/onlinelog/redo_03_02.log+DATA01/xxxxxx/onlinelog/redo_02_02.log+DATA01/xxxxxx/onlinelog/redo_01_02.log+DATA01/xxxxxx/onlinelog/redo_04_02.log16 rows selected.SQL>

依次添加所有的日志文件:

execute dbms_logmnr.add_logfile('+DATA01/xxxxxx/onlinelog/redo_01_01.log',dbms_logmnr.new);execute dbms_logmnr.add_logfile('+DATA01/xxxxxx/onlinelog/redo_02_01.log',dbms_logmnr.addfile);execute dbms_logmnr.add_logfile('+DATA01/xxxxxx/onlinelog/redo_03_01.log',dbms_logmnr.addfile);

使用联机日志开始执行分析

exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);

将日志内容写入物理表

create table usr_logmnr.logmnr201912212053 as select * from v$logmnr_contents;

然后就可以查询usr_logmnr.logmnr201912212053中的内容了。

十、挖掘归档日志

当联机日志达到指定大小后就会转为归档日志, 首先通过rman查看要进行挖掘的归档日志。

[root@xxx~]# su - gridLast login: Sat Dec 21 20:37:10 CST 2019l[grid@xxx~]$ lsdbbackup oradiag_grid[grid@xxx~]$ asmcmdASMCMD> cd +arch01/xxx/archivelog/2019_12_16ASMCMD> lsthread_1_seq_2361.776.1027125235thread_1_seq_2362.775.1027134727thread_1_seq_2363.773.1027134739thread_1_seq_2364.771.1027157227thread_1_seq_2365.769.1027157873ASMCMD>

登录rman拷贝要进行挖掘的归档日志

[oracle@xxx archlog]$ rman target /RMAN> copy archivelog '+arch01/xxx/archivelog/2019_12_16/thread_1_seq_2361.776.1027125235' to '/home/oracle/archlog/thread_1_seq_2361.776.1027125235';RMAN> exit。

也可以在sqlplus中通过SQL执行查询归档日志:

SELECT NAME FROM V$ARCHIVED_LOG--执行查询后,复制需要进行挖掘的归档日志即可。

然后开始分析拷贝的归档日志,或者也可以直接增加归档日志

--增加拷贝的归档日志:execute dbms_logmnr.add_logfile('/home/oracle/archivelog/2019_12_16/thread_1_seq_2361.776.1027125235',dbms_logmnr.new);--或者可以直接增加归档目录里的日志文件execute dbms_logmnr.add_logfile('+arch01/xxx/archivelog/2019_12_16/thread_1_seq_2361.776.1027125235',dbms_logmnr.new);PL/SQL procedure successfully completed.--执行分析,注意这里仍然使用的联机的数据字典SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);PL/SQL procedure successfully completed.--将分析结果写入数据表中SQL> create table logmnr201912212121 as select * from v$logmnr_contents;

然后可以查看归档日志的内容:

select * from logmnr201912212121。

十一、批量增加分析文件

当要分析的日志文件比较多时,可以批量增加文件

--获取开始文件:+ARCH01/xxxxx/archivelog/2019_12_22/thread_1_seq_2581.1061.1027675395SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN='YES';--获取结束文件:+ARCH01/xxxxx/archivelog/2019_12_22/thread_1_seq_2582.1060.1027675397SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END='YES';--当要增加的归档文件比较多时,使用一下SQL生成语句,然后批量执行select 'execute dbms_logmnr.add_logfile(''' || l.NAME || '''' || ',dbms_logmnr.addfile);' from V$ARCHIVED_LOG l WHERE l.FIRST_TIME > to_date('2019-12-17 08:00:00','yyyy-mm-dd hh24:mi:ss') and l.FIRST_TIME < to_date('2019-12-17 18:00:00','yyyy-mm-dd hh24:mi:ss')--拷贝SQL执行结果,然后在命令行下批量执行。注意,你在哪里执行的lgominer,就在哪里执行这些语句,因为logminer的结果是分会话的,不同的会话不能访问彼此的数据--如果文件不多,也可以手动一个一个添加EXECUTE DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '+ARCH01/xxxxx/archivelog/2019_12_22/thread_1_seq_2581.1061.1027675395', OPTIONS => DBMS_LOGMNR.NEW);EXECUTE DBMS_LOGMNR.ADD_LOGFILE( LOGFILENAME => '+ARCH01/xxxxx/archivelog/2019_12_22/thread_1_seq_2582.1060.1027675397', OPTIONS => DBMS_LOGMNR.ADDFILE);--开始执行分析SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);

十二、结束分析

logmnr分析的结果,在另一个会话中是查询不到的,当分析结束后,建议关闭当前分析过程。释放PGA内存区域。

execute DBMS_LOGMNR.END_LOGMNR