一、什么是REDO LOG
REDOLOG文件是十分重要的文件,它记录了Oracle的所有变化,是数据库实例恢复机制中最为关键的组成部分。
sys@OCM> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
1 1 49 52428800 512 1 YES INACTIVE 2701394 09-3ÔÂ -13 2711001 09-3ÔÂ -13
2 1 50 52428800 512 1 YES INACTIVE 2711001 09-3ÔÂ -13 2732482 10-3ÔÂ -13
3 1 51 52428800 512 1 NO CURRENT 2732482 10-3ÔÂ -13 2.8147E+14
sys@OCM> col member for a50
sys@OCM> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
3 ONLINE /u01/app/oracle/oradata/ocm/redo03.log NO
2 ONLINE /u01/app/oracle/oradata/ocm/redo02.log NO
1 ONLINE /u01/app/oracle/oradata/ocm/redo01.log NO
二、REDO LOG的作用
1、记录ORACLE数据库的变化
2、可以避免数据提交后直接写入数据文件
3、实例恢复和介质恢复
三、REDO LOG的块
1、块的大小
(1)dbfsize redo01.log
(2)SELECT DISTINCT BLOCK_SIZE FROM V$ARCHIVED_LOG;
(3)SELECT MAX(LEBSZ) FROM X$KCCLE;
(4)日志文件头的内容
ALTER SESSION SET EVENTS 'immediate trace name redohdr level 10';
2、REDO的内容
(1)改变矢量(Change Vector)
(2)重做记录(Redo Record)
(3)一条插入的产生的日志
create table t5(id int,name varchar2(100));
select max(ktuxescnw * power(2,32)+ktuxescnb) from x$ktuxe;--[K]ernel [T]ransaction [U]ndo Transa[x]tion Entry
insert into t5 values(1,'AAAAAA');
commit;
select max(ktuxescnw * power(2,32)+ktuxescnb) from x$ktuxe;
alter system dump logfile '/u01/app/oracle/oradata/ocp/redo02.log' scn min 1694394 scn max 1693357;
四、和REDO LOG性能相关的组件
1、记录实例中的数据库变化
2、顺序存取
3、环状的缓冲区
4、LOG_BUFFER定义了缓冲区的大小
(1)9i以前,一般是3M
(2)在10g中ORACLE会自动调整它的值,他遵循这样一个原则,'Fixed SGA Size'+ 'Redo Buffers'是granule size 的整数倍
select * from v$sgainfo where name in ('Fixed SGA Size','Redo Buffers','Granule Size');
--在10.2.0.3 中Log Buffer 默认值是14M,在10.2.0.4中,默认值是15M
select * from v$version where rownum<2;
5、LGWR
(1)、LGWR写的具体过程:
①先尝试获取redo writing latch,确保其他process不会继续触发lgwr(这里可能会产生log file sync等待事件)
②获取redo allocation latch(public redo allocation latch),防止有新的change vector继续写入log buffer,造成LGWR无法确定应该写多少redo
③LGWR确定写的范围(从上次lgwr启动所写的最后一个日志块到这个时间点时的最后一个被使用的所有写满or未写满的日志块)此时前台process仍可以向这个范围内的redo block(buffer)写内容(从PGA写)所以lgwr不阻碍其它进程获得redo copy latch(即:不阻止其它进程向log buffer 中可用块中写change vector)
④确定redo block(buffer)后生成新SCN号
⑤LGWR释放redo allocation latch与redo writing latch
⑥LGWR需要等待 其它进程对要写入日志文件的block的更新操作完成(pga-log buffer的操作),通过判断日志block(buffer)上的redo copy latch是否都释放
⑦将第4步scn号copy到要写入logfile的log buffer的块头里,然后触发物理的写操作,将这些待写日志块写入redo file
(2)LGWR触发写日志的条件:
①LGWR每3秒钟
② commit;
③LOG_BUFFER写入的数量超过LOG BUFFER的1/3
④LOG BUFFER中有超过1M的数据
⑤DBWR写入数据文件之前,DBWR需要写入的数据的SCN大于LGWR记录的SCN,DBWR触LGWR写入(日志优先)
6、REDO LOG组
(1)Oracle循环使用REDO LOG组
(2)REDO LOG组的数量对数据库的影响
①日志切换等待
②系统由于等待日志切换而HANG住
(3)REDO LOG组的数量
①缺省3组(10g)
②根据实际需要设置
③增加日志组的数量对数据库性能无直接影响
④可在线添加日志组
alter database add logfile group 4 '/opt/oracle/oradata/dbtest/redo04_1.log' SIZE 100M
alter database drop logfile group 1;
alter system siwtch logfile;
7、REDO LOG组的镜像
(1)REDO LOG镜像的主要目的是加强REDO LOG的安全性
(2)镜像设置的原则
①同一个数据库中设置镜像的规则应该一致 --不同的日志组设相同的成员
②多个镜像文件应该存放在不同的VG或者文件系统上 --坏一个vg不影响数据库
③不同镜像最好能够分布在不同的磁盘上 --IO
④镜像的数量以一个为宜 --IO
(3)镜像对数据库性能的影响
①REDO LOG镜像会消耗较多的IO资源
②IO性能不佳的系统慎用
③小型写性能不佳的系统慎用
alter database add logfile member '/opt/oracle/oradata/dbtest/redo04_3.log' to group 4
alter database drop logfile member '/u01/app/oracle/oradata/ocp/redo01_2.log';
8、日志切换
(1)日志切换的场景
①当前日志文件满后
②ALTER SYSTEM SWITCH LOGFILE;
③ALTER SYSTEM ARCHIVE LOG CURRENT;--所有实例的当前日志
(2)日志切换的过程
①读控制文件,选择下一个日志文件,并清除控制文件中的相关记录。如果DBW进程正在进行日志切换检查点,或者ARCHn进程正在归档日志内容,那么LGWR会等待这些操作完成才进行日志切换工作。
②把当前没有存盘的所有LOG BUFFER都写入磁盘,然后把最后一个REDO记录的SCN写入LOG文件的头块中。完成这些操作后,LGWR关闭当前的日志文件。
③进行第二次读控制文件,把下一个日志文件的状态设置为CURRENT,老的日志文件修改为ACTIVE。当DBW完成日志切换检查点和归档操作后,这个日志文件的状态会被改为INACTIVE。
④打开新日志文件的所有成员(如果组中有超过1个成员),并在文件头中写入一个新的日志序列号和low SCN。然后修改SGA控制变量,允许生成REDO信息。要注意的是,因为写入文件头的信息包括文件编号,因此写文件头的操作不是并行操作,对于同组的不同成员,写入的数据不是完全一致的。
五、性能相关
1、REDO LOG文件的大小与日志切换
(1)日志切换对系统性能的影响
①日志文件切换时,系统将处于完全的等待状态
②日志文件切换过于频繁,会影响系统的性能
③日志文件切换时间过长,会严重影响系统的性能
(2)日志切换与日志文件的大小
①日志文件越小,日志切换越频繁
②日志文件越大,每个日志文件中包含的变化越多
③日志文件切换以10-30分钟为宜
④日志文件大小一般在100M-2000M之间
(3)问题场景
Thread 1 cannot allocate new log,sequence 69
Checkpoint not complete
current log#2 seq# 68 mem# 0:/oradata/bxdb/redo02.log
等待事件:
log file switch(checkpoint incomplete)
log file switch(archiving needed)
2、等待事件:log file sync
(1)问题场景
发出commit:
开始commit-->logfile sync等待开始--->lgwr开始-->lgwr完成(IO)-->logfile sync等待结束--commit完成
(2)解决方法:
①IO性能来解决这个问题:RAID 5--->RAID 1+0
②加大LOG BUFFER
③减少提交的次数
④把部分经常提交的事务设置为异步提交:ALTER SESSION SET COMMIT_WRITE = NOWAIT;
(3)nologging使用
表空间:1.nologgin,2.force logging
alter tablespace test3 nologging;
create table a(id int) tablespace test3; //test3-->nologging
alter tablespace test3 no force logging;
表:1.no force logging start 2.表本身no logging(alter table a nologging;) 3.使用append插入
insert /*+ append */ into test3 select * from t3;
*************supplemental
select supplemental_log_data_min,supplemental_log_data_pk from v$databae;
alter database add supplemental log data; --rowid
alter database add supplemental log data(primary key) columns; --primary
六、开启归档模式
SELECT log_mode FROM v$database;
ARCHIVE LOG LIST;
alter system set log_archive_dest_1 = 'LOCATION=/u01/app/oracle/archivelog3';
shutdown immediate;
startup mount;
alter database archivelog;
select dest_name,status,archiver,destination,log_sequence,reopen_secs,transmit_mode,process
from v$archive_dest; --归档路径及状态
select name,sequence#,registrar,standby_dest,archived,status from v$archived_log;--从控制文件中获得归档的相关信息
v$log_history --控制文件中日志的历史信息
v$archive_processes --归档相关的后台进程信息
select member,bytes/1024/1024 from v$log a,v$logfile b where a.group#=b.group#;