調優日誌切換(Tuning Log Switches)

來源:互聯網
上載者:User

調優日誌切換(Tuning Log Switches)

 

日誌切換:LGWR進程停止寫日誌到當前記錄檔,關閉記錄檔,開啟新的記錄檔並寫日誌緩衝中的資料到新的記錄檔。

 

日誌切換可以命令ALTER SYSTEM SWITCH LOGFILE或者ALTER SYSTEM ARCHIVE LOG來手工執行,也可以通過設定參數LOG_ARCHIVE_START使其自動執行。一般的原因是一個進程不能將產生的重做日誌從緩衝中寫到當前的記錄檔,因為已經使用到當前記錄檔的最後一個資料區塊。

 

 

日誌切換時做到的相關的步驟順序:

 

1、  執行一個控制檔案事務來選擇下一個記錄檔以使用並清除控制檔案入口。一般是選擇當前帶有最小記錄序號的記錄檔來作為下一個使用,在這一步上,如果有必要,日誌切換將會等待DBWR進程完全前面一個記錄檔的日誌切換的CHECKPOINT,等待ARCn進程完成歸檔。

2、  使用redo copy latches和redo generation latches兩個latch來阻止重做日誌在日誌緩衝中產生(標記日誌緩衝狀態),並將日誌緩衝中的資料寫到記錄檔(磁碟)中。如有可能用並行的方式,會同時將檔案中最後一個記錄的SCN號寫到頭資料區塊中(header block)。在這些“寫”操作都完成之後LGWR進程關閉這個記錄檔。

3、  提升SCN值執行第二個控制檔案事務來將記錄檔標記為CURRENT,把之前的記錄檔標記為ACTIVE,一旦DBWR進程完成了日誌切換的CHECKPOINT後,這個檔案的狀態(之前的記錄檔)會被標記為INACTIVE。如果資料庫運行在歸檔模式下,LGWR進程通過控制檔案中記錄檔的入口段將這個記錄檔(之前的記錄檔)添加到歸檔串連單中,如果啟動的是自動歸檔,LGWR會啟用ARCn後台進程將這個記錄檔進行歸檔。如果當前使用的所有ARCn進程都處於忙狀態,LGWR會啟用一個新的ARCn進程,ARCn進程數由參數log_archive_max_processes。

4、  最後一步,LGWR進程開啟新記錄檔組的所有成員,並將新的記錄序號和底SCN寫到頭資料區塊(header block)。然後將日誌緩衝狀態改為可以組建記錄檔。

 

日誌切換可能會花較長時間,經常是以秒記,日誌切換過程有較大的調優潛力。相對於連續的緩慢的效能,OLTP系統的使用者一般更難忍受資料庫的間斷的較差的效能,所以,減少日誌切換頻率,減少切換間隔時間是非常重要的。

 

在系統效能方面,日誌切換衝突的主要表現在於log file switch completion等待事件上。如果日誌切換效能差,另外一個等待事件log buffer space等待也會即刻產生。對日誌切換調優就是要先調優log file switch completion等待事件然後是log buffer space等待。

 

使用大的記錄檔:為了最小化日誌切換頻率,可以加大記錄檔的SIZE(儘可能大,最易歸檔),也要控制CHECKPOINT(如設定參數fast_start_mttr_target)來使資料庫恢複效能最優。

每個聯機記錄檔應該放在專有的磁碟上以免ARCn進程同時進入訪問該磁碟。不要使用小的記錄檔來儲存磁碟空間,因為儲存下來的空間不會再被使用(聯機記錄檔大小確定後是不會再增長的,所以不會用到您所保留下來的這些空間)

增加聯機記錄檔會提高歸檔的間隔時間。、

另外一方面,在使用了大的聯機記錄檔時,要通過調優歸檔以減少資源使用強度。

 

保持記錄檔是開啟狀態:調整日誌切換的速度最大的調優的潛在地方在於新記錄檔成員的開啟過程,開啟新記錄檔是用作業系統的指令open()。如果有其他的一個進程在同一個檔案中已經有開啟檔案的描述符則作業系統調用這個命令來開啟新的記錄檔的速度是很快的,主要原因是關於檔案的一些資訊都放在了系統的核心記憶體中。

  下面這個指令碼用於在執行個體啟動時將記錄檔的資訊放到核心記憶體中,可以在一定的程度上提高日誌切換的速度。這個是SHELL指令碼,用於UNIX作業系統中,用CRON來定期每天實現:hold_logs_open.sh

###############################################################################

#

# Synopsis:       hold_logs_open.sh instance

# Purpose:      to hold the log files open to accelerate log switches

#

# Copyright:  (c) Ixora Pty Ltd

# Author: Steve Adams with acknowledgements to Chris Bunting

#

###############################################################################

 

