archive log文件大小与redo log文件大小关系探究(一)

2015-07-23 18:07:58 · 作者: · 浏览: 21

引起archive log file就是redo log file大小不一致的原因大致有如下几种:


一、人为操作类型


1、SQL>alter system switch logfile;


2、SQL>alter system archive log current;


3、RMAN>backup archive log all;


4、RMAN>backup database plus archivelog;


二、参数设置类型


archive_lag_target:日志切换的强制时间间隔,即只要到达该参数设置的时间间隔,无论redo 文件是否写满,都会进行日志切换。


三、oracle bug类型


BUG 9272059、BUG 10354739、BUG 12317474、BUG 5450861、BUG 7016254


下面对archive log file就是redo log file大小不一致的原因进行分析,首先,如果redo log file中是以空白结尾,那么,archive log file中会将末尾的空白去除,这就样就会出现archive log比redo log file小,具体小多少,就根据归档时redo log file末尾的空白大小决定。这种情形常见于前面提到的认为操作类型和参数设置类型。因为在进行强制切换日志的时候,redo log file是没有被写满的,文件的末尾必然存在空白。


另外,日志切换并不是发生redo log file 100%满的时候,这是由于oracle的内部算法决定的,这样做的主要目的是处于性能的考虑。所以redo log file始终不会被100%的写满,在进行归档的时候,末尾的空白会被丢弃,所以就导致了archive log file小于redo log file。影响redo log切换时间的因素有:LOG_BUFFER_SIZE参数设置、系统负载、log file size、logfile 空间分配算法。


CUP_COUNT值会影响logfile空间分配算法,所以,如果出现日志频繁切换且归档日志远小于redo log file的情况,请检查CUP_COUNT是否符合系统的实际情况。


再次,如果是RAC环境,如果各节点的负载不一致,为了保证数据库的可恢复性,空闲节点会进行一些的日志切换,主要是为了增进redo 日志的FIRST_CHANGE#,空闲节点产生的归档日志大小会与redo file大小有较大差距。下面进行验证:



--查看redo file大小
?
SQL> select thread#,group#,bytes/1024/1024 "size" from v$log order by 1,2;


? THREAD# GROUP# size


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


? ? 1 1 50


? ? 1 2 50


? ? 2 3 50


? ? 2 4 50


? --在节点1上建立测试表


?SQL> create table darren(id number,item varchar2(2));


?--查看当前的归档情况和redo log的FRIST_CHANGE#


?SQL> select thread#,name,blocks*block_size/1024/1024 "size" from v$archived_log order by 1,2;


? THREAD#? ? ? ? ? ? ? ? ? ? ? ? ? ? NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? size


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


? ? 1? ? ? ? ? +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_10.268.861729569 1.4453125


? ? 1? ? ? ? ? +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_11.270.861730475 49.9980469


? ? 1? ? ? ? ? +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_12.271.861730509 49.9980469


? ? 1? ? ? ? ? +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_13.272.861730545 49.9980469


? ? 1? ? ? ? ? +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_14.274.861730573 49.9980469


? ? 1? ? ? ? ? +DATADG01/gyl/archivelog/2014_10_23/thread_1_seq_15.275.861730601 49.9980469


? ? 1? ? ? ? ? +DATADG01/gyl/archivelog/2014_10_24/thread_1_seq_16.276.861788401 35.8242188


? ? 2? ? ? ? ? +DATADG01/gyl/archivelog/2014_10_23/thread_2_seq_2.269.861729571 2.37207031


? ? 2? ? ? ? ? +DATADG01/gyl/archivelog/2014_10_23/thread_2_seq_3.273.861730551 .008300781


? ? 2? ? ? ? ? +DATADG01/gyl/archivelog/2014_10_24/thread_2_seq_4.277.861788403 .567871094


?SQL> select GROUP#,THREAD#,SEQUENCE#,STATUS,FIRST_CHANGE# from v$log order by 2;


? ? GROUP#? ? THREAD#? SEQUENCE#? ? ? STATUS? ? FIRST_CHANGE#


?---------- ---------- ---------- ---------------- -------------


? ? 1? ? ? ? ? ? 1? ? ? ? 17? ? ? ? ? CURRENT? ? ? ? 794878


? ? 2? ? ? ? ? ? 1? ? ? ? 16? ? ? ? ? INACTIVE? ? ? 700672


? ? 3? ? ? ? ? ? 2? ? ? ? 5? ? ? ? ? CURRENT? ? ? ? 794876


? ? 4? ? ? ? ? ? 2? ? ? ? 4? ? ? ? ? INACTIVE? ? ? 517670


--在节点1上进行事务,由于是测试环境,节点2上完全没事务,是空闲实例


begin


? for i in 1..500000 loop


? insert into darren values(1,'aa');


? commit;


? end loop;


end;


?--查看归档情况和redo log 的FRIST_CHANGE#


SQL> select thread#,name,blocks*block_size/1024/1024 "size" from v$archived_log order by 1,2;


? THREAD#? ? ? ? ? ? ? ? ? ? ? ? ? ? NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? size


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


? ? 1? ? ? +DATADG