1.带着问题,跟我来
Questions: redo log 是什么?
redo log 的操作时怎么样进行的,由什么进程触发
redo log 会产生瓶颈吗
redo log 应该如何规划才能避免出现问题
redo log 有哪些状态,哪些状态下的redolog 是可以删除的
2.Redo log概述
Redo log 是recovery (恢复)操作的重要组成部分,它记录了数据库所有change记录。此外,值得一提有,redo thread 和 redo log contents
其中,对于redo threads,每个实例都有自己的redo log threads,单实例下,threads为1,而多实例,譬如RAC环境下,redo log thread为2,redo threads的出现是为了避免并发时多个实例争用redo log,避免出现redo log争用瓶颈。(后面具体讲解:如何有效的避免redo log争用)
对于redo log content,它存储了redo records,每一个redo records就是一个redo entry,redo entries记录也包括了undo segments,因此redo log也能保护rollback数据。
3.Redo log触发
LGWR进程【LGWR是一个日志写进程,他讲日志数据从log buffer cache中取出,并以circual fashion的形式写入redo file中,当一个日志文件被写满以后,oracle触发一个switch动作,使得oracle对另一个redo log file 做写操作,如此循环】的触发,使得redo log buffer中的数据被写到redo log file中,oracle必须保证至少有两个redo log file,且保证一个是可用的,使得另一个可以归档(在归档模式下)
3.1浅谈noarchivelog 与 archivelog 区别
noarchivelog模式下:一个写满的日志文件在将里面的数据change records写到数据文件中后,他就可用了。(联系archivelog模式,有助于理解)
archivelog模式:一个写满的日志文件在将里面的数据change records写到数据文件中后,他同时将这个文件归档(相当于此文件有一副本),且他同时可用。
4.redo log 状态
redo log 有三种状态——current,active,inactive,他们的意义分别是:
current redo log file:代表LGWR正在向redo log中写数据
active redo log file:实例恢复时需要用到此文件
inactive redo log file:实例恢复不需要用到此文件
SQL> select group#,thread#,archived,status from v$log;
GROUP# THREAD# ARC STATUS
---------- ---------- --- ----------------
1 1 NO INACTIVE
2 1 NO INACTIVE
3 1 NO CURRENT
此结果表明:次数据库处于非归档状态下,且目前只有一个thread,总共三个日志组,且每组只有一个redo log file。
5.redo log 规划
两组日志组(至少),且每组两个文件(至少),这两组日志文件的特点是:
同组日志文件大小必须相同,不同组日志文件大小可以不同。
这个规划有利于I/O errors 和 file corruption等好处:当数据库LGWR进程无法写入某个日志文件时,故障发生,这时数据库将这个日志文件标记为invalid,并且将这个错误信息写入LGWR trace文件以及数据库的alter日志中。
那么生产中,redolog 组 和 组大小 分别 设置成多少 比较合理呢?
这个问题,不好说,但是其实也很好说,那就是通过测试,为了确定合理的redolog file数量以及大小,可以通过做一些测试,具体
通过设置不同的日志组数和大小,然后通过查看trace 文件和数据库 alter 日志文件,如果有信息显示LGWR频繁的等待日志组,那么说明日志组归档时间不够,需要增加日志组
6.LGWR 错误产生以及解决办法
7. 其他 操作(重 要)
7.1 删除一个日志组必须注意以下几点:
SELECT GROUP#,ARCHIVED, STATUS FROM V$LOG;
GROUP# ARC STATUS
--------- -------------------
1 YES ACTIVE
2 NO CURRENT
3 YES INACTIVE
4 YES INACTIVE
ALTER DATABASE DROPLOGFILE GROUP 3; 删除日志组3
但是这样并没有删除物理文件,当用OMF时,物理文件就被自动删除。同时,这个删除动作会体现在control file中删除redo logmembers需要注意以下几点:
1、当删除了一个组里面的一个组成员文件后,要立即将其他组里面的日志个数也要调整,不然这个组就失效。
2、当一个组是current 或者valid组是,用alter system switch logfile;(强制归档)
7.2 验证redo log file的块大小
Checksum是oracle来验证redo log files中块大小的依据。
用DB_BLOCK_CHECKSUM=true来开启。
当数据库BLOCK写入到磁盘上面时,oracle计算每个块的checksum
Alter system setdb_BLOCK_CHECKSUM=true;
7.3 redo log 相关视图信息
v$log :从控制文件中显示redo log file信息
v$logfile : 指定redo log 组 和 组状态
v$log_history : 包含log 历史信息
7.4 清除redo log 文件
ALTER DATABASE CLEARLOGFILE GROUP 3;
在不restartdatabase的情况下重新初始化这个日志文件
ALTER DATABASE CLEARUNARCHIVED LOGFILE GROUP 3;
直接删除,不用归档