ORA-27102: out of memory Linux-X86_64 Error: 28: No space left on device

xiexingzhi發表於2012-10-30
一個庫需要調整記憶體引數
alter system set pga_aggregate_target=2G scope=spfile;
alter system set sga_max_size=10G scope=spfile;
alter system set sga_target=10G scope=spfile;
調整完之後,重啟
SQL> startup
ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device


原值:
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
調整後:
kernel.shmall = 2147483648        -----設定為pga的大小
kernel.shmmax = 8589934592     -----建議實體記憶體的一半
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128


分享一些關於oracle的linux引數:

設定的引數

引數名字含義設定
設定共享記憶體
共享記憶體通過將通用的結構和資料放在共享記憶體段中,使得程式可以對它們進行訪問。這是現有最快的程式間通訊(IPC)方式 主要是因為資料在程式之間傳遞時沒有涉及到核心的操作。在程式之間不需要複製資料。
Oracle 將共享記憶體用於它的系統全域性區 (SGA),這是一個由所有的 Oracle 備份程式及前臺程式所共享的記憶體區域。為 SGA 分配足夠的容量對於 Oracle 的效能非常重要,因為它負責儲存資料庫緩衝區快取記憶體、共享 SQL、訪問路徑以及更多。
要確定所有共享記憶體的限制,可使用以下命令:
# ipcs -lm
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 32768
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1
SHMMAX
SHMMAX 引數定義共享記憶體段的最大大小(以位元組為單位)。
Oracle SGA 由共享記憶體組成,且錯誤設定 SHMMAX 可能會限制 SGA 的大小。在設定 SHMMAX 時,切記 SGA 的大小應該適合於一個共享記憶體段。SHMMAX 設定不足可能會導致以下問題:
ORA-27123:unable to attach to shared memory segment
您可以通過執行以下命令來確定 SHMMAX 的值:
# cat /proc/sys/kernel/shmmax
33554432
SHMMAX 的預設值為 32MB。通常,這個值對於配置 Oracle SGA 而言太小了。我通常使用以下任一方法將 SHMMAX 引數設定為 2GB
通過直接更改 /proc 檔案系統,你無需重新啟動計算機便可以改變 SHMMAX 的預設設定。可以使用以下方法動態設定SHMMAX 的值。通過將此命令置於 /etc/rc.local 啟動檔案中可以使它永久有效:
# echo "2147483648" > /proc/sys/kernel/shmmax
您還可以使用 sysctl 命令來更改 SHMMAX 的值:
# sysctl -w kernel.shmmax=2147483648
最後,通過將該核心引數插入到 /etc/sysctl.conf 啟動檔案中,您可以使這種更改永久有效:
# echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf
SHMMNI
我們現在看一下 SHMMNI 引數。這個核心引數用於設定系統範圍內共享記憶體段的最大數量。該引數的預設值是4096。該值足以滿足需要,因此通常無需更改。
可以通過執行以下命令來確定 SHMMNI 的值:
# cat /proc/sys/kernel/shmmni
4096
SHMALL
該引數控制系統一次可以使用的共享記憶體總量(以頁為單位)
簡言之,該引數的值始終應至少為:
ceil(SHMMAX/PAGE_SIZE)
SHMALL 的預設大小為 2097152,並可以使用以下命令進行查詢:
# cat /proc/sys/kernel/shmall
2097152
SHMALL 的預設設定足以滿足 Oracle RAC 10g 安裝的需要。
(注意:i386 平臺上的 Red Hat Linux 中的頁面大小為 4,096位元組。但您可以使用 bigpages,它支援配置更大的記憶體頁面大小。)
設定訊號
對訊號的最佳描述是,它是用於在共享資源(如共享記憶體)的程式(或程式中的執行緒)之間提供同步的計數器。Unix System V 支援訊號集,其中的每個訊號都是一個訊號計數。當應用程式請求訊號時,它使用“集合”來完成此工作。
要確定所有訊號限制,可使用以下命令:
# ipcs -ls
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
您還可以使用以下命令:
# cat /proc/sys/kernel/sem
250 32000 32 128
SEMMSL
SEMMSL 核心引數用於控制每個訊號集合的最大訊號數。
Oracle 建議將 SEMMSL 設定為 init.ora 檔案(適用於 Linux系統上所有資料庫)中的最大 PROCESS 例項引數設定再加上10。此外,Oracle 建議將 SEMMSL 設定為不小於 100
SEMMNI
SEMMNI 核心引數用於控制整個 Linux 系統中訊號集的最大數量。
Oracle 建議將 SEMMNI 設定為不小於 100
SEMMNS
SEMMNS 核心引數用於控制整個 Linux 系統中的訊號(而非訊號集)的最大數量
Oracle 建議將 SEMMNS 設定為系統上每個資料庫的PROCESSES 例項引數設定之和,加上最大的 PROCESSES 的兩倍,最後為系統上的每個 Oracle 資料庫加上 10
使用以下計算式確定可以在 Linux 系統上分配的訊號的最大數量。它將是以下兩者中較小的一個值:
SEMMNS    (SEMMSL * SEMMNI) 
SEMOPM
SEMOPM 核心引數用於控制每個 semop 系統呼叫可以執行的訊號運算元。
semop 系統呼叫(函式)能夠使用一個 semop 系統呼叫完成多個訊號的操作。一個訊號集可以擁有每個訊號集中最大數量的SEMMSL,因此建議將 SEMOPM 設定為等於 SEMMSL
Oracle 建議將 SEMOPM 設定為不小於 100
設定訊號核心引數
我想更改(增加)的唯一引數是 SEMOPM。所有其他的預設設定可以完全滿足我們的示例安裝。
您可以通過直接更改 /proc 檔案系統,不必重新啟動機器而更改所有訊號設定的預設設定。該方法將以下內容置於 /etc/rc.local 啟動檔案中:
# echo "250 32000 100 128" > /proc/sys/kernel/sem
您還可以使用 sysctl 命令來更改所有訊號設定的值:
# sysctl -w kernel.sem="250 32000 100 128"
最後,可以通過將核心引數插入到 /etc/sysctl.conf 啟動檔案中以使此更改永久有效:
# echo "kernel.sem=250 32000 100 128" >> /etc/sysctl.conf
設定檔案控制程式碼
配置 Red Hat Linux 伺服器時,必須確保最大檔案控制程式碼數足夠大。檔案控制程式碼的設定表示您在Linux 系統上可以開啟的檔案數。
使用以下命令來確定整個系統中檔案控制程式碼的最大數量:
# cat /proc/sys/fs/file-max
32768
Oracle 建議將整個系統的檔案控制程式碼值至少設定為 65536
通過直接更改 /proc 檔案系統,您可以不必重新啟動機器而改變檔案控制程式碼最大數量的預設設定。該方法將以下內容置於 /etc/rc.local 啟動檔案中:
# echo "65536" > /proc/sys/fs/file-max
您還可以使用 sysctl 命令來更改 SHMMAX 的值:
# sysctl -w fs.file-max=65536
最後,可以通過將核心引數插入到 /etc/sysctl.conf 啟動檔案中以使此更改永久有效:
# echo "fs.file-max=65536" >> /etc/sysctl.conf
可以通過使用以下命令查詢檔案控制程式碼的當前使用情況:
# cat /proc/sys/fs/file-nr
613 95 32768
file-nr 檔案顯示了三個引數:分配的檔案控制程式碼總數、當前使用的檔案控制程式碼數以及可以分配的最大檔案控制程式碼數。
(注意:如果需要增大 /proc/sys/fs/file-max 中的值,請確保正確設定 ulimit。對於 2.4.20,通常將其設定為 unlimited。使用 ulimit 命令來驗證 ulimit 設定:
# ulimit
unlimited

如何設定

1. 通過在/etc/sysctl.conf中配置
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
修改後執行sysctl -p 命令使得核心改變立即生效。以後重啟機器也會按照這些配置修改機器環境
2. /etc/rc.d/rc.local中直接寫入/proc中去/etc/rc.d/rc.local檔案的最後,加入
echo 8192 > /proc/sys/fs/file-max
echo 32768 > /proc/sys/fs/inode-max
echo 536870912 > /proc/sys/kernel/shmmax
echo 4096 > /proc/sys/kernel/shmmin
還需要在/etc/security/limits.conf檔案增加如下內容:
oracle soft nofile 65536
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384

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

相關文章