数据库启动时发生报错解决办法
目录
环境
症状
问题原因
解决方法
环境
系统平台:Linux x86-64 Red Hat Enterprise Linux 5,Linux x86-64 Red Hat
Enterprise Linux 6,Linux x86-64 Red Hat Enterprise Linux 7,中标麒麟_NeoKylin Linux Advanced Server release 6.8 (Calcium) ,中标麒麟_NeoKylinServer7.2_x86-64,普华_iSoft Server OS release 3.0 (Final)
症状
数据库启动时报错如下:
[highgo@hgdb ~]$ 2018-01-15 11:36:05 CST [2840] : [1-1] user=,db= 致命错误:无法创建
信号量: 设备上没有空间
2018-01-15 11:36:05 CST [2840] : [2-1] user=,db= 详细信息: semget(5866129, 17, 03600)
系统调用失败。
2018-01-15 11:36:05 CST [2840] : [3-1] user=,db= 提示: 这个错误不表示磁盘空间已经用完. 发生的原因有可能超过系统对于最大数量信号灯集合(由参数SEMMNI表示),或者是对系统范围内最大可使用信号灯(由参数SEMMNS表示)的限制.您需要增加这两个系统核心参数的值。
另外也可以通过减
小PostgreSQL参数max_connections来减少它所消耗的信号灯总数。
在PostgreSQL文档中包含了更多关于如何配置PostgreSQL的信息。
问题原因
由于PostgreSQL参数max_connections和操作系统内核参数kernel.sem设置不匹配导致。
解决方案
可以通过如下任一方式更正此问题。
按需设置max connections大小。
max_connections控制着最大连接数。
通过如下方式修改max_connections。
[highgo@hgdb
data]$ vi $PGDATA/postgresql.conf。
1、修改max_connections值: max connections = 500
修改完毕后依次按"ESC :wq"四个键来保存退出。
[highgo@hgdb data]$ pg ctl restart waiting for server to shut down ............... done
server stoppe
server starting
[highgo@hgdb data]$ 2018-01-15 11:05:36 CST [2185] : [1-1] user=,db= 日志: 日志输出重定向到日志收集进程。
2018-01-15 11:05:36 CST [2185] : [2-1] user=,db= 提示: 后续的日志输出将出现在目录
"pg_log"中。
2、调大内核配置kernel.sem。
以512G内存大小为例,可以设置为
kernel.sem = 4096 2147483647 2147483646 512000
4096 每组多少信号量 (>=17, PostgreSQL 每16个进程一组, 每组需要17个信号量) ,
2147483647 总共多少信号量 (2^31-1 , 且大于4096*512000 ) ,
2147483646 每个semop()调用支持多少操作 (2^31-1),
512000 多少组信号量 (假设每GB支持100个连接, 512GB支持51200个连接, 加上其他进程, >
51200*2/16 绰绰有余)
通过如下系统命令修改
# sysctl -w kernel.sem="4096 2147483647 2147483646 512000" 或
修改
[root@hgdb ~]# vi /etc/sysctl.conf kernel.sem = 250 32000 100 128
修改完毕后依次按"ESC :wq"四个键来保存退出。
执行如下命令使修改生效。
[root@hgdb ~]# sysctl -p 检查是否生效
# ipcs -s -l
------ Semaphore Limits --------
max number of arrays = 512000 max semaphores per array = 4096
max semaphores system wide = 2147483647 max ops per semop call = 2147483646 semaphore max value = 32767。