if [ $# -ne 1 ]

then

    echo "Usage: hold_logs_open instance" >&2

    exit 1

fi

instance=$1

 

ORACLE_SID=$1

ORAENV_ASK=NO

. oraenv

 

fd=3

echo '

    set pages 0 feedback off

    select member from v$logfile;

    prompt End-of-Files

' |

sqlplus -s internal |

while read logfile

do

    if [ "$logfile" = End-of-Files ]

    then

        if [ "$fd" -gt 3 ]

        then

            sleep 86460 &

        fi

        exit 0

    fi

    eval "exec $fd<$logfile"

    fd=`expr $fd + 1`

#

#   Uncomment these lines if your shell only supports input redirection

#   for single digit file descriptors.

#

#    if [ "$fd" -eq 10 ]

#    then

#        sleep 86460 &

#        fd=3

#    fi

done

 

 

調整控制檔案事務:每次日誌切換都包含了兩次控制檔案事務,控制檔案事務是在CF隊列鎖的保護下執行的,所以沒有進一步的必要來控制控制檔案的“寫”操作,但是為了在控制檔案事務期間的執行個體或者系統FAILURE的可恢複性,還是有必要進行一定的控制。

 

控制檔案的可恢複性,首先寫恢複結構到控制檔案的第二個資料區塊,在寫控制檔案中的目標塊時(控制檔案事務所要寫的塊)等待其操作(恢複結構寫操作)完成,因此,每個控制檔案事務至少包含兩個寫I/O操作的等待。

 

如果使用的啟用的控制檔案是多個,則I/O操作會以串列的方式來實現。因此,要提高控制檔案事務的效能就是要減少啟用的控制檔案數。在大多數情況下,可以只使用一個啟用的控制檔案,然後用硬體鏡像及使用命令ALTER SYSTEM BACKUP CONTROLFILE TO TRACE來備份控制檔案及保護控制檔案。

 

下面的指令碼(backup_controlfile.sql)提供了一種備份方案,主要在UNIX下實現,將控制檔案的備份放到資料庫的建立目錄中:

 trace_file_name.sql(獲得追蹤檔案名)

-------------------------------------------------------------------------------

--

-- Script:       trace_file_name.sql

-- Purpose:     to get the name of the current trace file

--

-- Copyright:  (c) Ixora Pty Ltd

-- Author:       Steve Adams

--

-- Synopsis:       @trace_file_name

--

--              OR

--

--            set termout off

--            @trace_file_name

--            set termout on

--            ... &Trace_Name ...

--

-- Description:       This script gets the name of the trace file for the current

--            session.  It can be used interactively, or from other scripts.

--            The name is saved in the SQL*Plus define &Trace_Name.

--

--            There are three versions of the query below, because the trace

--            files are named differently depending on the platform. The

--            two incorrect versions should be commented out or deleted.

--

-------------------------------------------------------------------------------

 

column trace_file_name new_value Trace_Name

column trace_file_zipped new_value Trace_Zipped noprint

 

select

  d.value || '/ora_' || p.spid || '.trc' trace_file_name,

  d.value || '/ora_' || p.spid || '.trc.gz' trace_file_zipped

from

  ( select

      p.spid

    from

      sys.v_$mystat m,

      sys.v_$session s,

      sys.v_$process p

    where

      m.statistic# = 1 and

      s.sid = m.sid and

      p.addr = s.paddr

  ) p,

  ( select

      value

    from

      sys.v_$parameter

    where

      name = 'user_dump_dest'

  ) d

/

 

select

  d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name,

  d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc.gz' trace_file_zipped

from

  ( select

      p.spid

    from

      sys.v_$mystat m,

      sys.v_$session s,

      sys.v_$process p

    where

      m.statistic# = 1 and

      s.sid = m.sid and

      p.addr = s.paddr

  ) p,

  ( select

      t.instance

    from

      sys.v_$thread  t,

      sys.v_$parameter  v

    where

      v.name = 'thread' and

      (

        v.value = 0 or

        t.thread# = to_number(v.value)

      )

  ) i,

  ( select

      value

    from

      sys.v_$parameter

    where

      name = 'user_dump_dest'

  ) d

/

 

select

  d.value || '\ora' || lpad(p.spid, 5, '0') || '.trc' trace_file_name,

  d.value || '\ora' || lpad(p.spid, 5, '0') || '_trc.gz' trace_file_zipped

from

  ( select

      p.spid

    from

      sys.v_$mystat m,

      sys.v_$session s,

      sys.v_$process p

    where

      m.statistic# = 1 and

      s.sid = m.sid and

      p.addr = s.paddr

  ) p,

  ( select

      value

    from

      sys.v_$parameter

    where

      name = 'user_dump_dest'

  ) d

/

 

clear columns

backup_controlfile.sql

-------------------------------------------------------------------------------

-- Script:       backup_controlfile.sql

-- Purpose:     to save a create controlfile statement

--

-- Copyright:  (c) Ixora Pty Ltd

-- Author:       Steve Adams

--

-- Description:       This script uses the backup controlfile to trace command to

--            save a create controlfile statement, and then moves the trace

--            file into the APT create directory.

--

--            The SQL*Plus connection is closed, because its trace file has

--            been moved.

-------------------------------------------------------------------------------

 

alter database backup controlfile to trace

/

set termout off

@trace_file_name

set termout on

 

disconnect

host mv &Trace_Name $CREATE/create_controlfile.sql

exit

 

 

自www.ixor.com.au


相關文章

Alibaba Cloud 10 Year Anniversary

With You, We are Shaping a Digital World, 2009-2019

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。