【轉】cannot allocate new log

ljm0211發表於2012-06-20

出現此類錯誤一般操作是新增日誌組或增大日誌檔案,本文描述瞭如何新增日誌組,關於增大日誌檔案瀏覽:

  1月10、12日某電信公司發生oracle當機事故,alert檔案中報告如下錯誤:
Fri Jan 12 04:07:49 2007
Thread 1 cannot allocate new log, sequence 187398
Checkpoint not complete

產生此問題的原因分析:

CKPT這個後臺程式的就是做checkpoint這件事,checkpoint被觸發的條件之一是就發生redo log switch,Checkpoint的具體工作包括:
• 觸發DBWn向磁碟寫入Dirty data。
• 把checkpoint資訊更新到datafile header上。
• 把checkpoint資訊更新到control file裡。

Checkpoint做的事情之一是觸發DBWn把buffer cache中的Dirty cache磁碟。另外就是把最近的系統的SCN更新到datafile header和control file(每一個事務都有一個SCN),做第一件事的目的是為了減少由於系統突然當機而需要的恢復時間,做第二件事實為了保證資料庫的一致性。   而redo log switch就是觸發checkpoint的主要的事件(event) ,當第一組redo log被用完之後,Oracle就要停止使用當前的redo log,轉而使用另一組redo log,這就叫做log switch。而log switch觸發checkpoint。   Oracle要求的最少的redo group 的是2個,但我們一般都建議配置3個或3個以上redo log group。假設我們只有兩個redo log group:group 1和group 2,並且系統中總是有大量的dirty block需要寫入datafile,當我們從group 1 switch to group 2的時候,會觸發checkpoint, checkpoint要求DBWn把buffer cache中的dirty block寫入datafile,然而,當我們再次用完group 2裡面的空間,需要再次switch to group 1並重用group 1的時候,如果我們發現redo log group 1所保護的那些dirty block還沒有完全寫入到datafile,整個資料庫必須等待DBWn把所有的dirty block寫入到datafile之後才能做其他的事情,這就是我們遇到的“checkpoint not complete”問題。這個問題往往暗示了redo log的配置有問題,就本例而言,要麼是redo log太小,要麼是像我們這裡的redo log group太少,只有2個。而這個問題的解決方案就是加大redo log或新增更多redo log group,不管哪一種解決方案,我們的目的都是給DBWn爭取更多的時間。

問題的解決辦法:

此係統當前配置6組logfile,每組有兩個成員,大小為50M,建議將log更改為200-500M的大小。

經查詢(如下)每天日誌switch數量大致在100-120之間,高峰時超出500多(此處必須得考慮業務突然繁忙的時刻,從中我們可以看出,1月12日switch數量是505,剛好是當機的那一天),需要最佳化:

Number of Date Switches Redo Size

-------------------- -------- ---------

23-NOV-06 44   2,200

24-NOV-06 111 5,550

25-NOV-06 112 5,600

26-NOV-06 110 5,500

27-NOV-06 109 5,450

28-NOV-06 114 5,700

29-NOV-06 124 6,200

30-NOV-06 107 5,350

01-DEC-06 113 5,650

02-DEC-06 103 5,150

03-DEC-06 103 5,150

04-DEC-06 104 5,200

05-DEC-06 103 5,150

06-DEC-06 105 5,250

07-DEC-06 111 5,550

08-DEC-06 108 5,400

09-DEC-06 110 5,500

10-DEC-06 107 5,350

11-DEC-06 108 5,400

12-DEC-06 113 5,650

13-DEC-06 107 5,350

14-DEC-06 118 5,900

15-DEC-06 109 5,450

16-DEC-06 111 5,550

17-DEC-06 112 5,600

18-DEC-06 106 5,300

19-DEC-06 108 5,400

20-DEC-06 105 5,250

21-DEC-06 116 5,800

22-DEC-06 122 6,100

23-DEC-06 110 5,500

24-DEC-06 122 6,100

25-DEC-06 125 6,250

26-DEC-06 117 5,850

27-DEC-06 110 5,500

28-DEC-06 114 5,700

29-DEC-06 112 5,600

30-DEC-06 115 5,750

31-DEC-06 128 6,400

01-JAN-07 127 6,350

02-JAN-07 104 5,200

03-JAN-07 101 5,050

04-JAN-07 111 5,550

05-JAN-07 122 6,100

06-JAN-07 114 5,700

07-JAN-07 107 5,350

08-JAN-07 110 5,500

09-JAN-07 110 5,500

10-JAN-07 82 4,100

11-JAN-07 180 9,000

12-JAN-07 505 25,250

13-JAN-07 506 25,300

14-JAN-07 444 22,200

15-JAN-07 108 5,400

16-JAN-07 120 6,000

17-JAN-07 115 5,750

18-JAN-07 128 6,400

19-JAN-07 124 6,200

20-JAN-07 118 5,900

21-JAN-07 123 6,150

22-JAN-07 117 5,850

23-JAN-07 119 5,950

