大於2GB的Listener.log和執行超過198天的主機上的Oracle例項
在Oracle業界混的兄弟們肯定聽說過以下的2個傳說:
-
LISTENER.LOG日誌大小不能超過2GB,超過會導致LISTENER監聽器無法處理新的連線
-
Oracle Instance例項所在的主機執行超過198天必須重啟,否則會遇到Oracle BUG
第一條傳說LISTENER.LOG日誌不能超過2GB,這個絕對是老DBA津津樂道要向新手介紹的經典經驗之一,這條傳說帶來的負面思想是Oracle資料庫的監聽器最好不要啟動過長時間,
LISTENER.LOG日誌的內容也要定期清理(這條還是應當推薦的)。
以上這個問題在本世紀初大量32bit OS存在的情況下仍是真理,畢竟在當時2GB的檔案還算是挺大的。
引起該問題的主要原因是大量32bit OS自帶的檔案系統不支援2GB以上的檔案,導致監聽器append write,例如在Solaris 2.6上:
OS Limits
~~~~~~~~~
Release Max file-system size Max OS File size
< Solaris 2.6 1Tb (UFS) 2Gb
> = Solaris 2.6 1Tb (40 bits) 1Tb
在32bit 的Linux上也存在過該2GB檔案大小的限制,具體見:
在AIX 的JFS檔案系統上也存在過類似的2g限制。
[oracle@vrh8 log]$ ls -lh listener.log -rw-r----- 1 oracle oinstall 3.0G Oct 25 07:28 listener.log [oracle@vrh8 log]$ lsnrctl status LSNRCTL for Linux: Version 10.2.0.5.0 - Production on 25-OCT-2012 07:29:44 Copyright (c) 1991, 2010, Oracle. All rights reserved. Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 10.2.0.5.0 - Production Start Date 25-OCT-2012 07:24:59 Uptime 0 days 0 hr. 4 min. 45 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Log File /s01/oracle/product/10.2.0.5/db_1/network/log/listener.log Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=vrh8)(PORT=1521))) Services Summary... Service "G10R25" has 1 instance(s). Instance "G10R25", status READY, has 1 handler(s) for this service... Service "G10R25XDB" has 1 instance(s). Instance "G10R25", status READY, has 1 handler(s) for this service... Service "G10R25_XPT" has 1 instance(s). Instance "G10R25", status READY, has 1 handler(s) for this service... The command completed successfully C:\Users\ML>sqlplus system/oracle@192.168.1.191:1521/G10R25 [oracle@vrh8 log]$ tail -f listener.log 25-OCT-2012 07:31:52 * (CONNECT_DATA=(SERVICE_NAME=G10R25)(CID=(PROGRAM=D:\app\ML\product\11.2.0\dbhome_1\bin\sqlplus.exe)(HOST=XIANGBLI-CN)(USER=ML))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.6)(PORT=56013)) * establish * G10R25 * 0 25-OCT-2012 07:31:55 * service_update * G10R25 * 0 25-OCT-2012 07:32:06 * (CONNECT_DATA=(SERVICE_NAME=G10R25)(CID=(PROGRAM=D:\app\ML\product\11.2.0\dbhome_1\bin\sqlplus.exe)(HOST=XIANGBLI-CN)(USER=ML))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.6)(PORT=56017)) * establish * G10R25 * 0 25-OCT-2012 07:32:10 * service_update * G10R25 * 0 25-OCT-2012 07:32:12 * (CONNECT_DATA=(SERVICE_NAME=G10R25)(CID=(PROGRAM=D:\app\ML\product\11.2.0\dbhome_1\bin\sqlplus.exe)(HOST=XIANGBLI-CN)(USER=ML))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.6)(PORT=56018)) * establish * G10R25 * 0 25-OCT-2012 07:32:13 * service_update * G10R25 * 0 25-OCT-2012 07:32:17 * (CONNECT_DATA=(SERVICE_NAME=G10R25)(CID=(PROGRAM=D:\app\ML\product\11.2.0\dbhome_1\bin\sqlplus.exe)(HOST=XIANGBLI-CN)(USER=ML))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.6)(PORT=56020)) * establish * G10R25 * 0
以上演示用以證明至少在X86-64bit Linux+Oracle 10.2.0.5下不會因為Listener.log超過3GB而導致無法建立連線。 有必要指出的是tnslsnr程式一般使用標準C函式Write寫出到Listener.log,在開啟listener.log檔案時使用的是O_WRONLY|O_CREAT|O_APPEND,O_APPEND即追加到檔案的尾端,一般來說追加寫方式不會因為檔案越大寫地越慢。
access("/etc/listener.ora", F_OK) = -1 ENOENT (No such file or directory)
access("/s01/oracle/product/10.2.0.5/db_1/network/admin/listener.ora", F_OK) = -1 ENOENT (No such file or directory)
open("/s01/oracle/product/10.2.0.5/db_1/network/log/listener.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
fstat(3, {st_mode=S_IFREG|0640, st_size=3145741535, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f60cadc3000
我想說明的是對於 LISTENER.LOG不能超過2GB的這種信仰在10年前是值得推廣的,但是對於現在來說已經過時了,雖然我們仍推薦定期清理 LISTENER.LOG
結論: 除非是老舊的32bit OS,否則一般都不會再有2GB的檔案大小限制(你也可以如此判斷,如果檔案系統上的資料檔案能超過2GB,則自證)
對於LISTENER.LOG不能超過2GB這個故事已經因為作業系統的不斷更新換代而成為傳說。
LISTENER.LOG>2G LIMIT的一些NOTE:
Listener Fails to Start With ORA-12547 or Core Dumps at Start Attempt [ID 237737.1]
Listener hangs due to LISTENER.LOG exceeding 2Gb file size limit on Solaris 2.6 (Doc ID 156098.1)
另一個傳說就是 Oracle例項所在主機不能連續執行超過198或者248/249天的故事,這個故事的起因是有同學在版本10.2.0.1(據說9i上也可能遇到)的一個主機執行198/248/249(24.9)天后OCI Client出現SPIN自旋消耗大量CPU的BUG,SPIN的起因是sltrgatime64()函式對times()函式的死迴圈呼叫;BUG號有《 4612267 OCI client spins when machine uptime >= 249 days》、 《OCI CLIENT IS IN AN INFINITE LOOP WHEN MACHINE UPTIME HITS 248 DAYS》。
這個BUG之所以能讓大家銘記,恐怕與其會因為和主機執行的天數而觸發的特點不無關係; 10.2.0.1是10gR2的base release,又因為國內有大量的企業對資料庫的版本patchset升級不夠重視,所以該BUG在07、08年之前時不時地給業界的朋友帶去困擾。
但實際上該 BUG被發現後,Oracle立即釋出了在10.2.0.1上的one-off patch來解決該問題,而且在後續的10.2.0.2 patchset中也引入了對該BUG的修復,換而言之除非你仍在使用版本10.2.0.1,否則你無需要擔心主機不重啟執行到某一日子會導致Oracle出故障。
雖說該BUG可以透過種種手段修復,乃至若干年後大家開始真正大規模部署或升級到10gR2後(國內大規模用10gR2按照maclean的瞭解在07、08年之後),基本都是安裝base release 10.2.0.1或升級到10.2.0.4/10.2.0.5,部分產品資料庫有還在用10.2.0.2或10.2.0.3的,但是絕大多數(90%以上)重要的資料庫不會用10.2.0.1的情況下,以上這一長串是大背景。
Maclean在行走江湖之際,特別是在運營商那裡, 還是有聽到或是系統整合上、或是運維外包、或是電信業的服務提供商的工程師, 仍在向甲方的同學傳誦這個198/248/249(24.9)天的故事, 而且說起這個故事時繪聲繪色,大有錢鍾書小說裡《圍城》:”李梅亭忙把長沙緊急的訊息告訴寡婦,加油加醬,如火如荼,就彷彿日本軍部給他一個人的機密情報”的風采。
執行超過198天的主機上的Oracle可能遇到BUG導致CPU大量消耗這個傳說,對於版本10.2.0.1來說是不錯的,所以也並不能說這個資訊是不正確的。 但是對於patch set 10.2.0.2以後的版本無需杞人憂天這個問題了,雖然重啟一下主機無傷大雅,但小機畢竟不是Windows,重啟一下多少也要耗些晨光就是了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21302630/viewspace-1571534/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於JSP 例項方法的執行緒安全JS執行緒
- 刪除所有正在執行和退出的docker例項Docker
- 2 Day DBA-管理Oracle例項-關於例項的啟動和關閉-關於例項關閉Oracle
- 2 Day DBA-管理Oracle例項-關於例項的啟動和關閉-關於例項啟動Oracle
- Switch已經執行了2687天 超過了紅白機 成為任天堂壽命最長的主機
- NCF的Dapr應用例項的執行
- Activiti的流程例項【ProcessInstance】與執行例項【Execution】
- 查詢Oracle正在執行和執行過的SQL語句OracleSQL
- dddsample一個可執行的例項
- 關於oracle例項恢復的前滾和回滾的理解Oracle
- 通過paramiko模組在遠端主機上執行命令
- --捕捉執行超過6秒的SQLSQL
- 【Oracle ASM】關於asm例項與db例項中的磁碟狀態_詳細分析過程OracleASM
- 唯一標識 Java 執行的例項Java
- 執行caffe自帶的mnist例項教程
- Oracle例項的啟動和關閉Oracle
- 模擬主執行緒等待子執行緒的過程執行緒
- Docker的通俗理解和透過宿主機埠訪問Redis容器的例項DockerRedis
- oracle:一臺主機多個例項,sqlplus 預設連線到哪個例項的問題OracleSQL
- 執行緒控制時間的隨筆(例項)執行緒
- 【RAC】rac中如何指定job的執行例項
- 關於oracle中大物件處理的一些方法和例項Oracle物件
- AIX V4.3支援超過2GB大檔案AI
- c#通過反射動態執行類的例項及靜態方法C#反射
- 單個指令碼監控主機上所有例項的表空間利用率指令碼
- oracle刪除超過N天資料指令碼的方法Oracle指令碼
- [機器學習]協同過濾演算法的原理和基於Spark 例項機器學習演算法Spark
- Oracle中truncate和delete的區別(例項)Oracledelete
- oracle例項和資料庫的區別Oracle資料庫
- 單例項和RAC打造的ORACLE STREAM(完)單例Oracle
- 單例項和RAC打造的ORACLE STREAM(四)單例Oracle
- 單例項和RAC打造的ORACLE STREAM(三)單例Oracle
- 單例項和RAC打造的ORACLE STREAM(二)單例Oracle
- 單例項和RAC打造的ORACLE STREAM(一)單例Oracle
- Qt中的多執行緒與執行緒池淺析+例項QT執行緒
- Oracle - 執行過的SQL、正在執行的SQL、消耗資源最多的SQLOracleSQL
- ruby中的類例項變數和例項的例項變數變數
- 如何在你的Linux機器上安裝執行OracleLinuxOracle