shmall引數設定不當引起資料庫啟動時報out of memory報錯

dawn009發表於2015-09-06

shmall是全部允許使用的共享記憶體大小,單位是頁,可以透過getconf PAGESIZE來獲取每頁的大小,一般為4096位元組
shmmax是單個段允許使用的最大共享記憶體大小
可以使用 ipcs -l 看到shmall,shmmax設定的值。ipcs -u可以看到實際使用的情況。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
oracle@fly007:~> ipcs -l
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 4194304 //shmmax為4G
max total shared memory (kbytes) = 8388608  //shmall為8G
min seg size (bytes) = 1
------ 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
------ Messages: Limits --------
max queues system wide = 16
max size of message (bytes) = 65536
default max size of queue (bytes) = 65536
oracle@fly007:~> ipcs -u
------ Shared Memory Status --------
segments allocated 3
pages allocated 3
pages resident  3
pages swapped   0
Swap performance: 0 attempts     0 successes
------ Semaphore Status --------
used arrays = 4
allocated semaphores = 488
------ Messages: Status --------
allocated queues = 0
used headers = 0

下面為shmall和shmmax引數相關的案例

環境介紹:

1
2
3
作業系統:suse 11 sp1 64bit
資料庫版本:oracle 11g R1 64bit
主機記憶體:94G

      1、主機記憶體94G,更改資料庫的sga_target為40G,重啟資料庫生效該引數,在啟動過程報ORA-27102: out of memory錯誤:

1
2
3
4
5
6
7
8
9
SQL> alter system set sga_target=40G scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device

     2、當前的shmall和shmmax引數設定如下:

1
2
3
fly007:~ #  cat /etc/sysctl.conf | grep -E 'shmall|shmmax'
kernel.shmall = 4194304
kernel.shmmax = 50708928512

     3、shmmax是單個段允許使用的最大共享記憶體大小,單位是位元組,一般shmmax>sga_target的大小,這樣整個sga就在一個共享記憶體段,這是推薦的做法,我們這設定的shmmax為實體記憶體的一半,也就是47G,大於sga_target=40G,該引數設定正確

1
2
3
4
fly007:~ #  cat /etc/sysctl.conf | grep shmmax
kernel.shmmax = 50708928512
fly007:~ #  echo "50708928512/1024/1024/1024" | bc
47

     4、shmall是全部允許使用的共享記憶體大小,注意單位是頁,透過getconf PAGESIZE命令得到每頁的大小為4096位元組,也是就4194304*4096/1024/1024/1024=16G

1
2
3
4
5
6
fly007:~ # getconf PAGESIZE
4096
fly007:~ #  cat /etc/sysctl.conf | grep shmall
kernel.shmall = 4194304
fly007:~ # echo "4194304*4096/1024/1024/1024" | bc
16

    5、全部允許使用的共享記憶體大小為16G<40G,所以啟動資料庫報錯了,shmall引數可以這樣設定,shmall=shmmax/4096=50708928512/4096=12380109
    6、設定shmall引數為12380109,生效該設定,啟動資料庫,正常啟動

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fly007:~ # cat /etc/sysctl.conf | grep shmall
kernel.shmall = 12380109
fly007:~ # sysctl  -p
fly007:~ # su - oracle
oracle@fly007:~> sqlplus /nolog
SQL*Plus: Release 11.1.0.7.0 - Production on Wed Dec 25 23:45:04 2013
Copyright (c) 1982, 2008, Oracle.  All rights reserved.
SQL> conn /as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 4.8103E+10 bytes
Fixed Size                  2170704 bytes
Variable Size            1.9998E+10 bytes
Database Buffers         2.8052E+10 bytes
Redo Buffers               50548736 bytes
Database mounted.
Database opened.
SQL>

    

出處: http://fly007.blog.51cto.com/8301004/1345072

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

相關文章