利用Oracle工具sysresv来显示、清除共享内存和信号量
[@more@]
Oracle从8i开始提供sysresv工具来对Oracle使用的共享内存和信号量进行管理。
当服务器上存在多个实例时,该命令能显示每个实例对应的共享内存和信号量,当一个实
例由于某种原因崩溃了,但是由该实例创建的共享内存和信号量却没有被系统回收清理掉,
可以用这个工具来清除应该回收的共享内存和信号量。
usage : sysresv [-if] [-d ] [-l sid1 ...]
-i : Prompt before removing ipc resources for each sid
-f : Remove ipc resources silently, oevrrides -i option
-d : List ipc resources for each sid if on
-l sid1 .. : apply sysresv to each sid
Default : sysresv -d on -l $ORACLE_SID
Note : ipc resources will be attempted to be deleted for a
sid only if there is no currently running instance
with that sid.
下面例子是在RHAS3,Oracle9206,有两个库(实例)lrdb和oratest的环境下进行的:
显示多实例对应的共享内存和信号量
[oracle@sms oracle]$ sysresv -d on -l lrdb oratest
IPC Resources for ORACLE_SID "lrdb" :
Shared Memory:
ID KEY
0 0x89737810
Semaphores:
ID KEY
98304 0xe7fdc710
131073 0xe7fdc711
163842 0xe7fdc712
Oracle Instance alive for sid "lrdb"
IPC Resources for ORACLE_SID "oratest" :
Shared Memory:
ID KEY
131074 0x82390114
Semaphores:
ID KEY
425987 0x5760b938
Oracle Instance alive for sid "oratest"
[oracle@sms oracle]$ ipcs -ms
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x89737810 0 oracle 640 1444937728 13
0x82390114 131074 oracle 640 253755392 12
------ Semaphore Arrays --------
key semid owner perms nsems
0xe7fdc710 98304 oracle 640 227
0xe7fdc711 131073 oracle 640 227
0xe7fdc712 163842 oracle 640 227
0x5760b938 425987 oracle 640 154
清理正在运行的例程的IPC
[oracle@sms oracle]$ sysresv -if
IPC Resources for ORACLE_SID "lrdb" :
Shared Memory:
ID KEY
0 0x89737810
Semaphores:
ID KEY
98304 0xe7fdc710
131073 0xe7fdc711
163842 0xe7fdc712
Oracle Instance alive for sid "lrdb"
SYSRESV-005: Warning
Instance maybe alive - aborting remove for sid "lrdb"
显然sysresv工具不能用于直接清除实例还在运行的IPC
由于实例崩溃而共享内存和信号量没有清除的情况是很难很少发生的,比较难模拟,
即使我把实例的后台进程用kill -9直接杀掉也没有模拟出来,(呵呵,现在的OS
越来越健壮了)所以只有等大家遇上这种情况时再用这个命令试试吧
附注:清除IPC用操作系统命令ipcrm也可以达到同样的效果,不过最重要的是要先
区别出每个实例对应的IPC
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26706/viewspace-1022209/
,如需转载,请注明出处,否则将追究法律责任。