26、控制檔案相關 -- MAXLOGHISTORY ,control_file_record_keep_time

yyycxhtx發表於2007-08-16
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章