前几天遇到一个case,另一个项目组的数据库启动不了,报错如下:
SQL
>
startup
ORA - 32004 : obsolete and / or deprecated parameter ( s ) specified
ORA - 27100 : shared memory realm already exists
IBM AIX RISC System / 6000 Error : 17 : File exists
ORA - 32004 : obsolete and / or deprecated parameter ( s ) specified
ORA - 27100 : shared memory realm already exists
IBM AIX RISC System / 6000 Error : 17 : File exists
看样子是操作系统hold住了数据库的内存,无法释放导致。尝试shutdown abort,看看是否能释放,数据库显示shutdown abort能操作,但是其实还是无法释放:
SQL
>
shutdown
abort
ORACLE instance shut down .
SQL >
SQL > shutdown abort
ORACLE instance shut down .
ORACLE instance shut down .
SQL >
SQL > shutdown abort
ORACLE instance shut down .
但ps -ef |grep ora_ 却看不到oracle的进程,看来只能重启操作系统来释放内存了。
不过,我们还是可以用另外一种方式在清除内存,重启数据库。
用ipcs检查oracle用户的内存段分配情况。(在这个案例中,oracle用户叫dbauat。)
ebrs22:/#ipcs
IPC status from /dev/mem as of Wed Dec 21 14:16:41 BEIST 2011
T ID KEY MODE OWNER GROUP
Message Queues:
Shared Memory:
m 1048576 0x52e74b4f --rw-rw-rw- imnadm imnadm
m 1048577 0x9308e451 --rw-rw-rw- imnadm imnadm
m 1048578 0xe4663d62 --rw-rw-rw- imnadm imnadm
m 3 0xc76283cc --rw-rw-rw- imnadm imnadm
m 4 0x298ee665 --rw-rw-rw- imnadm imnadm
m 5 0x780000af --rw-rw-rw- root system
m 6 0x7800018b --rw-rw-rw- root system
m 390070279 0x00f08218 --rw-r----- orauat dbauat
m 25165832 0x00f08219 --rw-r----- orauat dbauat
Semaphores:
s 3145728 0xe4663d62 --ra-ra-ra- imnadm imnadm
s 1 0x62047b2b --ra-r--r-- root system
s 2 0xffffffff --ra-ra-ra- imnadm imnadm
s 3 0xffffffff --ra-ra-ra- imnadm imnadm
s 1048581 0x0104799e --ra------- root system
IPC status from /dev/mem as of Wed Dec 21 14:16:41 BEIST 2011
T ID KEY MODE OWNER GROUP
Message Queues:
Shared Memory:
m 1048576 0x52e74b4f --rw-rw-rw- imnadm imnadm
m 1048577 0x9308e451 --rw-rw-rw- imnadm imnadm
m 1048578 0xe4663d62 --rw-rw-rw- imnadm imnadm
m 3 0xc76283cc --rw-rw-rw- imnadm imnadm
m 4 0x298ee665 --rw-rw-rw- imnadm imnadm
m 5 0x780000af --rw-rw-rw- root system
m 6 0x7800018b --rw-rw-rw- root system
m 390070279 0x00f08218 --rw-r----- orauat dbauat
m 25165832 0x00f08219 --rw-r----- orauat dbauat
Semaphores:
s 3145728 0xe4663d62 --ra-ra-ra- imnadm imnadm
s 1 0x62047b2b --ra-r--r-- root system
s 2 0xffffffff --ra-ra-ra- imnadm imnadm
s 3 0xffffffff --ra-ra-ra- imnadm imnadm
s 1048581 0x0104799e --ra------- root system
我们看到还有2个内存段留在内存中了,这也是为什么数据库无法启动的原因,这2个内存段不释放的话,新instance的内存无法加载进去。
我们开始清理内存段和信号灯:
1. 清理共享内存段:
ipcrm -m < Shared Memory id >
ebrs22:/#ipcrm -m 390070279
ebrs22:/#ipcrm -m 25165832
2.清理信号灯:
ipcrm -s < semaphore id >
上面的检查中没有,所以不必清理。
3. 检查在dbs目录下是否有锁住instance的lk < sid > 文件,如果有,删除之。
OFSAUAT $ pwd
/uat/app/oracle/product/9.2.0/dbs
OFSAUAT $ ls -l
......
-rw-r----- 1 orauat dbauat 24 Dec 21 14:20 lkOFSAUAT
OFSAUAT $ rm lkOFSAUAT
该文件是用来标记操作系统对数据库的锁定,锁住数据库不让同一个sid的instance mount起来,正常关闭后,该文件应该会消失。所以我们这里删除掉它。这也是为什么在报错信息中有:IBM AIX RISC System/6000 Error: 17: File exists的原因。因为启动时发觉这个文件还是存在的。
ipcrm -m < Shared Memory id >
ebrs22:/#ipcrm -m 390070279
ebrs22:/#ipcrm -m 25165832
2.清理信号灯:
ipcrm -s < semaphore id >
上面的检查中没有,所以不必清理。
3. 检查在dbs目录下是否有锁住instance的lk < sid > 文件,如果有,删除之。
OFSAUAT $ pwd
/uat/app/oracle/product/9.2.0/dbs
OFSAUAT $ ls -l
......
-rw-r----- 1 orauat dbauat 24 Dec 21 14:20 lkOFSAUAT
OFSAUAT $ rm lkOFSAUAT
该文件是用来标记操作系统对数据库的锁定,锁住数据库不让同一个sid的instance mount起来,正常关闭后,该文件应该会消失。所以我们这里删除掉它。这也是为什么在报错信息中有:IBM AIX RISC System/6000 Error: 17: File exists的原因。因为启动时发觉这个文件还是存在的。
做完上述操作后,我们的数据库可以正常起来了:
SQL
>
set
time
on
14 : 20 : 06 SQL > startup
ORACLE instance started .
Total System Global Area 622299072 bytes
Fixed Size 743360 bytes
Variable Size 402653184 bytes
Database Buffers 218103808 bytes
Redo Buffers 798720 bytes
Database mounted .
Database opened .
14 : 20 : 17 SQL >
14 : 20 : 20 SQL > select name from v $ database ;
NAME
------- --
OFSAUAT
14 : 21 : 04 SQL >
14 : 20 : 06 SQL > startup
ORACLE instance started .
Total System Global Area 622299072 bytes
Fixed Size 743360 bytes
Variable Size 402653184 bytes
Database Buffers 218103808 bytes
Redo Buffers 798720 bytes
Database mounted .
Database opened .
14 : 20 : 17 SQL >
14 : 20 : 20 SQL > select name from v $ database ;
NAME
------- --
OFSAUAT
14 : 21 : 04 SQL >