控制檔案相關 -- MAXLOGHISTORY ,control_file_record_keep_time

tolywang發表於2007-07-26

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,原文地址

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 LevelDump Contains
1only the file header
2just the file header, the database info record, and checkpoint progress records
3all record types, but just the earliest and latest records for circular reuse record types
4as 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.

oradebug setmypid
oradebug dump controlf 3

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.

alter session set events 'immediate trace name controlf level 3';

上面所說的各個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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章