kill -9 殺掉oracle所有程式卻不能啟動和連線資料庫的解決辦法!

rainbowbridg發表於2007-10-17

透過sqlplus "/as sysdba"登入資訊我們可以知道,sqlplus認為oracle資料庫並沒有關閉。
oracle的程式都不存在了,但sqlplus為什麼認為oracle沒有關閉呢?它是根據什麼來判斷的?

4、檢視此時的共享記憶體段情況
[oracle@rep ~]$ ipcs -as

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x91c11414 491531 oracle 640 142606336 10

------ Semaphore Arrays --------
key semid owner perms nsems
0xeddca300 360448 oracle 640 154

------ Message Queues --------
key msqid owner perms used-bytes messages

從上面的資訊可以看出,oracle之前佔用的共享記憶體段和訊號段都還在,而sqlplus是根據這些資訊來判斷資料庫是否關閉的。
我們雖然kill了oracle的程式,但是並沒有清除其對應的共享記憶體段和訊號段。
原因找到的,下面就是清除共享記憶體段和訊號段了。

清除共享記憶體段:
要清除oracle共享記憶體段,必須保證沒有任何連線連線到oracle資料庫上,否則清除共享記憶體段會失敗。
我們用暴力方法強制殺死連線到oracle的程式:
[root@rep ~]# ps -ef|grep ora|awk '{print $2}'|xargs kill -9
[root@rep ~]# su - oracle
[oracle@rep ~]$ ipcrm -m 491531

清除訊號段:
[oracle@rep ~]$ ipcrm -s 360448

檢視此時共享記憶體等資訊:
[oracle@rep ~]$ ipcs -as

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status

------ Semaphore Arrays --------
key semid owner perms nsems

------ Message Queues --------
key msqid owner perms used-bytes messages

從上面資訊看到,共享記憶體段和訊號段已經被清除。

5、啟動oracle
清除完訊號段後,我們再用sys登入資料庫,就會發現,sqlplus已經認為資料庫是關閉的了。
此時我們可以正常啟動資料庫:
[oracle@rep ~]$ sqlplus "/as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on D??úáù 7?? 28 14:17:46 2007

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to an idle instance.

idle> startup
ORACLE instance started.

Total System Global Area 135337420 bytes
Fixed Size 452044 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
Database mounted.
Database opened.

其實這種情況下,我們只需要清除訊號段就可以正常啟動資料庫,但為了更徹底一點,我們選擇了把共享記憶體也一併清除。

一般遇到這種情況有兩種解決方法:
1、直接重啟OS
2、清除共享記憶體和訊號量

最後簡單總結一下:
1、oracle程式終止不代表資料庫關閉
2、oracle程式異常中止時要及時清除對應的共享記憶體段和訊號段
3、sqlplus是根據訊號段來判斷oracle資料庫是否是關閉的

ref: http://space6212.itpub.net/post/12157/317871

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7916042/viewspace-977160/,如需轉載,請註明出處,否則將追究法律責任。

相關文章