共享内存不够导致PG启动失败

挺常见的一个现象,原因多种多样,这里给一个可能比较适合测试环境的解决办法


start_failed.png

测试环境,经常需要重置数据库环境,保证测试不受干扰。有时候,就会出现这种情况,因为一个用户频繁的重置数据库,之前已经申请的共享内存没有释放,导致资源不够了。

Linux有个ipcs命令,可以查看进程间通信的资源消耗情况,其中就包括共享内存

[root@localhost ~]# ipcs -a | head -3

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages
[root@localhost ~]# ipcs -m | grep guqi
0x030a36a9 1848508454 guqi       600        56         8
0x030a3e79 355860788  guqi       600        56         9
0x030a4261 564920631  guqi       600        56         9
0x030bb961 837911127  guqi       600        56         6
0x030a5db9 358580826  guqi       600        56         9
0x030a4e19 355992199  guqi       600        56         7
0x030a55e9 356024985  guqi       600        56         7
0x030a5201 356057754  guqi       600        56         7
0x030d4001 847217377  guqi       600        56         7
0x030a4a31 469304034  guqi       600        56         6
0x030a59d1 356090595  guqi       600        56         7
0x030a61a1 470975204  guqi       600        56         6
0x030d43e9 868123365  guqi       600        56         5
[root@localhost ~]#

常用的几个参数

ipcs -m 查看系统使用的IPC共享内存资源
ipcs -q 查看系统使用的IPC队列资源
ipcs -s 查看系统使用的IPC信号量资源
ipcs -l 查看系统的IPC相关参数的设置情况

与之配套的另一个命令ipcrm,可以清理这些IPC资源

ipcrm -M shmkey  移除用shmkey创建的共享内存段
ipcrm -m shmid    移除用shmid标识的共享内存段
ipcrm -Q msgkey  移除用msqkey创建的消息队列
ipcrm -q msqid  移除用msqid标识的消息队列
ipcrm -S semkey  移除用semkey创建的信号
ipcrm -s semid  移除用semid标识的信号

所以回到最初那个问题,有个一键恢复的命令

ipcs -m | grep 用户名 | grep -v grep | awk '{print $2}'  | xargs -n1 ipcrm -m

你可能感兴趣的:(共享内存不够导致PG启动失败)