挺常见的一个现象,原因多种多样,这里给一个可能比较适合测试环境的解决办法
测试环境,经常需要重置数据库环境,保证测试不受干扰。有时候,就会出现这种情况,因为一个用户频繁的重置数据库,之前已经申请的共享内存没有释放,导致资源不够了。
Linux有个ipcs命令,可以查看进程间通信的资源消耗情况,其中就包括共享内存
[root@localhost ~]# ipcs -a | head -3------ Message Queues --------key msqid owner perms used-bytes messages[root@localhost ~]# ipcs -m | grep guqi0x030a36a9 1848508454 guqi 600 56 80x030a3e79 355860788 guqi 600 56 90x030a4261 564920631 guqi 600 56 90x030bb961 837911127 guqi 600 56 60x030a5db9 358580826 guqi 600 56 90x030a4e19 355992199 guqi 600 56 70x030a55e9 356024985 guqi 600 56 70x030a5201 356057754 guqi 600 56 70x030d4001 847217377 guqi 600 56 70x030a4a31 469304034 guqi 600 56 60x030a59d1 356090595 guqi 600 56 70x030a61a1 470975204 guqi 600 56 60x030d43e9 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
