ipcs、ipcrm、sysresv、kernel.shmmax
Tags: ipcrmipcskernel.shmmaxOraclesysresv
ipcs、ipcrm、sysresv、kernel.shmmax
前言部分
导读和注意事项
各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:
① ipcs的使用
② ipcrm释放oracle内存段
③ sysresv的使用
④ 内核参数kernel.shmmax
⑤ 如何快速的清理Oracle的进程
⑥ 其它维护操作
本文简介
最近有朋友因为kernel.shmmax内核参数的问题导致数据库不能启动。小麦苗之前碰到过一次,只是没有记录下来,而且以前安装数据库的时候也没有详细介绍这几个参数的含义,趁这次机会就把这个参数在详细介绍一下吧。
ipcs/ipcrm命令
unix/linux下的共享内存、信号量、队列信息管理
在Unix或Linux下,经常有因为共享内存、信号量,队列等共享信息没有干净地清除而引起一些问题。
查看共享内存的命令是:ipcs [-m|-s|-q]。若ipcs命令不带参数,则默认会列出共享内存、信号量,队列信息,而-m列出共享内存,-s列出共享信号量,-q列出共享队列。
清除命令是:ipcrm [-m|-s|-q] id,其中,-m删除共享内存,-s删除共享信号量,-q删除共享队列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [oracle@rhel6lhr ~]$ ipcs -h ipcs provides information on ipc facilities for which you have read access. Resource Specification: -m : shared_mem -q : messages -s : semaphores -a : all (default) Output Format: -t : time -p : pid -c : creator -l : limits -u : summary -i id [-s -q -m] : details on resource identified by id usage : ipcs -asmq -tclup ipcs [-s -m -q] -i id ipcs -h for help. |
ipcs
1. 命令格式
ipcs [resource-option] [output-format]
ipcs [resource-option] -i id
2. 命令功能
提供IPC设备的信息
3. 使用方法
resource选项:
ipcs -m 查看系统共享内存信息
ipcs -q 查看系统消息队列信息
ipcs -s 查看系统信号量信息
ipcs [-a] 系统默认输出信息,显示系统内所有的IPC信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [martin@localhost data]$ ipcs -a ------ Message Queues -------- key msqid owner perms used-bytes messages ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 229376 martin 600 4194304 2 dest 0x00000000 196609 martin 600 524288 2 dest 0x00000000 327682 martin 600 393216 2 dest 0x00000000 491525 martin 600 2097152 2 dest ------ Semaphore Arrays -------- key semid owner perms nsems |
输出格式控制:
ipcs -c 查看IPC的创建者和所有者
ipcs -l 查看IPC资源的限制信息
ipcs -p 查看IPC资源的创建者和使用的进程ID
ipcs -t 查看最新调用IPC资源的详细时间
ipcs -u 查看IPC资源状态汇总信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [martin@localhost data]$ ipcs -u --human ------ Messages Status -------- allocated queues = 0 used headers = 0 used space = 0B ------ Shared Memory Status -------- segments allocated 4 pages allocated 1760 pages resident 339 pages swapped 0 Swap performance: 0 attempts 0 successes ------ Semaphore Status -------- used arrays = 0 allocated semaphores = 0 |
额外格式控制:
ipcs -l --human
以人类可以阅读的方式显示size
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 30 31 32 33 34 35 36 37 38 39 40 | [martin@localhost data]$ ipcs -l --human ------ Messages Limits -------- max queues system wide = 3644 max size of message = 8K default max size of queue = 16K ------ Shared Memory Limits -------- max number of segments = 4096 max seg size = 16E max total shared memory = 16E min seg size = 1B ------ 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 = 3276 [oracle@rhel6lhr ~]$ ipcs -l ------ Shared Memory Limits -------- max number of segments = 4096 max seg size (kbytes) = 98442 max total shared memory (kbytes) = 3221512 min seg size (bytes) = 1 ------ Semaphore Limits -------- max number of arrays = 2048 max semaphores per array = 250 max semaphores system wide = 256000 max ops per semop call = 100 semaphore max value = 32767 ------ Messages: Limits -------- max queues system wide = 7643 max size of message (bytes) = 65536 default max size of queue (bytes) = 65536 |
ipcrm
1. 命令功能
通过指定ID删除删除IPC资源,同时将与IPC对象关联的数据一并删除,只有超级用户或IPC资源创建者能够删除
2. 使用方法
ipcrm -M shmkey
移除用shmkey创建的共享内存段
ipcrm -m shmid
移除用shmid标识的共享内存段
ipcrm -S semkey
移除用semkey创建的信号量
ipcrm -s semid
移除用semid标识的信号量
ipcrm -Q msgkey
移除用msgkey创建的消息队列
ipcrm -q msgid
移除用msgid标识的消息队列
如何快速的清理Oracle的进程?
- 如何快速的清理Oracle的进程?
答案:若想要快速清理掉Oracle的进程,则最直接的办法是杀pmon进程。有如下3条命令可供选择,其中加粗的orcl替换成ORACLE_SID的值即可。
1 2 3 4 | kill -9 `ps -ef|grep orcl| grep -v grep | awk '{print $2}'` ps -ef |grep orcl|grep -v grep|awk '{print $2}' | xargs kill -9 ipcs -m | grep oracle | awk '{print $2}' | xargs ipcrm shm |
若想要快速杀掉集群的进程,则可以执行如下命令:
1 2 | kill -9 `ps -ef|grep d.bin| grep -v grep | awk '{print $2}'` |
注意,生产库上严禁使用,否则可能导致集群不能正常启动。
sysresv命令
若是一个主机上有多个oracle实例的话该如何确定哪个共享内存段属于我们该清掉的oracle实例的内存段?
答案:使用sysresv命令。sysresv是Oracle在Linux/Unix平台提供的工具,用来查看Oracle实例使用的共享内存和信号量等信息。sysresv存放的路径:$ORACLE_HOME/bin/sysresv。使用时需要设置LD_LIBRARY_PATH环境变量,用来告诉Oracle共享库文件的位置。sysresv用法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [oracle@rhel6lhr ~]$ sysresv -h sysresv: invalid option -- 'h' usage : sysresv [-if] [-d <on/off>] [-l sid1 <sid2> ...] -i : Prompt before removing ipc resources for each sid -f : Remove ipc resources silently, oevrrides -i option -d <on/off> : List ipc resources for each sid if on -l sid1 <sid2> .. : apply sysresv to each sid Default : sysresv -d on -l $ORACLE_SID Note : ipc resources will be attempted to be deleted for a sid only if there is no currently running instance with that sid. [oracle@rhel6lhr ~]$ which sysresv /u01/app/oracle/product/11.2.0/dbhome_1/bin/sysresv |
来看一下简单使用:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | oracle@sunvs-b@/oracle/oracle $ uname -a SunOS sunvs-b 5.10 Generic_139555-08 sun4u sparc SUNW,Sun-Fire-480R oracle@sunvs-b@/oracle/oracle $ ps -ef|grep pmon oracle 26257 1 0 5月 24 ? 140:42 ora_pmon_H2 oracle 15479 14078 0 14:01:36 pts/4 0:00 grep pmon oracle 12449 1 0 8月 17 ? 17:44 ora_pmon_U2 oracle@sunvs-b@/oracle/oracle $ sysresv -l H2 IPC Resources for ORACLE_SID "H2" : Shared Memory: ID KEY 1979711594 0x00000000 1979711595 0x00000000 1979711596 0x00000000 1979711597 0xce653c24 Semaphores: ID KEY 16777316 0x25393874 Oracle Instance alive for sid "H2" oracle@sunvs-b@/oracle/oracle $ ipcs -ms IPC status from <running system> as of 2011年08月29日 星期一 14时11分51秒 CST T ID KEY MODE OWNER GROUP Shared Memory: m 1577058426 0xf5649758 --rw-r----- oracle oinstall m 1577058425 0 --rw-r----- oracle oinstall m 1577058424 0 --rw-r----- oracle oinstall m 1577058423 0 --rw-r----- oracle oinstall m 1979711605 0x4e65af --rw-r--r-- oracle oinstall m 1979711604 0x3e65af --rw-r--r-- oracle oinstall m 1979711603 0x1e65af --rw-r--r-- oracle oinstall m 1979711602 0xe65af --rw-r--r-- oracle oinstall m 1979711597 0xce653c24 --rw-r----- oracle oinstall m 1979711596 0 --rw-r----- oracle oinstall m 1979711595 0 --rw-r----- oracle oinstall m 1979711594 0 --rw-r----- oracle oinstall m 1979711511 0x31f4002 --rw-rw-rw- cupsz cupucuse m 754974788 0xc93f --rw-rw-rw- hsm1 cupucuse m 754974787 0xc93e --rw-rw-rw- hsm1 cupucuse m 754974786 0xc93d --rw-rw-rw- hsm1 cupucuse m 754974785 0xc93c --rw-rw-rw- hsm1 cupucuse m 754974784 0xc93b --rw-rw-rw- hsm1 cupucuse m 754974783 0xc93a --rw-rw-rw- hsm1 cupucuse m 754974782 0xc939 --rw-rw-rw- hsm1 cupucuse m 754974781 0xc938 --rw-rw-rw- hsm1 cupucuse m 754974780 0xc937 --rw-rw-rw- hsm1 cupucuse m 754974779 0xc936 --rw-rw-rw- hsm1 cupucuse m 754974778 0xc935 --rw-rw-rw- hsm1 cupucuse m 754974777 0xc934 --rw-rw-rw- hsm1 cupucuse m 754974776 0xc933 --rw-rw-rw- hsm1 cupucuse m 754974775 0xc932 --rw-rw-rw- hsm1 cupucuse m 754974774 0xc930 --rw-rw-rw- hsm1 cupucuse m 754974773 0xc92f --rw-rw-rw- hsm1 cupucuse m 754974772 0xc92e --rw-rw-rw- hsm1 cupucuse m 754974771 0xc92d --rw-rw-rw- hsm1 cupucuse m 754974770 0xc931 --rw-rw-rw- hsm1 cupucuse m 45 0x741cc1a6 --rw-rw-rw- root root m 44 0x741cc1a5 --rw-rw-rw- root root m 43 0x741cc1a4 --rw-rw-rw- root root m 42 0x741cc1a3 --rw-rw-rw- root root m 41 0x741cc1a2 --rw-rw-rw- root root m 40 0x741cc1a1 --rw-rw-rw- root root m 39 0x741cc1a0 --rw-rw-rw- root root m 37 0x435dce60 --rw-rw-rw- root root m 0 0x22bb --rw-rw---- root dba Semaphores: s 16777324 0x25393ad4 --ra-r----- oracle oinstall s 16777320 0x1e65af --ra-ra-ra- oracle oinstall s 16777319 0xe65af --ra-ra-ra- oracle oinstall s 16777316 0x25393874 --ra-r----- oracle oinstall s 16777296 0 --ra-ra-ra- cupst cupucuse s 16777294 0 --ra-ra-ra- cupst cupucuse s 16777289 0 --ra-ra-ra- cuput cupucuse s 16777287 0 --ra-ra-ra- cuput cupucuse s 16777282 0 --ra-ra-ra- cupvip cupucuse s 16777280 0 --ra-ra-ra- cupvip cupucuse s 16777279 0 --ra-ra-ra- cupfb cupucuse s 16777277 0 --ra-ra-ra- cupfb cupucuse s 16777268 0 --ra-ra-ra- cupuc cupucuse s 16777266 0 --ra-ra-ra- cupuc cupucuse s 16777261 0 --ra-ra-ra- cuphx cupucuse s 16777259 0 --ra-ra-ra- cuphx cupucuse s 16777258 0 --ra-ra-ra- cupsz cupucuse s 16777256 0 --ra-ra-ra- cupsz cupucuse s 1 0x55064bec --ra-r--r-- root root s 0 0x710644ac --ra-ra-ra- root root |
说明一下:在安装ORACLE产品前,需要设置系统的共享内存段的最大值和个数限制,实例在启动后,应尽量保证SGA在一个共享内存段上,这里由于我是在RAC的一个节点上进行的测试,所以实例内存被分配到4个共享内存段上。
IPC的清理可以使用sysresv –if,如果实例正在运行,清理操作会被终止:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | oracle@sunvs-b@/oracle/oracle $ sysresv -fi -l H2 IPC Resources for ORACLE_SID "H2" : Shared Memory: ID KEY 1979711594 0x00000000 1979711595 0x00000000 1979711596 0x00000000 1979711597 0xce653c24 Semaphores: ID KEY 16777316 0x25393874 Oracle Instance alive for sid "H2" SYSRESV-005: Warning Instance maybe alive - aborting remove for sid "H2" |
另外如果需要清理内存段和信号量,而sysresv发现实例是alive的,可以使用ipcrm命令:
1 2 3 4 | ipcrm -m <memid> ipcrm -s <semid> |
实验
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | [ZFXDESKDB2:oracle]:/oracle>ps -ef|grep ora_pmon_ oracle 12255344 21626964 0 17:43:01 pts/0 0:00 grep ora_pmon_ oracle 17629238 1 0 18:57:42 - 0:09 ora_pmon_raclhr2 oracle 20250806 1 0 18:57:42 - 0:10 ora_pmon_oraESKDB2 [ZFXDESKDB2:oracle]:/oracle>which sysresv /oracle/app/oracle/product/11.2.0/db/bin/sysresv [ZFXDESKDB2:oracle]:/oracle>ORACLE_SID=raclhr2 [ZFXDESKDB2:oracle]:/oracle>sysresv IPC Resources for ORACLE_SID "raclhr2" : Shared Memory: ID KEY 5242886 0xffffffff 5242883 0xffffffff 1048583 0xd92489e0 Oracle Instance alive for sid "raclhr2" [ZFXDESKDB2:oracle]:/oracle>ipcs IPC status from /dev/mem as of Wed Jun 1 17:43:47 BEIST 2016 T ID KEY MODE OWNER GROUP Message Queues: q 0 0x9283a0d2 -Rrw------- root system q 1 0xffffffff ----------- root system Shared Memory: m 1048576 00000000 --rw-r----- grid dba m 1048577 00000000 --rw-r----- grid dba m 1048578 0x210000aa --rw-rw---- root system m 5242883 00000000 --rw-r----- oracle asmadmin m 1048580 00000000 --rw-r----- oracle asmadmin m 1048581 00000000 --rw-r----- oracle asmadmin m 5242886 00000000 --rw-r----- oracle asmadmin m 1048583 0xd92489e0 --rw-r----- oracle asmadmin m 1048584 0xd1a4a5d8 --rw-r----- grid dba m 8388617 0x3f516768 --rw-r----- oracle asmadmin m 759169034 0x21000148 --rw-rw---- oracle dba Semaphores: s 3145728 0x0100324a --ra-ra-r-- root system s 1 0x620025b4 --ra-r--r-- root system s 2 0x02001958 --ra-ra-ra- root system s 3 0x01001958 --ra-ra-ra- root system s 9 0x010024be --ra------- root system s 1048590 0x410000a8 --ra-ra---- root system s 11534361 0x41000147 --ra-ra---- oracle dba [ZFXDESKDB2:oracle]:/oracle>ipcs -m IPC status from /dev/mem as of Wed Jun 1 17:43:56 BEIST 2016 T ID KEY MODE OWNER GROUP Shared Memory: m 1048576 00000000 --rw-r----- grid dba m 1048577 00000000 --rw-r----- grid dba m 1048578 0x210000aa --rw-rw---- root system m 5242883 00000000 --rw-r----- oracle asmadmin m 1048580 00000000 --rw-r----- oracle asmadmin m 1048581 00000000 --rw-r----- oracle asmadmin m 5242886 00000000 --rw-r----- oracle asmadmin m 1048583 0xd92489e0 --rw-r----- oracle asmadmin m 1048584 0xd1a4a5d8 --rw-r----- grid dba m 8388617 0x3f516768 --rw-r----- oracle asmadmin m 759169034 0x21000148 --rw-rw---- oracle dba [ZFXDESKDB2:oracle]:/oracle>ipcrm -m 5242886 [ZFXDESKDB2:oracle]:/oracle>ipcrm -m 5242883 [ZFXDESKDB2:oracle]:/oracle>ipcrm -m 1048583 [ZFXDESKDB2:oracle]:/oracle>sysresv IPC Resources for ORACLE_SID "raclhr2" : Shared Memory ID KEY No shared memory segments used Oracle Instance not alive for sid "raclhr2" Oracle Instance not alive for sid "raclhr2" [ZFXDESKDB2:oracle]:/oracle>ps -ef|grep ora_pmon_ oracle 17629238 1 0 18:57:42 - 0:09 ora_pmon_raclhr2 oracle 20250806 1 0 18:57:42 - 0:10 ora_pmon_oraESKDB2 oracle 23330844 21626964 0 17:44:46 pts/0 0:00 grep ora_pmon_ [ZFXDESKDB2:oracle]:/oracle>sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed Jun 1 17:44:52 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to an idle instance. SYS@raclhr2> shutdown abort ORACLE instance shut down. SYS@raclhr2> exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options |
Oracle内核参数
查看:more /proc/sys/kernel/shmmax
临时生效:echo 3145728 > /proc/sys/kernel/shmmax
永久生效,修改文件:/etc/sysctl.conf,并使修改参数立即生效:/sbin/sysctl -p
重要的几个参数如下所示:
1 2 3 4 5 | kernel.shmall = 2097152 kernel.shmmax = 1054472192 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 |
其含义分别如下所示:
kernel.shmall = 2097152 # kernel.shmall参数是控制共享内存页数。Linux 共享内存页大小为4KB,共享内存段的大小都是共享内存页大小的整数倍。如果一个共享内存段的最大大小是16G,那么需要共享内存页数是 16GB/4KB = 16777216KB/4KB = 4194304(页),也就是64Bit系统下16GB物理内存,设置kernel.shmall = 4194304才符合要求(几乎是原来设置2097152的两倍)。简言之,该参数的值始终应该至少为: ceil(SHMMAX/PAGE_SIZE)。这个值太小有可能导致数据库启动报错(ORA-27102: out of memory)。
kernel.shmmax = 1054472192 #定义一个内存段最大可以分配的内存空间,单位为字节。如果定义太小,那么会导致启动实例失败,或者SGA就会被分配到多个共享内存段。那么内存中的指针连接会给系统带来一定的开销,从而降低系统性能。这个值的设置应该大于SGA_MAX_TARGET或MEMORY_MAX_TARGET的值,最大值可以设置成大于或等于实际的物理内存。如果kernel.shmmax为100M,sga_max_size为500M,那么启动Oracle实例至少会分配5个共享内存段;如果设置kernel.shmmax为2G,sga_max_size为500M,那么启动Oracle实例只需要分配1个共享内存段。
kernel.shmmni = 4096 #设置系统级最大共享内存段数量,该参数的默认值是4096。这一数值已经足够,通常不需要更改。。
kernel.sem = 250 32000 100 128 #信号灯的相关配置,信号灯semaphores是进程或线程间访问共享内存时提供同步的计数器。可以通过命令“cat /proc/sys/kernel/sem”来查看当前信号灯的参数配置,如下所示:
123[root@edsir4p1 ~]# cat /proc/sys/kernel/sem250 32000 100 128
其4个值的含义分别如下:
- 250表示SEMMSL,设置每个信号灯组中信号灯最大数量,推荐的最小值是250。对于系统中存在大量并发连接的系统,推荐将这个值设置为PROCESSES初始化参数加10。
- 32000表示SEMMNS,设置系统中信号灯的最大数量。操作系统在分配信号灯时不会超过LEAST(SEMMNS,SEMMSL*SEMMNI)。事实上,如果SEMMNS的值超过了SEMMSL*SEMMNI是非法的,因此推荐SEMMNS的值就设置为SEMMSL*SEMMNI。Oracle推荐SEMMNS的设置不小于32000。
- 100表示SEMOPM,设置每次系统调用可以同时执行的最大信号灯操作的数量。由于一个信号灯组最多拥有SEMMSL个信号灯,因此有推荐将SEMOPM设置为SEMMSL的值。Oracle验证的10.2和11.1的SEMOPM的配置为100。
- 128表示SEMMNI,设置系统中信号灯组的最大数量。Oracle10g和11g的推荐值为142。
kernel.shmmax参数
实验1
下面临时设置kernel.shmmax为3M,会导致Oracle不能启动,设置sqlplus不能进入:
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 30 31 32 33 | [root@edsir4p1 ~]# echo 3145728 > /proc/sys/kernel/shmmax <<<==== 临时设置3M [oracle@edsir4p1- ~]$ more /proc/sys/kernel/shmmax <<<==== 查看是否生效 3145728 [root@edsir4p1 ~]# /sbin/sysctl -a | grep shm vm.hugetlb_shm_group = 0 kernel.shmmni = 4096 kernel.shmall = 2097152 kernel.shmmax = 3145728 [root@edsir4p1 ~]# more /etc/sysctl.conf | grep kernel.shm kernel.shmall = 2097152 kernel.shmmax = 2147483648 kernel.shmmni = 4096 [root@edsir4p1 ~]# su - oracle [oracle@edsir4p1- ~]$ . PROD1_env [oracle@edsir4p1-PROD1 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Tue Nov 14 10:09:08 2017 Copyright (c) 1982, 2009, Oracle. All rights reserved. ERROR: ORA-12547: TNS:lost contact Enter user-name: [oracle@edsir4p1-PROD1 ~]$ oerr ora 12547 12547, 00000, "TNS:lost contact" // *Cause: Partner has unexpectedly gone away, usually during process // startup. // *Action: Investigate partner application for abnormal termination. On an // Interchange, this can happen if the machine is overloaded. |
告警日志:
1 2 3 4 5 6 7 8 | Linux Error: 32: Broken pipe Tue Nov 14 10:00:38 2017 14-NOV-2017 10:00:38 * (CONNECT_DATA=(SID=PROD1)(CID=(PROGRAM=emagent)(HOST=edsir4p1.us.oracle.com)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.190.104.111)(PORT=26305)) * establish * PROD1 * 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 Linux Error: 32: Broken pipe |
或启动报错:
1 2 3 4 5 6 | SYS@PROD1> startup ORA-00443: background process "PMON" did not start SYS@PROD1> startup ORA-12547: TNS:lost contact SYS@PROD1> |
有关“TNS-12518: TNS:listener could not hand off client connection”的更多内容请参考:
【故障|监听】TNS-12518、TNS-00517和 Linux Error:32:Broken pipe:http://blog.itpub.net/26736162/viewspace-2135468/
实验2
下面临时设置kernel.shmmax为100M,sga_max_size为500M,则至少需要5个共享内存段,查看临时段的个数:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | [root@edsir4p1 ~]# echo 104857600 > /proc/sys/kernel/shmmax [root@edsir4p1 ~]# more /proc/sys/kernel/shmmax 104857600 [root@edsir4p1 ~]# su - oracle [oracle@edsir4p1- ~]$ . PROD1_env [oracle@edsir4p1-PROD1 ~]$ sysresv IPC Resources for ORACLE_SID "PROD1" : Shared Memory ID KEY No shared memory segments used<<<==== 无实例的共享内存段 Semaphores: ID KEY 98304 0xa3dda878 Oracle Instance not alive for sid "PROD1" [oracle@edsir4p1-PROD1 ~]$ ipcs ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 32768 vncuser 644 790528 2 dest 0x00000000 65537 vncuser 644 790528 2 dest 0x00000000 98306 vncuser 644 790528 2 dest ------ Semaphore Arrays -------- key semid owner perms nsems 0xa3dda878 98304 oracle 660 154 ------ Message Queues -------- key msqid owner perms used-bytes messages [oracle@edsir4p1-PROD1 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Tue Nov 14 10:29:07 2017 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to an idle instance. SYS@PROD1> startup ORACLE instance started. Total System Global Area 313860096 bytes Fixed Size 1336232 bytes Variable Size 251661400 bytes Database Buffers 54525952 bytes Redo Buffers 6336512 bytes Database mounted. Database opened. SYS@PROD1> show parameter sga NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 500M sga_target big integer 300M SYS@PROD1> exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options [oracle@edsir4p1-PROD1 dbs]$ [oracle@edsir4p1-PROD1 ~]$ sysresv IPC Resources for ORACLE_SID "PROD1" : Shared Memory: ID KEY 1245194 0x00000000 1277963 0x00000000 1310732 0x00000000 1343501 0x00000000 1376270 0x00000000 1409039 0x90c3be20 Semaphores: ID KEY 917504 0xa3dda878 Oracle Instance alive for sid "PROD1" [oracle@edsir4p1-PROD1 ~]$ ipcs ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 32768 vncuser 644 790528 2 dest 0x00000000 65537 vncuser 644 790528 2 dest 0x00000000 98306 vncuser 644 790528 2 dest 0x00000000 1245194 oracle 660 8388608 30 <<<==== 该共享内存段为8M 0x00000000 1277963 oracle 660 104857600 30 0x00000000 1310732 oracle 660 104857600 30 0x00000000 1343501 oracle 660 104857600 30 0x00000000 1376270 oracle 660 104857600 30 0x90c3be20 1409039 oracle 660 100663296 30 <<<==== 每个共享内存段为100M ------ Semaphore Arrays -------- key semid owner perms nsems 0xa3dda878 917504 oracle 660 154 ------ Message Queues -------- key msqid owner perms used-bytes messages |
下面临时设置kernel.shmmax为2G,sga_max_size为500M,则只需要1个共享内存段,查看临时段的个数:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | [oracle@edsir4p1-PROD1 ~]$ ss SQL*Plus: Release 11.2.0.1.0 Production on Tue Nov 14 10:49:21 2017 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SYS@PROD1> select 2*1024*1024*1024 from dual; 2*1024*1024*1024 ---------------- 2147483648 SYS@PROD1> exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options [oracle@edsir4p1-PROD1 ~]$ sudo echo 2147483648 > /proc/sys/kernel/shmmax -bash: /proc/sys/kernel/shmmax: Permission denied [oracle@edsir4p1-PROD1 ~]$ su - root Password: [root@edsir4p1 ~]# echo 2147483648 > /proc/sys/kernel/shmmax [root@edsir4p1 ~]# exit logout [oracle@edsir4p1-PROD1 ~]$ ipcs -m ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 32768 vncuser 644 790528 2 dest 0x00000000 65537 vncuser 644 790528 2 dest 0x00000000 98306 vncuser 644 790528 2 dest 0x00000000 1245194 oracle 660 8388608 30 0x00000000 1277963 oracle 660 104857600 30 0x00000000 1310732 oracle 660 104857600 30 0x00000000 1343501 oracle 660 104857600 30 0x00000000 1376270 oracle 660 104857600 30 0x90c3be20 1409039 oracle 660 100663296 30 <<<==== 需要重启数据库,重新分配共享内存段 [oracle@edsir4p1-PROD1 ~]$ ss SQL*Plus: Release 11.2.0.1.0 Production on Tue Nov 14 10:50:23 2017 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SYS@PROD1> startup force ORACLE instance started. Total System Global Area 523108352 bytes Fixed Size 1337632 bytes Variable Size 343934688 bytes Database Buffers 171966464 bytes Redo Buffers 5869568 bytes Database mounted. Database opened. SYS@PROD1> exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options [oracle@edsir4p1-PROD1 ~]$ sysresv IPC Resources for ORACLE_SID "PROD1" : Shared Memory: ID KEY 1474570 0x90c3be20 Semaphores: ID KEY 1081344 0xa3dda878 Oracle Instance alive for sid "PROD1" [oracle@edsir4p1-PROD1 ~]$ ipcs ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 32768 vncuser 644 790528 2 dest 0x00000000 65537 vncuser 644 790528 2 dest 0x00000000 98306 vncuser 644 790528 2 dest 0x90c3be20 1474570 oracle 660 528482304 31 <<<====共享内存段为500M ------ Semaphore Arrays -------- key semid owner perms nsems 0xa3dda878 1081344 oracle 660 154 ------ Message Queues -------- key msqid owner perms used-bytes messages |
kernel.shmall
该参数设置过小,有可能导致数据库启动报错。很多人调整系统内核参数的时候只关注SHMMAX参数,而忽略了SHMALL参数的设置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [root@edsir4p1 ~]# echo 10 > /proc/sys/kernel/shmall [root@edsir4p1 ~]# [root@edsir4p1 ~]# [root@edsir4p1 ~]# [root@edsir4p1 ~]# [root@edsir4p1 ~]# more /proc/sys/kernel/shmall 10 [oracle@edsir4p1-PROD1 ~]$ ss SQL*Plus: Release 11.2.0.1.0 Production on Tue Nov 14 11:13:53 2017 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to an idle instance. SYS@PROD1> startup ORA-27102: out of memory Linux Error: 28: No space left on device SYS@PROD1> |