Oracle 28056錯誤表示一個用戶已經超出了連接時間限制,達到了最大連接時間,并被系統剔除了,下面我們來詳細了解這個錯誤。
當用戶登錄Oracle數據庫時,系統會給他分配一個資源限制,包括CPU,內存,I/O等等。其中,與連接時間相關的資源設置就是profile里的idle_time,這個參數指定了用戶在空閑狀態下(沒有提交任何查詢)能夠維持的最長時間。如果用戶在這段時間內什么操作都沒有進行,那么他會被強制下線,工作進程會收到 SIGUSR2 信號,服務端日志會報 ORA-28056 錯誤:
ORA-28056: 會話已超時。 會話超時 會話編號: 3402,用 戶: HR。 事件世 間 = 16850227 =100秒,IDLE 時間 = 1010 =17 分鐘 上次每秒集中則活動秒數= 0 上次集中被動活動秒數= 1010 行動: 會話會自動斷開。
通過這個錯誤信息可以得知,HR 用戶的會話因為 idle 時間過長而被斷開,從而導致會話終止。我們可以根據反饋中的工作進程和日志中記錄的會話信息,手動比對登錄時間和 idle 時間,從而定位是哪個用戶受到了連接時間的限制。
實際上,在Oracle 11g之前,沒辦法判斷在客戶端是否執行了close連接的操作, Oracle服務器既要限制連接時間,又要分辨查找到IDLE連接(客戶端程序在keep-alive而不向oracle發送命令)。
在oracle 11g中,有了一個新特性,終止不活躍的數據庫會話(有客戶端程序在keep-alive而未向oracle發送命令),以更好地管理資源。 這個新特性強制要求數據庫中所有的賬戶在啟動過程中都要指定資源, 如果在資源使用過程中超過預先規定的控制級別,則會話將自動中斷以釋放資源。
當然,在開發階段中,我們可以通過設置SQLNET.EXPIRE_TIME參數為自動斷開所有會話之前的空閑時間長度(單位為分鐘),從而在會話空閑的時候自動判斷,并且自動斷開空閑時間在超過Expiry Timeout Time值的會話。
因此,在Oracle開發過程當中,我們通常需要控制好會話連接的時間,避免出現太多長時間的空閑會話,導致服務器資源得不到有效的利用,這也是我們DBA日常維護的一個重要的點。