調優日志切換 (Tuning Log Switches) 日志切換: LGWR 進程停止寫日志到當前日志文件,關閉日志文件,打開新的日志文件并寫日志緩存中的數據到新的日志" name="description" />
MILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">調優日志切換(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 aclearcase/" target="_blank" >ccelerate 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
原文轉自:http://www.anti-gravitydesign.com