oracle redo log的维护

Oracle online redo log是Oracle数据库中核心文件之一。在数据库操作中,只要有任何的数据块变化,都会生成相应的redo entry。redo entry首先保存在log buffer中,最后由lgwr进程写入到Redo log里面。

Online Redo Log的维护和性能是影响Oracle工作的一个重要方面。本文从日常维护角度出发,介绍几个常见的场景处理方法。

1、Redo Log Group和Redo Log Group Member

Redo Log在数据库中的作用主要在于进行实例恢复(Instance Recovery)。当数据库中一个事务提交commit的时候,由server process修改的数据块是不会直接写回到数据文件里面的。commit动作是会引发lgwr进程将事务生成的redo log写入到online redo log file。这样,形成日志在先的策略。

如果此时发生数据库突然的停机,如断电、事故,在内存中的数据块是会丢失的。此时,文件的事务编号与日志的进程是不一致的。在服务器启动的open阶段,Oracle会根据online redo log的记录,从最后一个检查点checkpoint开始,进行数据库事务重演。所以,online redo log对数据库的事务一致性和数据恢复是极其重要的。

Online Redo Log Group是一系列完全相同的online redo log file的集合。在一个数据库中,至少要有两个redo log group交替进行redo log写入操作。但是,我们建议是使用至少三个日志组。

SQL> select group#, sequence#, bytes, members, status from v$log;

GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS

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

1        217   52428800          2 CURRENT

2        215   52428800          2 INACTIVE

3        216   52428800          2 INACTIVE

三个日志组是按照交替的顺序进行读写。我们从视图v$log中,可以看到当前正在使用的日志组。这个视图中,我们着重关注group#,sequence#和status三个视图列。

group#表日志组编号。redo log group的标志是通过组编号来实现的。我们创建group和修改维护group,都是通过制定group#完成。

sequence#表示日志顺序号。每个日志都是唯一的,分配给日志的编号也是唯一的。这个就是sequence#编号,这个编号会随着archive redo log一起记录。

status表示当前日志的所处状态,常见的有active,current,inactive和unused。下面详细介绍一下几个状态的含义:

ü  Current:表示当前正在进行写入的日志组,也是最新的日志组;

ü  Active:当一个事务完成commit之后,redo entry写入到了日志文件。并且这个日志已经不是当前current,但是对应的数据块data block还没有从buffer cache中写入到文件中。此时,日志组状态为active。处在active状态的日志组,是不能够被覆盖和删除的;

ü  Inactive:日志并不是当前正在读写的日志,并且对应的事务数据块都已经写回到数据文件中;

ü  Unused:表示新创建的online日志组,还没有使用过;

下面再来说一说redo group member。在每个redo log group中,都有一个或者多个完全相同的log file。在一个组内,log file完全相同,一个写入日志动作要在组内所有的文件上写入成功之后,才算写入完成。

在生产条件下,redo group member通常是放置在不同的磁盘存储日志文件。进行这种“multi-path”配置的理由就在于冗余防错。当一个文件出现损坏,虽然一时不能启动数据库,但是我们可以方便利用其它副本进行替换。

在诸多的Oracle文件中,采用相同multi-path保存配置的还有控制文件control file。

此处有一点需要注意:很多系统由于各种原因,配置的多路径过多,反而影响效率。相同的redo log在一个文件中写入的时间和十个文件中写入的时间天差地别。配置多路径目的是利用物理冗余防错,过多的冗余事倍功半。

2、常用的Redo Log调整操作

在Oracle安装的时候,我们是可以调整Redo Log的大小和组数。同时,在系统运行过程中,我们也可以对现有的日志进行调整。下面是常见的集中类型的redo log操作实例。我们选择Oracle 11R2进行试验。

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE        11.2.0.1.0         Production

注意:进行redo log的调整,一定要选择系统相对空闲的时候,避免业务高峰期。特别是生产环境尤其重要。

ü  查看当前redo 情况

通过视图v$log和v$logfile可以分别查看当前的日志组和文件情况。

