当Oracle数据库意外当机,操作系统内存共享段未释放,便无法重启数据库至nomount状态,此时需要手工清理。
现象:
1.可以看到有2个smon进程
$ ps -ef|grep smon
oracle 6538 1 0 22:00 ? 00:00:00 ora_smon_zwb
oracle 6574 1 0 22:02 ? 00:00:00 ora_smon_bxtest
oracle 6583 6463 0 22:02 pts/2 00:00:00 grep smon
2.ipcs查看内存
$ ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x3b751258 65537 oracle 640 262144000 13
0x7707b27c 98306 oracle 640 266338304 11
------ Semaphore Arrays --------
key semid owner perms nsems
0xe21c75d0 98304 oracle 640 154
0x991ba820 229377 oracle 640 204
要清理bxtest内存段方式:
1.使用在$ORACLE_HOME/bin下的sysresv命令
$ cd $ORACLE_HOME/bin
$ ls -l *sys*
-rwxr-xr-x 1 oracle oinstall 2318 Jan 1 2000 gensyslib
-rwxr-xr-x 1 oracle oinstall 20397 Jun 28 2005 sysresv
2.用sysresv -l 查出内存段
$ sysresv -l zwb bxtest
IPC Resources for ORACLE_SID "zwb" :
Shared Memory:
ID KEY
65537 0x3b751258
Semaphores:
ID KEY
98304 0xe21c75d0
Oracle Instance alive for sid "zwb"
IPC Resources for ORACLE_SID "bxtest" :
Shared Memory:
ID KEY
98306 0x7707b27c
Semaphores:
ID KEY
229377 0x991ba820
Oracle Instance alive for sid "bxtest"
3.用操作系统命令ipcrm手工释放
[oracle@testsvr bin]$ ipcrm -m 98306
[oracle@testsvr bin]$ ipcrm -s 229377
4.查看结果可以看到bxtest已清理
$ ps -ef|grep smon
oracle 6538 1 0 22:00 ? 00:00:00 ora_smon_zwb
oracle 6624 6463 0 22:12 pts/2 00:00:00 grep smon
------------
5.sysresv -f参数可以移除共享段(仅适用于实例不存在,操作系统共享段不释放条件)
[oracle@testsvr ~]$ export ORACLE_SID=bxtest
[oracle@testsvr ~]$ sysresv -f bxtest
IPC Resources for ORACLE_SID "bxtest" : Shared Memory: ID KEY 131074 0x7707b27c Semaphores: ID KEY 425985 0x991ba820 Oracle Instance alive for sid "bxtest" SYSRESV-005: Warning Instance maybe alive - aborting remove for sid "bxtest"