MAXLOGHISTORY和control_file_record_keep_time这两个参数都和controlfile有关,也都和log file有关。很容易混淆在一起。
如果你对这两个参数有不清楚的地方,希望这篇文章可以扫除你的疑惑。
这两个参数对应于controlfile中不同的section。存放于完全不同的存储空间内。
MAXLOGHISTORY 对应于”LOG HISTORY ” section. 对应于view v$log_history & v$loghist,单位为log的个数
control_file_record_keep_time 对应于”ARCHIVED LOG” section, 对应于view v$archived_log 单位为keep的天数
这里所指的section可以从v$controlfile_record_section中查到
SQL> select TYPE,RECORDS_TOTAL,RECORDS_USED from v$controlfile_record_section
2 where type in (’LOG HISTORY’,'ARCHIVED LOG’);
TYPE RECORDS_TOTAL RECORDS_USED
——————– ————- ————
LOG HISTORY 907 526
ARCHIVED LOG 447 411
MAXLOGHISTORY 定义了controlfile中可以存储多少个log file的信息,可以从v$loghist, v$log_history中查到
control_file_record_keep_time 定义了controlfile中*至少*要keep多少天的archive log信息,可以从v$archived_log中查到。
我们来做下面这个简单的试验,大致可以明白这两个参数的含义
1. 重建controlfile maxloghistory=100, resetlogs open database,设置control_file_record_keep_time=0
SQL> select TYPE,RECORDS_TOTAL,RECORDS_USED from v$controlfile_record_section
2 where type in (’LOG HISTORY’,'ARCHIVED LOG’);
TYPE RECORDS_TOTAL RECORDS_USED
——————– ————- ————
LOG HISTORY 226 0
ARCHIVED LOG 111 0
这时候看到”LOG HISTORY”预先分配了226个record的空间,RECORDS_USED=0
“ARCHIVED LOG”预先分配了111个record的空间, RECORDS_USED=0
这里 “LOG HISTORY”不是如我们设置的maxloghistory=100那样预分配100个record的空间,是因为controlfile中分配空间以 block为单位的,这里block size为8k,一个record的大小为36 bytes,算下来差不多226个,如果你一开始指定maxloghistory=300,那么oracle会分配两个block,”LOG HISTORY”中与分配的RECORD数将为452左右(可能会有细小的误差)。所以更准确的说,创建controlfile时 maxloghistory的值指定了oracle将预分配多少个block给”LOG HISTORY” section
这里”ARCHIVED LOG”预分配了111个record的空间,”ARCHIVE LOG” section一条记录的大小为584bytes, 计算下来大约为8个block
2. 不断的产生archive log,看这两个存储空间如何扩展
SQL> begin
2 for i in 1..300 loop
3 execute immediate ‘alter system archive log current’;
4 end loop;
5 end;
6 /
PL/SQL procedure successfully completed.
在此过程中,一开始, 两者的RECORDS_USED都不断增加,因为有预留的空间可以使用
TYPE RECORDS_TOTAL RECORDS_USED
——————– ————- ————
LOG HISTORY 226 57
ARCHIVED LOG 111 57
当archive log section中RECORDS_USED到达111时,RECORDS_USED停止增加,log history仍然继续增长直到226
TYPE RECORDS_TOTAL RECORDS_USED
——————– ————- ————
LOG HISTORY 226 146
ARCHIVED LOG 111 111
最后300个archive log产生结束后,log history section存储226条信息,archived log存储111条信息,controlfile没有扩展,size保持不变
没有扩展的原因是我们设置了 control_file_record_keep_time=0, controlfile没有必要扩展来保存archive log 信息,所以用完一开始保留的111个slot后就开始循环使用了。
TYPE RECORDS_TOTAL RECORDS_USED
——————– ————- ————
LOG HISTORY 226 226
ARCHIVED LOG 111 111
3.接下来我们设置control_file_record_keep_time=1,继续生成300个archive logs
SQL> alter system set control_file_record_keep_time=1;
System altered.
SQL> begin
2 for i in 1..300 loop
3 execute immediate ‘alter system archive log current’;
4 end loop;
5 end;
6 /
PL/SQL procedure successfully completed.
在此过程中,一开始两个section就同时扩展了,LOG HISTORY section和ARCHIVED LOG section都扩展了到了原来的两倍大小(后面的试验中始终以2的倍数扩展)。controlfile size变大。
这里因为我们需要至少keep一天的archive log信息,所以archived log section自然要进行扩展。又因为这些archive log的信息同时也要在log history section中有记录,所以log history section也进行了扩展。
TYPE RECORDS_TOTAL RECORDS_USED
——————– ————- ————
LOG HISTORY 453 229
ARCHIVED LOG 223 114
两个section的RECORDS_USED持续增长, 当archived log的RECORDS_USED达到223时,这个section进行了第二次扩展,从223扩到了447,扩大到了原来的两倍大小
此时LOG HISTORY section中仍然有空间存放,所以不需要扩展该section
TYPE RECORDS_TOTAL RECORDS_USED
——————– ————- ————
LOG HISTORY 453 350
ARCHIVED LOG 447 235
当LOG HISTORY section中的 RECORDS_USED增长到453时,该section发生了第二次扩展,从453到907,扩大了一倍,此时ARCHIVE LOG section仍然后可用空间,并没有扩展
TYPE RECORDS_TOTAL RECORDS_USED
——————– ————- ————
LOG HISTORY 907 469
ARCHIVED LOG 447 354
所以从上面看出,两个section的扩展并没有什么关系,当自身需要扩展的时候就扩展一倍大小。MAXLOGHISTORY这个参数随着LOG HISTORY section的扩展而变大。
最后有一些常见的问题和解答:
1.为什么v$log_history和v$archived_log中记录数不一样
上面的试验已经解答了这个问题。这两个view对应于不同的东西,在controlfile中的存储空间也不同。
2. 为什么有时v$archived_log的keep的archive log 的天数大于control_file_record_keep_time所指定的天数
这种情况很常见,例如当系统某段时间很繁忙的时候,生成的archive log比较多,这时候为了keep指定天数的archive log,controlfile进行了大量的扩展,这部分空间扩展后不会回缩,而且是以两倍大小来扩展,所以当系统不是很繁忙的时候,就可以keep更多天的数据
control_file_record_keep_time指定的是至少要keep的天数,并不是说v$archived_log之只保留多少天的archive log
3. 为什么创建controlfile时指定的maxloghistory要小于实际的log history section预留的record数
这个问题前面也解释到了。空间分配以block为单位。准确的说创建controlfile时的maxloghistory规定了大致会预留多少个block,一个block大约可以存放226条记录
4. 如何dump controlfile
选自ixora,原文地址 http://www.ixora.com.au/notes/controlfile_dumps.htm
The contents of the current controlfile can be dumped in text form to a process trace file in the user_dump_dest directory using the CONTROLF dump. The levels for this dump are as follows.
Dump Level | Dump Contains |
---|---|
1 | only the file header |
2 | just the file header, the database info record, and checkpoint progress records |
3 | all record types, but just the earliest and latest records for circular reuse record types |
4 | as above, but includes the 4 most recent records for circular reuse record types |
5+ | as above, but the number of circular reuse records included doubles with each level |
For example, the following syntax could be used to get a text dump on the controlfile in the trace file of the current process showing all the controlfile record types but only the oldest and most recent of the circular reuse records.
Of course, the session must be connected AS SYSDBA to use the ORADEBUG facility. However, any session with the ALTER SESSION privilege can use the following event syntax to take the same dump.
上面所说的各个section记录的size就是从dump文件中看出的,我使用的是level 3
***************************************************************************
LOG FILE HISTORY RECORDS
***************************************************************************
(blkno = 0×7b, size = 36, max = 907, in-use = 782, last-recid= 856)
Earliest record:
RECID #75 Recno 756 Record timestamp 08/13/06 23:42:26 Thread=1 Seq#=75 Link-Recid=74
Low scn: 0×0000.01865bef 08/13/06 23:42:26 Next scn: 0×0000.01865bf2
Latest record:
RECID #856 Recno 630 Record timestamp 08/14/06 00:03:45 Thread=1 Seq#=856 Link-Recid=855
Low scn: 0×0000.018665c7 08/14/06 00:03:45 Next scn: 0×0000.018665ca
***************************************************************************
ARCHIVED LOG RECORDS
***************************************************************************
(blkno = 0×86, size = 584, max = 895, in-use = 667, last-recid= 856)
Earliest record:
RECID #190 Recno 863 Record timestamp 08/13/06 23:44:23 Thread=1 Seq#=190
Flags:
Resetlogs scn and time scn: 0×0000.0186593c 08/13/06 23:32:41
filename /oracle/GBPGW/archive/BABY/BABY_190.arc
Low scn: 0×0000.01865d4a 08/13/06 23:44:23 Next scn: 0×0000.01865d4d 08/13/06 23:44:23
Block count=1 Blocksize=512
Latest record:
RECID #856 Recno 634 Record timestamp 08/14/06 00:03:45 Thread=1 Seq#=856
Flags:
Resetlogs scn and time scn: 0×0000.0186593c 08/13/06 23:32:41
filename /oracle/GBPGW/archive/BABY/BABY_856.arc
Low scn: 0×0000.018665c7 08/14/06 00:03:45 Next scn: 0×0000.018665ca 08/14/06 00:03:45
Block count=1 Blocksize=512
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-84826/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-84826/