SQL>  select group#, sequence#, bytes, members, status from v$log;

GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS

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

1        217   52428800          2 INACTIVE

2        218   52428800          2 CURRENT

3        216   52428800          2 INACTIVE

SQL> select * from v$logfile;

GROUP# STATUS  TYPE    MEMBER                                                                           IS_RECOVERY_DEST_FILE

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

3         ONLINE  /u01/oradata/WILSON/onlinelog/o1_mf_3_6bcsqtfj_.log                              NO

3         ONLINE  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_3_6bcsqtwv_.log                  YES

2         ONLINE  /u01/oradata/WILSON/onlinelog/o1_mf_2_6bcsqs3t_.log                              NO

2         ONLINE  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_2_6bcsqstm_.log                  YES

1         ONLINE  /u01/oradata/WILSON/onlinelog/o1_mf_1_6bcsqpty_.log                              NO

1         ONLINE  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_6bcsqqt0_.log                  YES

6 rows selected

ü  添加redo log group

一些场景下,添加redo log group操作,需要指定group的编号和成员文件。

SQL> alter database add logfile (‘/u01/oradata/WILSON/onlinelog/redo4a.log‘, ‘/u01/flash_recovery_area/WILSON/onlinelog/redo4b.log‘) size 10m;

Database altered

SQL>  select group#, sequence#, bytes, members, status from v$log;

GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS

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

1        217   52428800          2 INACTIVE

2        218   52428800          2 CURRENT

3        216   52428800          2 INACTIVE

4          0   10485760          2 UNUSED

SQL> select * from v$logfile;

GROUP# STATUS  TYPE    MEMBER                                                                           IS_RECOVERY_DEST_FILE

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

(篇幅原因,部分省略……)

1         ONLINE  /u01/oradata/WILSON/onlinelog/o1_mf_1_6bcsqpty_.log                              NO

1         ONLINE  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_6bcsqqt0_.log                  YES

4         ONLINE  /u01/oradata/WILSON/onlinelog/redo4a.log                                         NO

4         ONLINE  /u01/flash_recovery_area/WILSON/onlinelog/redo4b.log                             NO

8 rows selected

注意,在10g以后,我们可以借助OMF(Oracle Managed File)对数据文件和日志文件进行透明化管理。Oracle会自动进行路径选择和名字命名。

SQL> alter database add logfile size 10m;

Database altered

SQL> show parameter create

NAME                                 TYPE        VALUE

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

create_bitmap_area_size              integer     8388608

create_stored_outlines               string

db_create_file_dest                  string      /u01/oradata

db_create_online_log_dest_1          string

db_create_online_log_dest_2          string

db_create_online_log_dest_3          string

db_create_online_log_dest_4          string

db_create_online_log_dest_5          string

SQL>  select group#, sequence#, bytes, members, status from v$log;

GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS

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

1        217   52428800          2 INACTIVE

2        218   52428800          2 CURRENT

3        216   52428800          2 INACTIVE

4          0   10485760          2 UNUSED

5          0   10485760          2 UNUSED

SQL> select * from v$logfile;

GROUP# STATUS  TYPE    MEMBER                                                                           IS_RECOVERY_DEST_FILE

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

(篇幅原因,部分省略……)

1         ONLINE  /u01/oradata/WILSON/onlinelog/o1_mf_1_6bcsqpty_.log                              NO

1         ONLINE  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_6bcsqqt0_.log                  YES

4         ONLINE  /u01/oradata/WILSON/onlinelog/redo4a.log                                         NO

4         ONLINE  /u01/flash_recovery_area/WILSON/onlinelog/redo4b.log                             NO

5         ONLINE  /u01/oradata/WILSON/onlinelog/o1_mf_5_7vqh94p2_.log                              NO

5         ONLINE  /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_5_7vqh94t6_.log                  YES

10 rows selected

ü  Active状态日志组解决

