標簽:class style img div size tar ext width art color log
今天寫篇原創的,把在工作中遇到的logminer問題總結下
(1)簡介:
logminer
工具即可以用来分析在线,也可以用来分析离线日志文件,即可以分析本身自己數據庫的重作日志文件,也可以用来分析其他數據庫的重作日志文件。
總的說來,logminer工具的主要用途有:
1. 跟踪數據庫的变化:可以离线的跟踪數據庫的变化,而不会影响在线系统的性能。
2. 回退數據庫的变化:回退特定的变化数据,减少point-in-time recovery的执行。
3. 优化和扩容计划:可通过分析日志文件中的数据以分析数据增长模式。
说到这里,不得不提一下oracle日志的问题,oracle日志分为在线redo日志和离线归档日志两种,在线redo日志是必须的,离线归档日志可以设置是否归档,从而离线归档日志可以不存在,但如果没有离线归档日志,那么是没有什么实际价值的,如果數據庫崩溃,就不能进行回滚和回复了
(1)可以通过select * from v$log查看在线redo日志。
其中archived字段顯現的是否開啓歸檔,如上所示,未開啓歸檔模式,實際就沒有實際價值,可以啓動歸檔日志,可以看另一篇博客,在此不再說明
在線redo日志,有current,active和inactive字段,在線redo日志的切換原理是,正在修改的日志會標記爲current,例如redo1,redo2,redo3,當redo1是current時,會一直寫redo1日志,當該日志寫滿後會修改redo2日志爲current,redo1日志標記變爲active,此時會對redo1進行歸檔,當歸檔完成後,變爲inactive標記,current會循環著變化,當在變到redo1時就會覆蓋掉以前的內容。因此說開啓歸檔日志非常重要。
(2) 用select * from v$logfile;确定在线redo日志位置
注意:這裏提示一點,在linux和windows系統的oracle中,在線redo日志爲。。。。。.log,以.log後綴結尾,而在AIX中是沒有後綴的,在後面我會說這回有問題。
(3)使用select * from v$archived_log;查看离线归档日志位置。
歸檔日志在linux下是以.dbf後綴結尾
(4)開始介紹使用logminer工具(整個logminer都必須是sysdba運行)
要安裝logminer工具,必須首先要運行下面這樣兩個腳本,
l
$ORACLE_HOME/rdbms/admin/dbmslm.sql
2
$ORACLE_HOME/rdbms/admin/dbmslmd.sql
3
$ORACLE_HOME/rdbms/admin/dbmslms.sql
這兩個腳本必須均以SYS用戶身份運行。其中第一個腳本用來創建DBMS_LOGMNR包,該包用來分析日志文件。第二個腳本用來創建DBMS_LOGMNR_D包,該包用來創建數據字典文件。 (即必須以sysdba運行)
设置生成数据字典位置:alter system set UTL_FILE_DIR=‘/oracle‘
scope=spfile;设置完成后必须重启數據庫:shutdown
immediate; //如果不好用就shutdown abort;
或者shutdown force;强行关闭
startup;开启數據庫
生成数据字典:execute
dbms_logmnr_d.build(‘dict.ora‘,‘/oracle‘);运行后将在/oracle
下生成数据字典
添加日志文件:(這裏添加的是AIX下的在線redo日志)
execute
dbms_logmnr.add_logfile(LogFileName=>‘/dev/rredo1_1‘,Options=>dbms_logmnr.new);
execute
dbms_logmnr.add_logfile(LogFileName=>‘/dev/rredo1_2‘,Options=>dbms_logmnr.addfile);
execute
dbms_logmnr.start_logmnr(DictFileName=>‘/oracle/dict.ora‘);
//开启logminer工具
隨後可以在v$logmnr_contents查看內容了,查看完成後使用:
execute dbms_logmnr.end_logmnr;
//关闭logminer日志
这里介绍下logminer原理,logminer的原理是以数据字典为基础加载redo日志文件,当运行dbms_logmnr.start_logmnr()后,会开启,但不会扫描分析日志,logminer是在单进程PGA中运行,也就是只有在运行logminer工具的窗口中v$logmnr_contents视图存在,新开启SQLwindows查询该表时不存在的,v$logminer生存期直到调用了end,会清空PGA。同时v$logmnr_contents采用的是动态扫描的方法,只有当有select
。。。。from
v$log_contents动作时,logminer工具会开始从头加载添加的日志文件,直到所有日志文件添加完成,或者是达到指定的日期(这个在后面说),所以v$logmnr_contents是动态生成的,因为这个原理,如果想以create
table my_logmnr_contents as select * from
v$logmnr_contents,可能就会出现死循环问题,注意这里是分析的在线redo日志,create table
my_logmnr_contents也会写到日志中,而v$logmnr_contents是动态的,也就是create table
my_logmnr_contents的日志也会出现在v$logmnr_contents里,这就会造成死循环。注意,不是所有情况都会造成死循环。举例说明:
redo1 current
redo2
inactive
redo3
inactive
redo4
inactive
如果把四个日志都加载进去,就一定会造成死循环,会导致current非常快速的切换日志,这是非常严重的后果,redo日志切换频繁会出的问题可以自行查看,最终将导致create
table my_logmnr_contents表的失败,
但是如果加载单独的日志,比如redo1日志,因为此时是current,logminer建自己的表后,current会切换,如果切换一圈又回到自身而create
table还没建完,就会出错,而如果没有在切回来,就不会错,在举个例子,如果加载的是redo2日志,此时为inactive,忘了说了将v$logmnr_contents复制成静态表会大量增加日志,因此就会造成日志切换过快,加载redo2日志,current会很快切换redo2日志,这样logminer也会出错,总结就是如果一个日志在用logminer分析时,如果该日志标记改变,用create
table就会不成功,這裏有個例外就是如果不開啓歸檔模式,不管如何切換,複制自己的logminer表都可以成功。(這些都是經驗總結啊,說多了都是淚)
總之,用logminer解析日志,如果想存成自己的靜態表,會導致日志增加非常迅速,這點一定要注意。所以,一個方法就是只查詢,不産生自己的靜態表,二就是盡量加上日期等進行限制。加日期的方法如下:
(1)無限制條件
SQL>
EXECUTE dbms_logmnr.start_logmnr( DictFileName=>‘ /oracle/dict.ora ‘);
(2)有限制條件
通过对过程DBMS_
LOGMNR.START_LOGMNR中几个不同參數的设置(參數含義见表1),可以缩小要分析日志文件的范围。通过设置起始时间和终止时间參數我们可以限制只分析某一时间范围的日志。如下面的例子,我们仅仅分析2004年9月18日的日志,:
SQL>
EXECUTE dbms_logmnr.start_logmnr(
DictFileName
=> ‘ /oracle/dict.ora‘,
StartTime
=> to_date(‘2004-9-18 00:00:00‘,‘YYYY-MM-DD HH24:MI:SS‘)
EndTime
=> to_date(‘‘2004-9-18 23:59:59‘,‘YYYY-MM-DD HH24:MI:SS ‘));
也可以通過設置起始SCN和截至SCN來限制要分析日志的範圍:
SQL>
EXECUTE dbms_logmnr.start_logmnr( DictFileName => ‘/oracle/dict.ora‘,
StartScn
=> 20, EndScn => 50);
表1
DBMS_LOGMNR.START__LOGMNR过程參數含義
參數
參數类型
默認值
含義
StartScn
數字型(Number)
0
分析重作日志中SCN≥StartScn日志文件部分
EndScn
數字型(Number)
0
分析重作日志中SCN≤EndScn日志文件部分
StartTime
日期型(Date)
1998-01-01
分析重作日志中時間戳≥StartTime的日志文件部分
EndTime
日期型(Date)
2988-01-01
分析重作日志中時間戳≤EndTime的日志文件部分
DictFileName
字符型(VARCHAR2)
0
字典文件,该文件包含一个數據庫目录的快照。使用该文件可以使得到的分析结果是可以理解的文本形式,
4、觀察分析結果(v$logmnr_contents)
一共有四个表,詳細说明如下
V$LOGMNR_DICTIONARY-------查詢使用的數據字典文件
V$LOGMNR_PARAMETERS-------查询当前LogMiner设定的參數
V$LOGMNR_LOGS-------查詢分析的日志文件
V$LOGMNR_CONTENTS-------日志文件的內容
用logminer解析離線歸檔日志就沒有那麽多事了,方法同上,而且也可以建自己的表保存v$logmnr_contents,但日志同樣會暴增,而且歸檔日志一般是按照一定的規則生成,不像在線redo日志,就那麽幾個是固定的。
這裏在說一下工作中遇到的問題,因爲日志暴增的問題,想到的就是將服務器的字典文件,在線redo日志通過ssh或者ftp等方式,發送到遠程的另一個機器中進行分析,同時在遠程的服務器上生成自己的v$logmnr_contents日志,這樣就可以避免生産庫日志暴增的問題,但是也遇到了其他問題:
首先:原計劃想分析在線日志文件,當一個日志由current變成非current時,說明該日志以滿,通過scp發送到遠程,但是AIX上的在線redo日志不知道什麽原因,不能發送到windows服務器上,字典文件可以發送成功,但是日志怎麽都不行,但是在centos上的oracle的在線redo日志就可以發送到windows服務器上,可能是由于沒有後綴,不能識別該文件,用ftp也不可以。但是可以將歸檔日志成功發送到windows服務器端。
其次:發送文件將涉及到斷網的情況,如何能夠在判斷歸檔日志發送到哪個,是否有新增歸檔日志,斷網後連網如何保證同步傳輸,不會丟失的問題。這些還沒有成功解答,成功後會有後續介紹。
這裏寫下遠程分析logminer注意事項:
我们可以利用logminer日志分析工具来分析其他數據庫实例产生的重作日志文件,而不仅仅用来分析本身安装logminer的數據庫实例的redo
logs文件。使用logminer分析其他數據庫实例时,有几点需要注意:
1.
logminer必须使用被分析數據庫实例产生的字典文件,而不是安装logminer的數據庫产生的字典文件,另外必须保证安装logminer數據庫的字符集和被分析數據庫的字符集相同。
2.
被分析數據庫平台必须和当前logminer所在數據庫平台一样,也就是说如果我们要分析的文件是由运行在UNIX平台上的Oracle
9i产生的,那么也必须在一个运行在UNIX平台上的Oracle实例上运行logminer,而不能在其他如Microsoft
NT上运行logminer。当然两者的硬件条件不一定要求完全一样。
3.
logminer日志分析工具仅能够分析Oracle
8以后的产品,对于8以前的产品,该工具也无能为力
oracle logminer全解析,码迷,mamicode.com
oracle logminer全解析
標簽:class style img div size tar ext width art color log
原文地址:http://www.cnblogs.com/zmlctt/p/3693893.html