24-JAN-07 113 5,650

25-JAN-07 113 5,650

26-JAN-07 115 5,750

27-JAN-07 127 6,350

28-JAN-07 111 5,550

29-JAN-07 112 5,600

30-JAN-07 76   3,800

-------- ---------

sum      8848 442,400

就本機而言,建議只更改redo log的大小即可,更改大小為200M。

當前log資訊如下:

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS

----------   ----------  ----------     ----------    ---------- --- ----- -----------

1 1 190547    52428800 2 YES INACTIVE

2 1 190548    52428800 2 YES INACTIVE

3 1 190549    52428800 2 YES INACTIVE

4 1 190546    52428800 2 YES INACTIVE

5 1 190550    52428800 2 NO CURRENT

6 1 190545    52428800 2 YES INACTIVE

6 rows selected.

SQL> select member from v$logfile;

MEMBER

-----------------------------------------

/opt/oracle/db02/oradata/ORCL/redo01.log

/opt/oracle/db03/oradata/ORCL/redo01.log

/opt/oracle/db02/oradata/ORCL/redo02.log

/opt/oracle/db03/oradata/ORCL/redo02.log

/opt/oracle/db02/oradata/ORCL/redo03.log

/opt/oracle/db03/oradata/ORCL/redo03.log

/opt/oracle/db02/oradata/ORCL/redo04.log

/opt/oracle/db03/oradata/ORCL/redo04.log

/opt/oracle/db02/oradata/ORCL/redo05.log

/opt/oracle/db03/oradata/ORCL/redo05.log

/opt/oracle/db02/oradata/ORCL/redo06.log

/opt/oracle/db03/oradata/ORCL/redo06.log

12 rows selected.

此oracle的LOG大小為50M,共6組,每組有兩個成員,分別位於/opt/oracle/db02和/opt/oracle/db03目錄。

查詢空間利用情況:

df –k查詢這兩個目錄的空間利用情況:

所處盤區 kbytes 已使用    剩餘空間大小 已使用百分比

/opt/oracle/db02 51200000     12900020    35906297     27%

/opt/oracle/db03  2048000 343661 1597823 18%

建議更改大小之後的redo log及其member仍然放在原來所處盤區/opt/oracle/db02、/opt/oracle/db03,/opt/oracle/db02剩餘空間足夠大,不必擔心,而/opt/oracle/db03則至少需200M*6=1.2G,也不必擔心,至少原來member所佔用空間還可以重新利用!

1、 查詢如下語句:

select * from v$log;

       GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS

----------   ----------  ----------     ----------    ---------- --- ----- -----------

1 1 190547    52428800 2 YES INACTIVE

2 1 190548    52428800 2 NO CURRENT

3 1 190549    52428800 2 YES INACTIVE

4 1 190546    52428800 2 YES INACTIVE

5 1 190550    52428800 2 YES INACTIVE

     6 1 190545    52428800 2 YES INACTIVE

2、   建議先查詢並將用alter system switch logfile手工切換日誌組,例如CURRENT在第二組,這樣我可以先刪除第六組,再重新建立第六組日誌,大小為200M,這樣做的原因是日誌是按照順序來使用的,而第一組日誌歸檔時是需要幾秒鐘的,很快。

SQL> alter database drop logfile group 6;

手動刪除第六組日誌及成員檔案:

SQL>! rm /opt/oracle/db02/oradata/ORCL/redo06.log

SQL>! rm /opt/oracle/db03/oradata/ORCL/redo06.log

  接下來重新建立第六組,這裡要注意,大小不是原來的50M,而是200M:

SQL> alter database add logfile group 6 '/opt/oracle/db02/oradata/ORCL/redo06.log' size 200m;

SQL> alter database add logfile member '/opt/oracle/db03/oradata/ORCL/redo06.log' to group 6;

3、 接下來將CURRENT切換至第三組,並刪除第一組:

SQL> alter database drop logfile group 1;

手動刪除第一組日誌及成員檔案:

SQL>! rm /opt/oracle/db02/oradata/ORCL/redo01.log

SQL>! rm /opt/oracle/db03/oradata/ORCL/redo01.log

接下來重新建立第一組,大小為200M:

SQL> alter database add logfile group 1 '/opt/oracle/db02/oradata/ORCL/redo01.log' size 200m;

SQL> alter database add logfile member '/opt/oracle/db03/oradata/ORCL/redo01.log' to group 6;

  4、接下來將CURRENT切換至第四組,並刪除第二組,方法跟上面兩個一樣,直至將所有的日誌組及成員全部更改為200M大小。

5、 做完後再查詢如下語句進行確認無誤

SQL> select * from v$log;

SQL> select member from v$logfile;

注:這些步驟可以線上做,沒有必要擔心資料庫出現問題,但建議避免業務高峰期,並且此問題必須儘快解決為好!

修改後問題解決。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11411056/viewspace-733406/,如需轉載,請註明出處,否則將追究法律責任。

相關文章