qileilove

          blog已經(jīng)轉移至github,大家請訪問 http://qaseven.github.io/

          如何診斷Oracle Redo Log引發(fā)的性能問題

           一、Rodo Log性能調(diào)整目標:

            在能夠影響Oracle性 能的諸多因素中,Redo Log相關的因素從某種程度上可以說是最為重要同時也是最值得關注的。因為在一個OLTP系統(tǒng)中Oracle通過各種技術以及優(yōu)良的設計,盡量做到將大部 分操作在內(nèi)存中完成,以便最大程度的提升性能。因此在Oracle的諸多后臺進程以及用戶進程的大部分操作都是內(nèi)存操作,而且這些操作會通過延遲寫入技術 盡可能的將磁盤I/O操作滯后。但是在這些操作中卻有某些例外,其中最明顯的就是針對Redo Log的操作。

            在Oracle中針對Redo Log的操作主要由LGWR進程完成,這個進程可以說是Oracle所有后臺進程中最繁忙的進程,而且這個進程可能要頻繁的進行I/O操作,這是因為Oracle出于數(shù)據(jù)安全的考慮必須保證聯(lián)機在線重做日志可 靠的寫入日志文件,以便在發(fā)生崩潰時能夠有效恢復數(shù)據(jù),而真正的數(shù)據(jù)可能會等一些時間延遲寫入數(shù)據(jù)文件。這種特點在Oracle的各個后臺進程中顯得有些 獨樹一幟。另外LGWR全局唯一,即一個實例只能有一個活動的LGWR進程,由于要進行頻繁的I/O操作可想而知是很容易造成LGWR進程競爭的。由于 LGWR在Oracle實例結構設計中的特殊地位,一旦出現(xiàn)LGWR性能瓶頸,那么對整個系統(tǒng)的性能影響將會是極為嚴重的,同時對數(shù)據(jù)安全也是一個潛在的 威脅。

            因此作為Oracle日常的數(shù)據(jù)庫管 理,我們要給與這部分相當?shù)年P注,盡早發(fā)現(xiàn)問題,盡早作出調(diào)整。調(diào)整的目標就是要做到Log_Buffer大小適中(不要過大,也不能太小),要滿足用戶 進程的使用需要,每當系統(tǒng)負載有一個明顯的增加時,就應該考慮調(diào)整它的大小。比如因為業(yè)務拓展當前系統(tǒng)固定用戶數(shù)量從1萬人猛增到3萬人,那么就應該對 Log_Buffer大小給與關注。另外就是要做到日志文件的大小適中,日志組的日志文件數(shù)量合適,不能影響LGWR寫日志文件的性能,不能造成日志文件 間的寫入競爭,不能在日志切換歸檔發(fā)生時引發(fā)磁盤競爭等等。

            二、監(jiān)控與問題排查:

            在進行Redo Log問題監(jiān)控時,主要關注兩個方面:日志緩沖區(qū)空間使用的等待情況和日志緩沖區(qū)數(shù)據(jù)槽的分配情況。通過這兩方面的監(jiān)控并配合一些問題排查手段,通??梢园l(fā)現(xiàn)大量問題。

            (1)日志緩沖區(qū)空間使用的等待情況:

            可以通過查詢v$session_wait來監(jiān)控日志緩沖區(qū)空間使用的等待情況,通過如下SQL語句進行查詢:

          select sid,event,seconds_in_wait,state
          from v$session_wait
          where event='log buffer space%';

            以上的查詢中可以通過觀察seconds_in_wait的數(shù)值來分析問題,這個數(shù)值可以顯示如下問題:日志切換緩慢引發(fā)的等待、LGWR寫入緩慢引發(fā)的等待、日志文件寫入引起的磁盤競爭引發(fā)的等待。

            這些等待的發(fā)生可能是由于如下問題引起的:

            1、日志文件寫入時存在磁盤競爭:

            這種情況多見于日志切換發(fā)生時,由于日志文件組的規(guī)劃不當,或者存放日志文件的磁盤寫入速度緩慢,或者是因為磁盤RADI類型不當都會引發(fā)這個問題,如果懷疑村在這些情況,可以通過如下語句進行監(jiān)控:

          select event,total_waits,time_waited,average_wait
          from v$system_event
          where event like 'log file switch completion%';

            可以通過觀察total_waits,time_waited,average_wait數(shù)值來分析問題,如果這些值過高(注意何謂“過高”,不同系統(tǒng)考量標準不一樣,要具體分析),那么說明存在以上問題。此時可以通過如下措施解決:

            ● 將同一日志文件組的各個成員分配到不同的磁盤上,進而減少日志寫入以及日志切換和日志歸檔時引發(fā)的競爭;

            ● 將日志文件盡可能存放在快速的磁盤上;

            ● 要合理選擇RADI類型對磁盤進行條帶化,通常不要選擇RADI5來作為日志文件磁盤的RADI類型,通常推薦使用RADI10;

            ● 可以增加REDO LOG文件大小,來延緩日志切換,下面是一個增加日志文件大小的方法;

            假如原來有3個小的redo log file,下面是UNIX環(huán)境下的一個例子:

            第一步:往數(shù)據(jù)庫添加三個大的redo logfile

          SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 4
          ('/opt/oradata/app/redo04.log',
          '/ora_bak/oradata2/redolog/redo04.log') size 16M reuse;

          SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 5
          ('/opt/oradata/app/redo05.log',
          '/ora_bak/oradata2/redolog/redo05.log') size 16M reuse;

          SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 6
          ('/opt/oradata/app/redo06.log',
          '/ora_bak/oradata2/redolog/redo06.log') size 16M reuse;

            第二步: 手工地做log switch,使新建的redo logfile起作用

          SVRMGRL>alter system switch logfile;

            此操作可以執(zhí)行一到幾次,使舊的redo logfile成invalid狀態(tài)。

            第三步:刪除原來舊的redo logfile

          SVRMGRL>alter database drop logfile group 1;
          SVRMGRL>alter database drop logfile group 2;
          SVRMGRL>alter database drop logfile group 3;

            2、檢查點發(fā)生時DBWR進程沒有完成數(shù)據(jù)寫入引發(fā)等待:

            當日志文件完成一個循環(huán)周期后再一次來到原來某個日志文件準備進行重新使用時,發(fā)現(xiàn)該日文件對應的數(shù)據(jù)還沒有寫入相應的數(shù)據(jù)文件中,此時LGWR必須等待DBWR完成寫入,從而引發(fā)等待。

            如果懷疑存在這個問題可以通過如下查詢來進行監(jiān)控:

          select event,total_waits,time_waited,average_wait
          from v$system_event
          where event like 'log file switch (check%';

            通過total_waits,time_waited,average_wait這些數(shù)值的大小來判斷分析問題,如果還不能確定,那么可以查看 一下Oracle的alert.log文件看一下相關時間內(nèi)是否存在“checkpoint not complete”。如果存在那么證明日志文件的操作性能被DBWR進程所拖累。此時可以通過如下措施解決:

            ● 檢查存放數(shù)據(jù)文件的磁盤是否存在I/O瓶頸(如:是否存在讀寫競爭、是否存在物理損壞、是否存在RADI類型不符等);

            ● 合理規(guī)劃調(diào)整日志文件組日志文件的數(shù)量和大??;

            ● 合理設置FAST_START_MTTR_TARGET參數(shù),以便設置一個合適的數(shù)值來控制檢查點的發(fā)生;

            ● 可以考慮增加DBWR進程的數(shù)量,Oracle最多可以有10個DBWR進程;

            ● 如果條件允許,可以開啟異步I/O;

            3、由于日志歸檔引發(fā)的等待:

            當歸檔發(fā)生時,歸檔日志進程不能快速的進行日志歸檔,從而導致了LGWR的等待。如果懷由此問題可以通過如下語句來監(jiān)控:

          select event,total_waits,time_waited,average_wait
          from v$system_event
          where event like 'log file switch (arch%';

            同樣通過total_waits,time_waited,average_wait這些數(shù)值來進行問題分析,如果出現(xiàn)由于歸檔日志寫入緩慢引發(fā)的性能問題,可以采用如下辦法:

            ● 確定存放歸檔日志的磁盤空間沒有被寫滿,如果出現(xiàn)這種情況,那么要對歸檔日志進行有限度的刪除,或者將這些歸檔日志移走如存放到磁帶庫上,或者分配更大的存儲空間;

            ● 增加日志文件組,從而為歸檔多留出一些時間;

            ● 增加多個歸檔進程,Oracle最多允許10個歸檔進程存在,在歸檔發(fā)生時如果LGWR進程發(fā)現(xiàn)歸檔進程ARCH出現(xiàn)不足時,會自動產(chǎn)生新的歸檔進程,因 此如果系統(tǒng)負載有明顯增加預先分配足夠的歸檔進程可以提高性能,可以使用alter system命令通過更改LOG_ARCHIVE_MAX_PROCESSES參數(shù)來改變歸檔進程數(shù)目;

            (2)日志緩沖區(qū)數(shù)據(jù)槽的分配情況引發(fā)的等待:

            可以通過如下的語句來監(jiān)控日志緩沖區(qū)數(shù)據(jù)槽的分配情況的百分比:

          select r.value "retries",e.value "entries",r.value/e.value*100 "percentage"
          from v$sysstat t,v$sysstat e
          where r.name='redo buffer allocation retries'
          and e.name='redo entries';

            這個百分比值不能高于1%,如果這個數(shù)值頻繁增長,那么一定出現(xiàn)了Log_Buffer內(nèi)存空間不足,從而使得新產(chǎn)生的redo log entries不能寫入Log_Buffer中從而造成等待,這個等待是由于LGWR性能不佳寫日志文件過慢造成的,通常來說LGWR寫入速度都是非???速的可以保證新產(chǎn)生的redo log entries內(nèi)存空間使用的需要,即使在高負載情況下也不會出現(xiàn)太大問題,因而上面的問題通常發(fā)生機率較小,但是如果一旦發(fā)生,那么很有可能是由于日志 文件磁盤I/O規(guī)劃出現(xiàn)問題,或者日志文件磁盤出現(xiàn)物理損壞,因此在出現(xiàn)這種情況引發(fā)的性能問題時,主要應該進行日志文件磁盤I/O規(guī)劃以及日志文件磁盤 是否出現(xiàn)物理損傷方面的排查,同時也可能綜合應用如Oracle的alert.log等相關文件進行綜合分析。

          posted on 2012-05-11 09:49 順其自然EVO 閱讀(1307) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

          <2012年5月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 斗六市| 扶风县| 中超| 普兰店市| 永济市| 黄平县| 奉化市| 渭南市| 阜南县| 焦作市| 武乡县| 金溪县| 子洲县| 和政县| 大城县| 东丽区| 宁安市| 建昌县| 安徽省| 宁化县| 开封县| 开化县| 绥芬河市| 库伦旗| 乌鲁木齐县| 平乐县| 沅陵县| 普兰店市| 崇信县| 江山市| 弥勒县| 河南省| 德令哈市| 古浪县| 顺平县| 德州市| 美姑县| 澳门| 阿拉善左旗| 获嘉县| 兴业县|