挺常见的一个现象,原因多种多样,这里给一个可能比较适合测试环境的解决办法
测试环境,经常需要重置数据库环境,保证测试不受干扰。有时候,就会出现这种情况,因为一个用户频繁的重置数据库,之前已经申请的共享内存没有释放,导致资源不够了。
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