在上文中,我们讨论过Active状态下,dbwr还没有将相应的事务数据块写入到DB File中,此时Log Group的状态是Active。将Active状态转变为Inactive的方法,就是手工的进行checkpoint,强制启动dbwr一次写入动作。

--当前是group 4为当前日志;

SQL>  select group#, sequence#, bytes, members, status from v$log;

GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS

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

1        217   52428800          2 INACTIVE

2        218   52428800          2 ACTIVE

3        216   52428800          2 INACTIVE

4        219   10485760          2 CURRENT

5          0   10485760          2 UNUSED

--手工一次切换,形成group 4为active状态;

SQL> alter system switch logfile;

System altered

SQL>  select group#, sequence#, bytes, members, status from v$log;

GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS

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

1        217   52428800          2 INACTIVE

2        218   52428800          2 ACTIVE

3        216   52428800          2 INACTIVE

4        219   10485760          2 ACTIVE

5        220   10485760          2 CURRENT

--写入检查点;

SQL> alter system checkpoint;

System altered

SQL>  select group#, sequence#, bytes, members, status from v$log;

GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS

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

1        217   52428800          2 INACTIVE

2        218   52428800          2 INACTIVE

3        216   52428800          2 INACTIVE

4        219   10485760          2 INACTIVE

5        220   10485760          2 CURRENT

ü  删除redo log group

删除redo log group要有至少两个前提,需要注意:

首先是要保证删除日志组状态为unused或者inactive,否则不能删除。其次是删除后,系统日志组个数不能少于2个。

SQL>  select group#, sequence#, bytes, members, status from v$log;

GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS

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

1        217   52428800          2 INACTIVE

2        218   52428800          2 INACTIVE

3        221   52428800          2 CURRENT

4        219   10485760          2 INACTIVE

5        220   10485760          2 ACTIVE

--ACTIVE状态删除报错。

SQL> alter database drop logfile group 5;

alter database drop logfile group 5

ORA-01624: 日志 5 是紧急恢复实例 wilson (线程 1) 所必需的

ORA-00312: 联机日志 5 线程 1: ‘/u01/oradata/WILSON/onlinelog/o1_mf_5_7vqh94p2_.log‘

ORA-00312: 联机日志 5 线程 1: ‘/u01/flash_recovery_area/WILSON/onlinelog/o1_mf_5_7vqh94t6_.log‘

SQL>  select group#, sequence#, bytes, members, status from v$log;

GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS

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

1        217   52428800          2 INACTIVE

2        218   52428800          2 INACTIVE

3        221   52428800          2 CURRENT

4        219   10485760          2 INACTIVE

5        220   10485760          2 ACTIVE

SQL> alter system checkpoint;

System altered

SQL>  select group#, sequence#, bytes, members, status from v$log;

GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS

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

1        217   52428800          2 INACTIVE

2        218   52428800          2 INACTIVE

3        221   52428800          2 CURRENT

4        219   10485760          2 INACTIVE

5        220   10485760          2 INACTIVE

调整好状态之后,再进行删除。

SQL> alter database drop logfile group 5;

Database altered

SQL>  select group#, sequence#, bytes, members, status from v$log;

GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS

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

1        217   52428800          2 INACTIVE

2        218   52428800          2 INACTIVE

3        221   52428800          2 CURRENT

4        219   10485760          2 INACTIVE

ü  增加redo log group member

直接增加日志组成员的使用几率相对较少,我们一般是一次性直接将成员文件添加完毕。

SQL> alter database add logfile member ‘/u01/oradata/WILSON/onlinelog/redo4c.log‘ to group 4;

Database altered

SQL> select group#, member from v$logfile;

GROUP# MEMBER

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

3 /u01/oradata/WILSON/onlinelog/o1_mf_3_6bcsqtfj_.log

3 /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_3_6bcsqtwv_.log

2 /u01/oradata/WILSON/onlinelog/o1_mf_2_6bcsqs3t_.log

2 /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_2_6bcsqstm_.log

1 /u01/oradata/WILSON/onlinelog/o1_mf_1_6bcsqpty_.log

