ITPub博客

首页 > IT基础架构 > 网络安全 > 26、控制文件相关 -- MAXLOGHISTORY ,control_file_record_keep_time

26、控制文件相关 -- MAXLOGHISTORY ,control_file_record_keep_time

原创 网络安全 作者:yyycxhtx 时间:2007-08-16 16:02:34 0 删除 编辑
MAXLOGHISTORY和control_file_record_keep_time这两个参数都和controlfile有关,也都和log file有关。很容易混淆在一起。[@more@]

如果你对这两个参数有不清楚的地方,希望这篇文章可以扫除你的疑惑。

这两个参数对应于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

Control File是二进制文件,用普通的方法很难知道其中到底保存了什么内容,但是Oracle却提供了一个SQL*PLUS命令来将Control File的内容dump到文本文件中。
方法如下: 以SYSDBA身份登入SQL*PLUS
SQL> oradebug setmypid
SQL> oradebug dump controlf 3
将把control file dump到USER_DUMP_DEST初始化参数指定的目录下。
其中3为dump level。 level的解释如下:
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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/248644/viewspace-962097/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    39
  • 访问量
    58535