调优日志切换(Tuning Log Switches)

发表于:2007-07-02来源:作者:点击数: 标签:
调优日志切换(Tuning Log Switches) 日志切换:LGWR进程停止写日志到当前日志文件,关闭日志文件,打开新的日志文件并写日志缓存中的数据到新的日志文件。 日志切换可以命令ALTER SYSTEM SWITCH LOGFILE或者ALTER SYSTEM ARCHIVE LOG来手工执行,也可以通过

调优日志切换(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

 

 

自www.ixor.com.au

原文转自:http://www.ltesting.net