1 /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_6bcsqqt0_.log

4 /u01/oradata/WILSON/onlinelog/redo4a.log

4 /u01/flash_recovery_area/WILSON/onlinelog/redo4b.log

4 /u01/oradata/WILSON/onlinelog/redo4c.log

9 rows selected

ü  删除redo log group member

删除group member.

SQL> select group#, member from v$logfile;

GROUP# MEMBER

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

3 /u01/oradata/WILSON/onlinelog/o1_mf_3_6bcsqtfj_.log

3 /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_3_6bcsqtwv_.log

2 /u01/oradata/WILSON/onlinelog/o1_mf_2_6bcsqs3t_.log

2 /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_2_6bcsqstm_.log

1 /u01/oradata/WILSON/onlinelog/o1_mf_1_6bcsqpty_.log

1 /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_6bcsqqt0_.log

4 /u01/oradata/WILSON/onlinelog/redo4a.log

4 /u01/flash_recovery_area/WILSON/onlinelog/redo4b.log

4 /u01/oradata/WILSON/onlinelog/redo4c.log

9 rows selected

SQL> alter database drop logfile member ‘/u01/oradata/WILSON/onlinelog/redo4c.log‘;

Database altered

SQL> select group#, member from v$logfile;

GROUP# MEMBER

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

3 /u01/oradata/WILSON/onlinelog/o1_mf_3_6bcsqtfj_.log

3 /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_3_6bcsqtwv_.log

2 /u01/oradata/WILSON/onlinelog/o1_mf_2_6bcsqs3t_.log

2 /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_2_6bcsqstm_.log

1 /u01/oradata/WILSON/onlinelog/o1_mf_1_6bcsqpty_.log

1 /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_6bcsqqt0_.log

4 /u01/oradata/WILSON/onlinelog/redo4a.log

4 /u01/flash_recovery_area/WILSON/onlinelog/redo4b.log

8 rows selected

3、关于redo log sizing

最后聊聊redo log的大小问题。在负载较高和投产的系统中,我们经常会遇到log过小引起的一系列问题。通过AWR报告和alert log,我们都可以发现这种现象的端倪。

如果系统在关键作业时生成的redo size峰值量很高,并且持续很长时间。我们在Alert log上可以看到频繁的online log切换,同时连带出现“check point not complete”或者“could not allocate log sequence”提示。说明日志切换过于频繁。

从AWR报告上,我们主要关注两个与redo log相关的事件:log file parallel write和log file sync。如果两个事件出现在top events中,作为dba和调试人员就需要注意了。

在Oracle的官方资料中,对redo log的大小设置也是以切换频率而定的,要求调整到15-20分钟进行一次切换。调整的手段主要是增加日志组数量和调大日志成员文件大小。这样,都可以给dbwr和arc进程更多的时间在后台进行数据写入和归档。

在实际中,笔者还要建议关注日志组成员的数目,我们对日志采用多路径冗余手段,是为了防止出现单磁盘文件以外损坏。但是,过多的日志成员数目也会带来性能瓶颈。笔者曾见过一个日志组成员数量是10个文件,散布在10个设备上。这样,就意味lgwr要写入十次才能将一个log entry写入,性能可想而知。

在oracle 10g中,官方提供了视图v$instance_recovery,也可以提供一定程度的log大小建议。

SQL>  show parameter fast_start

NAME                                 TYPE        VALUE

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

fast_start_io_target                 integer     0

fast_start_mttr_target               integer     0

fast_start_parallel_rollback         string      LOW

SQL>

SQL> select ACTUAL_REDO_BLKS,TARGET_REDO_BLKS,TARGET_MTTR,ESTIMATED_MTTR,

2      OPTIMAL_LOGFILE_SIZE,CKPT_BLOCK_WRITES  from v$instance_recovery;

ACTUAL_REDO_BLKS TARGET_REDO_BLKS TARGET_MTTR ESTIMATED_MTTR OPTIMAL_LOGFILE_SIZE CKPT_BLOCK_WRITES

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

