【轉】cannot allocate new log
出現此類錯誤一般操作是新增日誌組或增大日誌檔案,本文描述瞭如何新增日誌組,關於增大日誌檔案瀏覽:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【ASK_ORACLE】檢查點錯誤“Cannot allocate new log”和“Checkpoint not complete”Oracle
- fork failed - Cannot allocate memoryAI
- 關閉tomcat報錯Cannot allocate memoryTomcat
- Redis 寫磁碟出錯 Cannot allocate memoryRedis
- redis : Can't save in background: fork: Cannot allocate memoryRedis
- Ubuntu Cannot allocate memory 錯誤解決方案Ubuntu
- VM warning: INFO: OS::commit_memory Cannot allocate memoryMIT
- ORA-01623: log is current log for thread - cannot dropthread
- 【轉】placement new
- cenots7.6系統報“fork:Cannot allocate memory” 報錯的解決方法(實操)
- ORA-16038: log 3 sequence# 510 cannot be archivedHive
- ORA-16024: parameter LOG_ARCHIVE_DEST_1 cannot be parsedHive
- trick整理:序列二分log^2轉log
- golang,interface轉換型別 cannot convert t (typGolang型別
- enq: TX - allocate ITL entry等待事件分析ENQ事件
- new self()與new static()
- New轉乾坤——雲網融合真正的開啟方式!
- 關於enq: TX - allocate ITL entry等待事件ENQ事件
- New
- JavaScript中的new map()和new set()使用詳細(new map()和new set()的區別)JavaScript
- log1按鈕介質頁面跳轉
- log4j日誌輸出級別(轉)
- 理解new和實現一個new
- (轉載)關於usr/bin/ld: cannot find -lxxx問題總結
- new learn
- a new ideaIdea
- a new blog
- in place new
- [轉帖]Spring事務傳播屬性之REQUIRES_NEW用法SpringUI
- How to Add a New Disk new partition in centos7CentOS
- PHP new self()和new static()的區別PHP
- undo log和redo log
- [20231026]enq TX - allocate ITL entry的測試4.txtENQ
- ERROR: Cannot uninstall ‘PyYAML‘. It is a distutils installed project and thus we cannot accuratelyErrorYAMLProject
- 【Mysql】三大日誌 redo log、bin log、undo logMySql
- javascript 中function(){},new function(),new Function(),Function 摘錄JavaScriptFunction
- new static ,new self ,self::, $this的一些理解
- MySQL error log和bin logMySqlError
- 快速將log4j.xml轉換為logback.xmlXML