AIX系統的非計算記憶體最大值設定過大導致Oracle資料庫有些不能連線上

germany006發表於2016-02-22

錯誤描述:

AIX系統、Oracle資料庫以及其監聽器都沒有做任何的修改,發現連線遠端的資料庫,有時可以連線上,有時連線不上資料庫。

1、連線不上資料庫時:回報ORA-12537:TNS連線己關閉

2、發現alert_SID.log沒有發現錯誤

  3、檢視$ORACLE_HOME/network/log/listener.log日誌錯誤如下:

   25-MAY-2010 18:54:26 * (CONNECT_DATA=(SERVICE_NAME=testoms)(CID=(PROGRAM=D:\專案資料\plsqldev\plsqldev.exe)(HOST=89587D60816246E)(USER=Administrator))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.88.22.77)(PORT=4954)) * establish * testoms * 12518

TNS-12518: TNS:listener could not hand off client connection

 TNS-12547: TNS:lost contact

  TNS-12560: TNS:protocol adapter error

   TNS-00517: Lost contact

    IBM/AIX RISC System/6000 Error: 32: Broken pipe

 

 

原因分析:

連線資料庫,有時可以連線,有時連線不上。

ping 資料庫ip  -t   發現網路很穩定

 

一般出現上面的ora-12537錯誤,一般是因為資料庫的listener.ora檔案沒有配置好,導致這樣的錯誤。但沒有改變過該檔案,原來連線資料庫一直很正常,突然發現有時能連線有時不能連線的現象。

lsnrct status檢視該監聽正常。

 

該庫為測試庫,嘗試了關閉資料庫,再啟動

>shutdown immediate   關閉正常

但啟動時出現下面的錯誤

SQL> startup

Could not load program oracletestoms:

Could not load module /usr/lib/libperfstat.a(shr_64.o).

        Dependent module liblvm.a(shr_64.o) could not be loaded.

Could not load module liblvm.a(shr_64.o).

System error: Not enough space

Could not load module oracle.

        Dependent module /usr/lib/libperfstat.a(shr_64.o) could not be loaded.

Could not load module .

ORA-12547: TNS:lost contact

再次啟動的錯誤又不一樣:

SQL> startup

ORA-00443: background process "MMAN" did not start

 

感到這是AIX系統出現的問題,檢視下交換空間

omstestdb:/> lsps -a

Page Space      Physical Volume   Volume Group    Size %Used Active  Auto  Type

Could not load program /usr/bin/sed:

        Dependent module libc.a(shr.o) could not be loaded.

Could not load module libc.a(shr.o).

Could not load program /usr/bin/awk:

        Dependent module libc.a(shr.o) could not be loaded.

Could not load module libc.a(shr.o).

0517-041 lsps: Cannot list paging space .

 

提示不能列出交換空間的大小,從這可以知道這是由於AIX的記憶體耗盡。

topas 檢視目前的AIX檢視記憶體及其交換空間的使用情況。

AIXcomp(計算記憶體)使用了4 GB,而nocomp(非計算記憶體)也使用了4GB,而交換空間則有很多的空閒。系統總共8GB的記憶體,而oracle中記憶體一般使用comp記憶體。而oracle的快取則使用nocomp,有很多sql語句一直沒有釋放,使用了4GB的記憶體,而AIXnocomp的最大值也為4GB,導致記憶體不足。

 

 

限制AIXnocomp(非計算)記憶體最大值。

AIX

minperm% = 20

maxclient% = 80

maxperm% = 80

 

調整更低。

 

解決步驟:

檢視原來的AIX的minperm%maxclient% maxperm%的值。如下:

Root使用者檢視:

>vmo –a

 

minperm% = 20

maxclient% = 80

maxperm% = 80

 

minperm%設定成10maxclient%設定成20maxperm%設定成20

 

root命令列執行:

1

vmo -p -o minperm%=10

2

vmo -p -o maxclient%=20

3

vmo -p -o maxperm%=20

 

 

執行上面的操作,AIXnocomp還不能釋放記憶體,重啟了AIX系統

# reboot

重啟之後,重啟oracle以及監聽器

SQL>startup

 

$lsnrctl start

 

啟動資料庫及其監聽器均正常,連線資料庫則正常。

 

 

 

備註:

 

minperm  maxperm 引數的值

作業系統透過把在曾經讀寫的記憶體頁留在實記憶體一滿足不同要求。如果檔案頁面在它們的頁幀被重新分配前被請求,那就節省了輸入輸出操作。該檔案頁面可以來自本地的或遠端的(如 NFS)系統。

頁幀使用的檔案相對用於計算的(工作或程式文字)段的檔案的比例是鬆散地受控於 minperm  maxperm 的值的:

如果 RAM 中檔案頁面所佔的百分比高於 maxperm,頁面替換的竊取只用於檔案頁。 

如果 RAM 中檔案頁面所佔的百分比低於 minperm,頁面替換的竊取同時用於檔案頁和計算頁。 

如果 RAM 中檔案頁面所佔的百分比介於 minperm  maxperm之間,頁面替換隻竊取檔案頁,除非檔案頁的重調入數量大於計算頁數。

其中Noncomp20%-80%之間,此時記憶體頁交換演算法通常只交換檔案快取頁,但如果檔案快取頁的交換率大於程式頁時,程式頁也同樣被交換。由於SGA屬於Comp頁,資料檔案快取屬於Noncomp頁,而在資料大量訪問時,檔案快取頁的交換率大於程式頁(SGA),因此大量的SGA頁面被交換;為避免大量SGA頁被交換,需要降低maxperm%值到35%以下,這樣就只有檔案快取頁面被交換,減少了SGA交換的次數。

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

相關文章