1768             5174           0             16                                    219

日志切换过于频繁,会引起系统整体的DML操作等待。所以,如果在调优阶段发现这个问题,首先将其解决和缓解,之后再去看其他的一些问题。

最后,关于redo log的生成。我们说,很多时候,DBA看到过于频繁的redo size,不要单方面的想着如何满足这样的量。Redo size是系统进行修改变化操作时候生成的,但是现实中确实存在很多dml操作是没有意义的。所以,要进行详细的分析诊断,和需求设计进行沟通。这样才能最大程度的实现调优。

5、结论

Redo log是Oracle进行还原恢复的一个重要组件。Redo log调整也是DBA的基本技能之一

时间: 2024-09-30 07:22:16

oracle redo log的维护的相关文章

关于oracle redo log buffer 你所不知道的东西

[[email protected] ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Wed Oct 8 09:57:50 2014 Copyright (c) 1982, 2009, Oracle.  All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Prod

Oracle 维护 online redo log

维护在线redo log  Oracle Database - Enterprise Edition - Version 11.2.0.4 to 11.2.0.4       1. 首先查看当前redo log的大小:              [[email protected] ~]$ sqlplus / as sysdba Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production    SQL>

Oracle在线 redo log文件丢失后的恢复

今天一个开发库启动不了了,发过来报错一看是日志文件损坏了(见下图),接着说了一下前因后果.说是年前服务器掉电了,然后就再没有启动起来过.今天有人用才想到要处理. 先说一下大体的思路,如果损坏的redo log是INACTIVE状态的,也就是实例崩溃恢复用不到的redo log,那处理起来比较容易,直接alter database clear logfile group #;或alter database clear unarchived logfile group #;重建日志组就行了.建议重建

oracle redo日志维护

环境 OS:Red Hat Linux As 5 DB:10.2.0.1 1.添加日志组 alter database add logfile group 4 ('/u01/app/oracle/oradata/oracl/redo04.log') size 50m; 2.添加日志组(指定日志已经存在) alter database add logfile group 4 ('/u01/app/oracle/oradata/oracl/redo04.log') size 50m reuse; 3

ORACLE 在线移动redo log路径、删除无效的redo log

移动redo文件路径,默认的redo log文件的路径和archivelog的路径一样,在闪回区,因为闪回区有大小限制,所以redo log和archive log特别是archive log越来越多后,会撑爆闪回区.规范起见,需要将redo log以及archive log放到单独的路径区域里面去. 1,查看现有的redo文件路径 查看现有的redo文件路径,看到默认的在闪回区路径下面: SQL> select member from v$logfile; MEMBER -----------

Oracle更改redo log的大小

因为数据仓库ETL过程中,某个mapping的执行时间超过了一个小时, select event,count(*) fromv$session_wait group by event order bycount(*) desc 发现日志切换占用了大量的时间,估尝试增大redo log的大小. (1) redo log的大小可以影响  DBWR 和 checkpoint : (2)larger redo log files provide better performance. Undersize

oracle联机重做日志文件(online redo log file)

oracle联机重做日志文件(online redo log file几乎所有的发生在oracle的内部变化都记录在online  redo log file中,oracle使用 这些 redo log groups 去恢复数据库,因此它们是非常的重要. 联机重做日志文件的主要工作是:备份数据,1:记录所有的数据改变2:提供了一种恢复机制3:一定是被组织成组的4:至少有两组联机重做日志文件 每一个redo  log 是被分配到 组中, oralce 一次值写一个 online redo log

【oracle】oracledba13 clear the redo log group

A redo log file is corrupted while the database is open; as a con sequence, database operations are stopped because archiving cannot co ntinue. What would you do to solve the problem? A. clear the redo log group B. perform redo log file import C. per

【oracle】oracledba16 The redo log file should belong to an inactive group.

Because of hardware failure, you decided to drop a redo log memb er from the database. Which condition should be met to drop a redo log file? A. The redo log file should belong to an active group. B. The redo log file should belong to an inactive gro