问题现象:
安装完oracle后,已设置开机自启动,重启数据库服务器验证自启动是否生效,但数据库实例未自动启动,在登录sqlplus时,手动启动数据库实例提示内存溢出:
[oracle@localhost ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.4.0 Production on 星期五 9月 4 16:30:52 2020
Copyright (c) 1982, 2013, Oracle. All rights reserved.
SQL> conn /as sysdba;
已连接到空闲例程。
SQL> startup;
ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device
Additional information: -2147483648
Additional information: 1
处理方法:
通过资料查询,主要是 kernel.shmal、kernel.shmmax这两个参数设置有问题,kernel.shmall参数需要根据页面大小和物理内存的实际情况做调整。
1、首先查看物理内存大小
[root@localhost ~]# top
top - 16:32:18 up 23 min, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 308 total, 2 running, 306 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 32246276 total, 30923748 free, 778316 used, 544212 buff/cache
KiB Swap: 16252924 total, 16252924 free, 0 used. 30988228 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24846 root 20 0 162144 2380 1548 R 5.9 0.0 0:00.03 top
1 root 20 0 194732 7880 4176 S 0.0 0.0 0:02.88 systemd
2、其次查看数据库的 kernel.shmal、kernel.shmmax这两个参数。
当服务器内存大于8G,将不再是默认的2097152,即2GB
shmall 是全部允许使用的共享内存大小,shmmax 是单个段允许使用的大小。这两个可以设置为内存的 90%。例如 16G 内存,16*1024*1024*1024*90% 即15461882265,shmall 的大小为 15461882265/4k(getconf PAGESIZE可得到) 即3774873。
3、修改参数/etc/sysctl.conf
kernel.shmall = 3774873
kernel.shmmax = 15461882265
4、修改后执行检查
[root@localhost ~]# sudo sysctl -p
kernel.shmall = 3774873
kernel.shmmax = 15461882265
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 1048576
net.core.rmem_max = 1048576
net.core.wmem_default = 262144
net.core.wmem_max = 262144
5、查看实际使用情况
[root@localhost ~]# ipcs -l
---------- 消息限制 -----------
系统最大队列数量 = 32768
最大消息尺寸 (字节) = 8192
默认的队列最大尺寸 (字节) = 16384
---------- 同享内存限制 ------------
最大段数 = 4096
最大段大小 (千字节) = 15099494
最大总共享内存 (千字节) = 15099492
最小段大小 (字节) = 1
--------- 信号量限制 -----------
最大数组数量 = 128
每个数组的最大信号量数目 = 250
系统最大信号量数 = 32000
每次信号量调用最大操作数 = 100
信号量最大值 = 32767
6、 重启数据库得到解决
[oracle@localhost ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.4.0 Production on 星期五 9月 4 16:39:10 2020
Copyright (c) 1982, 2013, Oracle. All rights reserved.
SQL> conn /as sysdba;
已连接到空闲例程。
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 9887760384 bytes
Fixed Size 2261688 bytes
Variable Size 1711279432 bytes
Database Buffers 8153726976 bytes
Redo Buffers 20492288 bytes
数据库装载完毕。
数据库已经打开。
SQL>
7、这个问题在linux 64位平台 oracle 9.2到11.2普遍存在。