前言:
Oracle online redo log是Oracle数据库中核心文件之一。在数据库操作中,只要有任何的数据块变化,都会生成相应的redo entry。保证所有的记录先写入redo log后才能写入到数据文件;
说明:
v$log是进行数据库维护的一个重要视图,该视图作为dba管理需要了解的必备知识;
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
相应的参数解读:
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写入操作;
redo group member:由于redo log的重要性,因此在实际的生存环境中一般都进行冗余设置(跟控制文件的冗余作用是一致的)。在每个redo log group中,都有一个或者多个完全相同的log file。在一个组内,log file完全相同,一个写入日志动作要在组内所有的文件上写入成功之后,才算写入完成。所以在生产环境中一般的MEMBERS都设置为2;
2、status表示当前日志的所处状态,常见的有active,current,inactive和unused。
下面详细介绍一下几个状态的含义:
? Current:表示当前正在进行写入的日志组,也是最新的日志组;
? Active:当一个事务完成commit之后,redo entry写入到了日志文件。并且这个日志已经不是当前current,但是对应的数据块data block还没有从buffer cache中写入到文件中。此时,日志组状态为active。处在active状态的日志组,是不能够被覆盖和删除的;
? Inactive:日志并不是当前正在读写的日志,并且对应的事务数据块都已经写回到数据文件中;
? Unused:表示新创建的online日志组,还没有使用过;
常用的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的调整,一定要选择系统相对空闲的时候,避免业务高峰期。特别是生产环境尤其重要。
1、查看当前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
2、添加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
3、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
5、删除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
6、增加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
7、删除redo log 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
redo log sizing:
在生产环境中,redo log的size影响着整个系统的性能, 通过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进程更多的时间在后台进行数据写入和归档。
在实际中,还要建议关注日志组成员的数目,我们对日志采用多路径冗余手段,是为了防止出现单磁盘文件以外损坏。但是,过多的日志成员数目也会带来性能瓶颈;
最后介绍TOAD工具的一个功能,利用该功能可以很好的进行数据库的online redo log的管理;
简单的进行一个截图:
通过这个图可以得到的信息如下:
1、系统运行期间每个小时进行3-4的日志切换,系统正常;
2、每天的00:00-1:00期间可能在跑定时任务(抽数据等操作),归档产生的量很稳定;
3、2013/12/19 20 24 这几天日志产生大量的归档日志,是平常时间点的20倍,DBA需要知道这些时候系统在运行什么操作,产生这么多的归档日志是否正常,如果数据正常情况,建议这些业务操作放在下班时间进行,避免影响其他人员的正常工作;