關於oracle資料庫訊號量的問題

記錄每一次錯誤發表於2018-12-18

前段時間使用 dbca建立資料庫的時候出現的是建立單例項的介面,把這個問題反饋給oracle 原廠給的反饋是由於  引起的。在硬體是X7-2,軟體版本是18.1.0.0.0 到 18.1.6.0.0之間的版本都有可能出現。

在主機目錄 /opt/OracleHomes/agent_home/agent_inst/sysman/emd/state/fetchlet_state/OSLineToken/parse-log-MLTS-61F17558F73C07A86BC281760F81167A,並且還有,同時 在主機的/var/log/message檢視到有關於kernel的報錯([kernel:.*(error|crit|fatal)])

/var/log/messages contains the following errors:

BROADCOM[32717]: ERROR SemCreate() semget() failed! No space left on device
BROADCOM[32717]: ERROR ngBmapiInitialize() LockCreate() failed!

BROADCOM[32717]: ERROR /usr/share/hwdata/pci.ids file should be updated
BROADCOM[32717]: ERROR GetSriovInfo() fopen() /sys/bus/pci/devices/0000:5e:00.0/virtfn0/uevent failed! 2

In a non-virtualized configuration new database instances fail to start with an error indicating insufficient semaphores, such as the following:

SQL> startup nomount 
ORA-27154: post/wait create failed 
ORA-27300: OS system dependent operation:semget failed with status: 28 
ORA-27301: OS failure message: No space left on device 
ORA-27302: failure occurred at: sskgpcreates

In a virtualized (OVM) configuration OneCommand (OEDA) step "Create Virtual Machine" fails with the following error:

Error: Command [/opt/exadata_ovm/exadata.img.domu_maker start-domain /EXAVMIMAGES/conf/final-vm.xml] run on node n1v1.oracle.com as user root did not execute successfully...
Error running oracle.onecommand.deploy.machines.VmUtils method createVms

/var/log/exadata.img.domu_maker.trc contains the following error:

[WARNING][/opt/exadata_ovm/exadata.img.domu_maker - 6214][exadata_img_domu_maker_start_domain][] [CMD: kpartx -a -v /EXAVMIMAGES/GuestImages/texa2b3npv07adm.de.t-internal.com/System.img] [CMD_STATUS: 3]
----- START STDERR -----
Limit for the maximum number of semaphores reached. You can check and set the limits in /proc/sys/kernel/sem. create/reload failed on loop6p1
Limit for the maximum number of semaphores reached. You can check and set the limits in /proc/sys/kernel/sem. create/reload failed on loop6p2
Limit for the maximum number of semaphores reached. You can check and set the limits in /proc/sys/kernel/sem. create/reload failed on loop6p3


而當我們在安裝oracle資料庫的時候在設定kernel的時候引數是kernel.sem

ORACLE在各作業系統訊號量與共享記憶體的維護,例如一下主機:


kernel.sem=250 32000 100 128

每個訊號物件集的最大訊號物件數;系統範圍內最大訊號物件數;每個訊號物件支援的最大運算元;系統範圍內最大訊號物件集數。

根據相關日誌,我們可以看到訊號量陣列洩漏引起的問題。

這可以透過以 root使用者身份執行以下bash程式碼來確定。

bash程式碼標識已分配程式不再存在的訊號量陣列。

shell指令碼為

# for semid in $(ipcs -s | egrep ' 3[ ]*$' | awk '{print $2}'); do 
for pid in $(ipcs -s -p -i $semid | awk '/^[0-9]/{print $NF}'|sort -u); do 
if ! ps -p $pid >/dev/null 2>&1; then 
echo "safe to remove semid $semid - no pid $pid" 
fi 
done 
done 

輸出結果:

>>>>>>>>>sample output<<<<<<< 
safe to remove semid 98306 - no pid 15494 
safe to remove semid 1703939 - no pid 33680 
safe to remove semid 3309572 - no pid 57755 
safe to remove semid 5373957 - no pid 269913 
safe to remove semid 8814598 - no pid 138286 
safe to remove semid 10878983 - no pid 30220 
safe to remove semid 13860872 - no pid 175465 
safe to remove semid 17301513 - no pid 268284 
safe to remove semid 18907146 - no pid 271790 
safe to remove semid 22347787 - no pid 156966 
safe to remove semid 24412172 - no pid 191491 

如果在您的環境上有類似的輸出,您可以採取下面的解決方案。

透過以根使用者身份執行以下shell指令碼程式碼,刪除洩漏的不再與正在執行的程式關聯的訊號量陣列。在叢集中的所有資料庫伺服器上執行此程式碼。

# for semid in $(ipcs -s | egrep ' 3[ ]*$' | awk '{print $2}'); do 

for pid in $(ipcs -s -p -i $semid | awk '/^[0-9]/{print $NF}'|sort -u); do 

if ! ps -p $pid >/dev/null 2>&1; then 

echo "removing semid $semid" 

ipcrm -s $semid 

fi 

done 

done 

這個適用於 X7資料庫伺服器上洩漏的訊號量陣列導致資料庫例項啟動失敗或OEDA步驟“建立虛擬機器”失敗。metalink文章地址    (  Doc ID 2421498.1  ) 

 


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

相關文章