问题描述:

不知道大家在日常巡检的时候有没有发现这样一个现象,数据库里面的v$archived_log存放记录数在相同的操作系统和相同的版本的数据库下不尽相同,而且存放的时间长短也不同。下面是两个环境的例子:

数据库版本:11.2.0.4,操作系统版本redhat linux6.5

环境一:

archivelog 能打开查看吗 v$archived_log_hive

可以看到v$archived_log保留了22400行记录,保留时间从2018-08-11到2018-09-03

环境二:

archivelog 能打开查看吗 v$archived_log_hive_02

可以看到v$archived_log保留了35217行记录,保留时间从2018-05-03到2018-09-03

是否有参数在对v$archived_log视图保留的记录数进行控制?

问题涉及知识点:

1,首先了解v$archived_log的含义:

V$ARCHIVED_LOG displays archived log information from the control file, including archive log names. An archive log record is inserted after the online redo log is successfully archived or cleared (name column is NULL if the log was cleared). If the log is archived twice, there will be two archived log records with the same THREAD#, SEQUENCE#, and FIRST_CHANGE#, but with a different name. An archive log record is also inserted when an archive log is restored from a backup set or a copy and whenever a copy of a log is made with the RMAN COPY command.

V$ARCHIVED_LOG展示了控制文件当中归档日志的信息,包含归档日志的名字。当联机日志成功归档或者被清理(如果日志被清理了,那么name列为null)后,会插入一条归档记录。如果日志被归档两次,那么将有两条相同的THREAD#, SEQUENCE#, and FIRST_CHANGE#但是不同name的归档记录。当从备份集或者备份副本中恢复归档日志,也会插入归档日志记录。

V$ARCHIVED_LOG是控制文件中归档记录的直接反馈,可以使用alter session set events 'immediate trace name controlf level 3';对控制文件进行dump查看内容。

2,control_file_record_keep_time

CONTROL_FILE_RECORD_KEEP_TIME specifies the minimum number of days before a reusable record in the control file can be reused. In the event a new record needs to be added to a reusable section and the oldest record has not aged enough, the record section expands. If this parameter is set to 0, then reusable sections never expand, and records are reused as needed.

CONTROL_FILE_RECORD_KEEP_TIME指定控制文件中reusable record的最小保留天数。当一条新的记录需要添加到可重用区域时,但是最老的记录并未过时,那么将对可重用区域扩展。如果该参数设置值为0,那么可重用区域永远不会扩展,并且会根据需要重新使用记录。

这里需要注意control_file_record_keep_time是reusable record的最小保留天数,并不是在指定的日期后强制的重用记录。而且该参数仅适用于控制文件中的circularly reusable可循环重用记录,如归档日志记录和各种备份记录。不适用数据文件、表空间、redo thread,除非从表空间中将对象删除,否则这些记录永远不会被reuse。

3,V$CONTROLFILE_RECORD_SECTION

V$CONTROLFILE_RECORD_SECTION displays information about the control file record sections.

V$CONTROLFILE_RECORD_SECTION显示控制文件各个组件的信息

例:

select * from V$CONTROLFILE_RECORD_SECTION where type in ('ARCHIVED LOG');

archivelog 能打开查看吗 v$archived_log_v$archived_log_03

每行记录的大小584bytes,ARCHIVED LOG部件一共分配了4384行记录,已经使用4384行记录。

问题分析:

1,控制文件分配空间以block为单位。

archivelog 能打开查看吗 v$archived_log_hive_04

这里可以看到控制文件一个block大小为16384bytes。默认会先分配一个block存放ARCHIVED LOG,其中一行大小是584bytes,可以存放

28行数据。

2,如果不断产生ARCHIVED LOG,可以看到V$CONTROLFILE_RECORD_SECTION中的records_total(Number of records allocated for the section)会自动扩展的。

begin
for i in 1..10 loop
execute immediate 'alter system archive log current';
end loop;
 end;
  /

archivelog 能打开查看吗 v$archived_log_hive_05

begin
for i in 1..20 loop
execute immediate 'alter system archive log current';
end loop;
 end;
  /

archivelog 能打开查看吗 v$archived_log_hive_06

以次类推可知,如果没有超过七天,归档不断增加,那么控制文件会分配更多的空间用来存储归档的记录。而且分配出来的空间不会回收,归档记录会陆续写满已分配的block。

3,查看超过7天的是否会自动重用

先让脚本归档用到分配的临界值。

archivelog 能打开查看吗 v$archived_log_v$archived_log_07

这里可以看到最早的记录是9月26号,当前是10月05号。超过了control_file_record_keep_time默认天数7。

手动归档日志,看能否重用第一个归档日志

alter system archive log current;

archivelog 能打开查看吗 v$archived_log_控制文件_08

这时我们看到这个记录已经被重用了。但是在物理磁盘上,这个归档日志依然存在。

总结:

在历史的某个时间,数据库产生大量的归档(没有超过七天),控制文件会分配大量的block用于记录archived log的记录。即使之后,每天生成的归档量很少,数据库依然会以历史最大分配的archived log的行数来循环保存archived log。而不是依照control_file_record_keep_time参数设置的7天。