由于问题引起信号ORA-27154无法启动数据库
測試庫運行startup當系統提示(11.2.0.1):
查詢ORA-27154的錯誤:
| Error: ORA-27154 Text: post/wait create failed --------------------------------------------------------------------------- Cause: internal error, multiple post/wait creates attempted simultaneously Action: check errno and contact Oracle Support |
df查看磁盤空間還有非常多。不存在占滿的情況。
查看報錯中的semget含義:
提示segmet的含義是get a semaphore set identifier,即獲取一個信號量集標識符。說明此錯誤可能和未獲得信號量有關,No space left on device不是指存儲空間,而是指信號量資源。
從MOS的介紹看(949468.1),一系列的報錯出現10.1.0.2到11.2.0.2的范圍內。給出了演示樣例:
$ ipcs -ls
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 100
semaphore max value = 32767
產生的原因是,從原理上看。32000信號量可用。一個信號量標識符能包括最大250個信號量??墒莍pcs命令展示每一個信號量標識符僅能讓Oracle包括最大156個信號量。
$ ipcs << 這個演示樣例中沒有啟動額外實例的前提下,大約包括100個信號量字符集
..
------ Semaphore Arrays --------
key semid owner perms nsems
0x450e15bd 0 root 666 1
0x0000cace 32769 root 666 1
0x358b172c 327683 oracle 660 104
0x9053d038 11075588 oracle 660 156
0x9053d039 11108357 oracle 660 156
0x9053d03a 11141126 oracle 660 156
0x9053d03b 11173895 oracle 660 156
..
那么可用的最大信號量就是156*128=19968。不是32000。
解決方法添加可包括的信號量,這里依據SEMMNI參數來調整設置。
1. 查詢當前kernel的信號量參數值。
# /sbin/sysctl -a | grep sem
2. 改動/etc/sysctl.conf文件的SEMMNI參數。
從kernel.sem = 250 32000 100 128改動為kernel.sem = 250 32000 100 200
3. 使用# /sbin/sysctl -p讓改動生效。
結合到我這里的情況。首先查看ipcs的結果:
數據庫啟動后。須要從操作系統上分配共享內存和信號量。信號量就相當于OS的內存鎖,類似于Oracle的latch(注意Oracle的鎖和latch的差別)。每一個進程須要獲取操作系統內存時,須要先獲得信號量才干申請內存。
從上述指令能夠看到最大可用的信號量是100。信號量標識符集最大是128,呃,這里失誤,當時沒有查看到ipcs實際的信號量標識符集。
這里4個參數的含義:
The maximum number of sempahores that can be in one semaphore set. It should be same size as maximum number of Oracle processes. 一個信號量集中同意的最大信號量數。須要和Oracle的process個數同樣。
SEMMNS????????100 ??????? Defines the maximum semaphores on the system.
This setting is a minimum recommended value, for initial installation only. The SEMMNS parameter should be set to the sum of the PROCESSES parameterfor each Oracle database, adding the largest one twice, and then adding an additional 10 for each database.
系統同意的最大信號量數。SEMMNS參數應設置為最大的PROCESSES值,再加上額外的10,算出來的總和。(注意這里說明該值是最小的建議值)
SEMOPM????????32????????? Defines the maximum number of operations for each semop call
每次信號量調用的最大操作數。
SEMMNI????????128 ??????? Defines the maximum number of semaphore sets in the entire system
系統中信號量集的最大值。
能夠猜測SEMMNS=SEMMSL * SEMMNI。
但上述演示樣例中:100<>100 * 128。SEMMNS最大同意的信號量(建議最小值)僅僅有100。顯然不能滿足計算結果的數量。并且從Oracle官方文檔看到的對于這幾個參數的推薦值:
Configuring Kernel Parameters
Verify that the kernel parameters shown in the following table are set to values greater than or equal to the recommended value shown. The procedure following the table describes how to verify and set the values.
| semmsl semmns semopm semmni | 250 32000 100 128 | /proc/sys/kernel/sem |
進而能夠判斷報錯提示的sskgpcreates可能和process數量有關,kernel中和該值有關的參數是SEMMNS,和上述猜測的結論同樣。即PROCESS過多,但同意的最大信號量過少。兩者不匹配,導致No space left on device提示信號量資源不足。
解決方法如MOS指點的。改動信號量參數值,能夠用:
這樣的方式僅僅是暫時改動,機器重新啟動后失效。若須要持久生效,能夠改動/etc/sysctl.conf相應的參數值。
總結:
1. 錯誤提示No space left on device未必表示存儲空間不足,本例中就是指的信號量資源。
2. kernel.sem中四個參數的含義,以及SEMMNS(同意的最大信號量)=SEMMSL(一個信號量集同意包括的信號量) * SEMMNI(系統同意包括的最大信號量集)的計算關系。還有就是SEMMNS定義的是Defines the maximum semaphores on the system. This setting is a minimum recommended value,for initial installation only. 即同意的最大信號量,但這個值是用于初始安裝的最小推薦值。
3. 借助baidu或google甚至MOS查找問題,可能找到解決方式,但更重要的是可以知道原因。進而了解問題出現的場景。結合自己的問題。確定是同一類之后,再運行操作,一句話:要慎重。
版權聲明:本文博主原創文章。博客,未經同意不得轉載。
轉載于:https://www.cnblogs.com/mengfanrong/p/4851619.html
總結
以上是生活随笔為你收集整理的由于问题引起信号ORA-27154无法启动数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android代码集EditText只要
- 下一篇: linux cmake编译源码,linu