前几天遇到一个case,另一个项目组的数据库启动不了,报错如下:
1 2 3 4 |
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 |
看样子是操作系统hold住了数据库的内存,无法释放导致。尝试shutdown abort,看看是否能释放,数据库显示shutdown abort能操作,但是其实还是无法释放:
1 2 3 4 5 |
SQL> shutdown abort ORACLE instance shut down. SQL> SQL> shutdown abort ORACLE instance shut down. |
但ps -ef |grep ora_ 却看不到oracle的进程,看来只能重启操作系统来释放内存了。
不过,我们还是可以用另外一种方式在清除内存,重启数据库。
用ipcs检查oracle用户的内存段分配情况。(在这个案例中,oracle用户叫dbauat。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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 |
我们看到还有2个内存段留在内存中了,这也是为什么数据库无法启动的原因,这2个内存段不释放的话,新instance的内存无法加载进去。
我们开始清理内存段和信号灯:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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的原因。因为启动时发觉这个文件还是存在的。 |
做完上述操作后,我们的数据库可以正常起来了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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> |
一条评论
这个问题经常遇到。db2 oracle都有这个问题