【轉】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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Thread 1 cannot allocate new logthread
- cannot allocate new log 的解決方法
- Thread 1 cannot allocate new log,Checkpoint not completethread
- Thread 1 cannot allocate new log, sequence NNN 錯誤thread
- Manual Log Switching Causing Cannot Allocate New Log in Alert Log_435887.1
- Thread 1 cannot allocate new log 的處理辦法thread
- Thread 1 cannot allocate new log Private strand flush not complete 警告thread
- 【ASK_ORACLE】檢查點錯誤“Cannot allocate new log”和“Checkpoint not complete”Oracle
- fork failed - Cannot allocate memoryAI
- Redis 寫磁碟出錯 Cannot allocate memoryRedis
- redis 寫磁碟出錯Cannot allocate memoryRedis
- Ubuntu Cannot allocate memory 錯誤解決方案Ubuntu
- redis : Can't save in background: fork: Cannot allocate memoryRedis
- VM warning: INFO: OS::commit_memory Cannot allocate memoryMIT
- 解決Can not allocate log問題的方法
- ora-01034 ora-27121 Cannot allocate memory錯誤解決
- 【轉】placement new
- cenots7.6系統報“fork:Cannot allocate memory” 報錯的解決方法(實操)
- We Boost the Adoption of New Technology
- Cannot complete applications logonAPPGo
- The New C++ (轉)C++
- Dialogue: New Chapter in the History of ComputingAPT
- ORA-01623: log is current log for thread - cannot dropthread
- ORA-27102:out of memory Linux-x86_64 Error: 12: Cannot allocate memory的處理LinuxError
- 一腳踢掉NEW (轉)
- ALLOCATE CHANNEL FOR MAINTENANCE 命令AINaN
- windows(10)執行laravel new blog出錯WindowsLaravel
- Login Oracle Instance Even When sysdba Cannot Do SoOracle
- Allocate More Space for a Database (37)Database
- ORA-16019: cannot use LOG_ARCHIVE_DEST_1 with LOG_ARCHIVE_DESTHive
- First blog for Technology Of my own ,new world rules coming up next~
- 【oracle】ORA-16038: log 2 sequence# 98 cannot be archivedOracleHive
- 轉:malloc VS new, free VS deletedelete
- enq: TX - allocate ITL entryENQ
- New redo log sizing advisor in Oracle10gOracle
- ORA-00265: instance recovery required, cannot set ARCHIVELOGUIHive
- What's New in the JMF 2.0 Reference Implementations (轉)
- How To Move Datafiles On AIX Using Raw Logical Volumes To A New Location?AI