【Kill】兩條Linux命令徹底殺死Oracle
今天編寫的兩條極具殺傷力的命令,它可以瞬間將殺死在無形之中。後面我將給出簡單註釋並展示一下它的威力。
$ ps -ef |grep $ORACLE_SID|grep -v grep|awk '{print $2}' | xargs -9
$ ipcs -m | grep oracle | awk '{print $2}' | xargs ipcrm shm
這兩條命令的來由:
今天處理了三起Oracle資料庫無故無法登入的問題,無論你採取什麼手段都無法登陸到Oracle的SQL*PLus中,更談不上故障排查了。
這種情況下有兩種選擇,第一種選擇是經過一個較長的時間來排查故障原因,另外一種方法是不惜一切代價啟動以便儘快恢復生產。
如果是環境可以使用第一種方法來完成,對於排查問題的經驗積累是有意的。
如果是生產環境,減少停機時間是最最至上的原則,所以我們只有不惜一切代價讓資料庫儘快恢復使用。
對於儘快恢復生產的方法主要也有兩種。
第一種不惜代價的方法是重啟伺服器主機,徹底釋放一切資源,重新來過,這種方法是有效的,不過停機時間還是有點長,而且技術含量比較低,所以不是很推薦使用這種超級“簡單粗暴”的方法。
第二種方法就是我將要給大家展示的方法。
1.第一步:使用Linux的kill命令殺死所有與oracle有關的程式。
1)查詢到與ORACLE_SID相關的oracle程式
$ ps -ef |grep $ORACLE_SID
oracle 7776 1 0 22:51 ? 00:00:00 ora_pmon_ora10g
oracle 7778 1 0 22:51 ? 00:00:00 ora_psp0_ora10g
oracle 7780 1 0 22:51 ? 00:00:00 ora_mman_ora10g
oracle 7782 1 0 22:51 ? 00:00:00 ora_dbw0_ora10g
oracle 7784 1 0 22:51 ? 00:00:00 ora_dbw1_ora10g
oracle 7786 1 0 22:51 ? 00:00:00 ora_lgwr_ora10g
oracle 7788 1 0 22:51 ? 00:00:00 ora_ckpt_ora10g
oracle 7790 1 0 22:51 ? 00:00:00 ora_smon_ora10g
oracle 7792 1 0 22:51 ? 00:00:00 ora_reco_ora10g
oracle 7794 1 0 22:51 ? 00:00:00 ora_cjq0_ora10g
oracle 7796 1 0 22:51 ? 00:00:00 ora_mmon_ora10g
oracle 7798 1 0 22:51 ? 00:00:00 ora_mmnl_ora10g
oracle 7832 1 0 22:51 ? 00:00:00 ora_arc0_ora10g
oracle 7834 1 0 22:51 ? 00:00:00 ora_arc1_ora10g
oracle 7836 1 0 22:51 ? 00:00:00 ora_qmnc_ora10g
oracle 7842 1 0 22:51 ? 00:00:00 ora_q000_ora10g
oracle 7847 1 0 22:52 ? 00:00:00 ora_q001_ora10g
oracle 7951 7592 0 23:11 pts/2 00:00:00 grep ora10g
2)去除掉包含grep命令本身的記錄
$ ps -ef |grep $ORACLE_SID |grep -v grep
oracle 7776 1 0 22:51 ? 00:00:00 ora_pmon_ora10g
oracle 7778 1 0 22:51 ? 00:00:00 ora_psp0_ora10g
oracle 7780 1 0 22:51 ? 00:00:00 ora_mman_ora10g
oracle 7782 1 0 22:51 ? 00:00:00 ora_dbw0_ora10g
oracle 7784 1 0 22:51 ? 00:00:00 ora_dbw1_ora10g
oracle 7786 1 0 22:51 ? 00:00:00 ora_lgwr_ora10g
oracle 7788 1 0 22:51 ? 00:00:00 ora_ckpt_ora10g
oracle 7790 1 0 22:51 ? 00:00:00 ora_smon_ora10g
oracle 7792 1 0 22:51 ? 00:00:00 ora_reco_ora10g
oracle 7794 1 0 22:51 ? 00:00:00 ora_cjq0_ora10g
oracle 7796 1 0 22:51 ? 00:00:00 ora_mmon_ora10g
oracle 7798 1 0 22:51 ? 00:00:00 ora_mmnl_ora10g
oracle 7832 1 0 22:51 ? 00:00:00 ora_arc0_ora10g
oracle 7834 1 0 22:51 ? 00:00:00 ora_arc1_ora10g
oracle 7836 1 0 22:51 ? 00:00:00 ora_qmnc_ora10g
oracle 7842 1 0 22:51 ? 00:00:00 ora_q000_ora10g
oracle 7847 1 0 22:52 ? 00:00:00 ora_q001_ora10g
3)使用awk命令得到我們關心的程式號
$ ps -ef |grep $ORACLE_SID |grep -v grep|awk '{print $2}'
7776
7778
7780
7782
7784
7786
7788
7790
7792
7794
7796
7798
7832
7834
7836
7842
7847
4)萬事俱備,我們最後使用kill命令將oracle的程式殺死,因此得到了下面完整的命令
$ ps -ef |grep $ORACLE_SID |grep -v grep|awk '{print $2}' | xargs kill -9
2.第二步:使用Linux的ipcs和ipcsrm命令釋放oracle佔用的共享記憶體。
1)使用ipcs命令檢視系統中共享記憶體使用情況
$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 32768 root 644 72 2 dest
0x00000000 65537 root 644 16384 2 dest
0x00000000 98306 root 644 280 2 dest
0x00000000 131075 root 644 790528 2 dest
0x00000000 163844 root 644 790528 2 dest
0x00000000 196613 root 644 790528 2 dest
0x00000000 327689 oracle 644 790528 2 dest
0x00000000 360458 oracle 644 790528 2 dest
0x00000000 393227 oracle 644 790528 2 dest
0xecc5fba0 786447 oracle 640 5370806272 30
2)使用grep命令過濾後得到與oracle相關的內容
$ ipcs -m | grep oracle
0x00000000 327689 oracle 644 790528 2 dest
0x00000000 360458 oracle 644 790528 2 dest
0x00000000 393227 oracle 644 790528 2 dest
0xecc5fba0 786447 oracle 640 5370806272 31
2)使用awk命令獲得上面我們關心的shmid欄位內容
$ $ ipcs -m | grep oracle | awk '{print $2}'
327689
360458
393227
786447
3)最後使用ipcsrm命令釋放共享記憶體
$ ipcs -m | grep oracle | awk '{print $2}' | xargs ipcrm shm
resource(s) deleted
再次檢視一下,此時共享記憶體已經被釋放。
$ ipcs -m | grep oracle
0x00000000 327689 oracle 644 790528 2 dest
0x00000000 360458 oracle 644 790528 2 dest
0x00000000 393227 oracle 644 790528 2 dest
0x00000000 786447 oracle 640 5370806272 31 dest
3.此時,我們便可以登入到資料庫,最後啟動資料庫恢復生產。
4.小結
這種方法相對也是比較“粗暴”的。不過在危難之時還是可以派上用場。
重點強調:
手工殺掉oracle程式和手工釋放共享記憶體是非常危險的,不到萬不得已,千萬不要使用;
這裡我給出的兩條極具殺傷力的命令,請不要輕易嘗試。
Good luck.
$ ps -ef |grep $ORACLE_SID|grep -v grep|awk '{print $2}' | xargs -9
$ ipcs -m | grep oracle | awk '{print $2}' | xargs ipcrm shm
這兩條命令的來由:
今天處理了三起Oracle資料庫無故無法登入的問題,無論你採取什麼手段都無法登陸到Oracle的SQL*PLus中,更談不上故障排查了。
這種情況下有兩種選擇,第一種選擇是經過一個較長的時間來排查故障原因,另外一種方法是不惜一切代價啟動以便儘快恢復生產。
如果是環境可以使用第一種方法來完成,對於排查問題的經驗積累是有意的。
如果是生產環境,減少停機時間是最最至上的原則,所以我們只有不惜一切代價讓資料庫儘快恢復使用。
對於儘快恢復生產的方法主要也有兩種。
第一種不惜代價的方法是重啟伺服器主機,徹底釋放一切資源,重新來過,這種方法是有效的,不過停機時間還是有點長,而且技術含量比較低,所以不是很推薦使用這種超級“簡單粗暴”的方法。
第二種方法就是我將要給大家展示的方法。
1.第一步:使用Linux的kill命令殺死所有與oracle有關的程式。
1)查詢到與ORACLE_SID相關的oracle程式
$ ps -ef |grep $ORACLE_SID
oracle 7776 1 0 22:51 ? 00:00:00 ora_pmon_ora10g
oracle 7778 1 0 22:51 ? 00:00:00 ora_psp0_ora10g
oracle 7780 1 0 22:51 ? 00:00:00 ora_mman_ora10g
oracle 7782 1 0 22:51 ? 00:00:00 ora_dbw0_ora10g
oracle 7784 1 0 22:51 ? 00:00:00 ora_dbw1_ora10g
oracle 7786 1 0 22:51 ? 00:00:00 ora_lgwr_ora10g
oracle 7788 1 0 22:51 ? 00:00:00 ora_ckpt_ora10g
oracle 7790 1 0 22:51 ? 00:00:00 ora_smon_ora10g
oracle 7792 1 0 22:51 ? 00:00:00 ora_reco_ora10g
oracle 7794 1 0 22:51 ? 00:00:00 ora_cjq0_ora10g
oracle 7796 1 0 22:51 ? 00:00:00 ora_mmon_ora10g
oracle 7798 1 0 22:51 ? 00:00:00 ora_mmnl_ora10g
oracle 7832 1 0 22:51 ? 00:00:00 ora_arc0_ora10g
oracle 7834 1 0 22:51 ? 00:00:00 ora_arc1_ora10g
oracle 7836 1 0 22:51 ? 00:00:00 ora_qmnc_ora10g
oracle 7842 1 0 22:51 ? 00:00:00 ora_q000_ora10g
oracle 7847 1 0 22:52 ? 00:00:00 ora_q001_ora10g
oracle 7951 7592 0 23:11 pts/2 00:00:00 grep ora10g
2)去除掉包含grep命令本身的記錄
$ ps -ef |grep $ORACLE_SID |grep -v grep
oracle 7776 1 0 22:51 ? 00:00:00 ora_pmon_ora10g
oracle 7778 1 0 22:51 ? 00:00:00 ora_psp0_ora10g
oracle 7780 1 0 22:51 ? 00:00:00 ora_mman_ora10g
oracle 7782 1 0 22:51 ? 00:00:00 ora_dbw0_ora10g
oracle 7784 1 0 22:51 ? 00:00:00 ora_dbw1_ora10g
oracle 7786 1 0 22:51 ? 00:00:00 ora_lgwr_ora10g
oracle 7788 1 0 22:51 ? 00:00:00 ora_ckpt_ora10g
oracle 7790 1 0 22:51 ? 00:00:00 ora_smon_ora10g
oracle 7792 1 0 22:51 ? 00:00:00 ora_reco_ora10g
oracle 7794 1 0 22:51 ? 00:00:00 ora_cjq0_ora10g
oracle 7796 1 0 22:51 ? 00:00:00 ora_mmon_ora10g
oracle 7798 1 0 22:51 ? 00:00:00 ora_mmnl_ora10g
oracle 7832 1 0 22:51 ? 00:00:00 ora_arc0_ora10g
oracle 7834 1 0 22:51 ? 00:00:00 ora_arc1_ora10g
oracle 7836 1 0 22:51 ? 00:00:00 ora_qmnc_ora10g
oracle 7842 1 0 22:51 ? 00:00:00 ora_q000_ora10g
oracle 7847 1 0 22:52 ? 00:00:00 ora_q001_ora10g
3)使用awk命令得到我們關心的程式號
$ ps -ef |grep $ORACLE_SID |grep -v grep|awk '{print $2}'
7776
7778
7780
7782
7784
7786
7788
7790
7792
7794
7796
7798
7832
7834
7836
7842
7847
4)萬事俱備,我們最後使用kill命令將oracle的程式殺死,因此得到了下面完整的命令
$ ps -ef |grep $ORACLE_SID |grep -v grep|awk '{print $2}' | xargs kill -9
2.第二步:使用Linux的ipcs和ipcsrm命令釋放oracle佔用的共享記憶體。
1)使用ipcs命令檢視系統中共享記憶體使用情況
$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 32768 root 644 72 2 dest
0x00000000 65537 root 644 16384 2 dest
0x00000000 98306 root 644 280 2 dest
0x00000000 131075 root 644 790528 2 dest
0x00000000 163844 root 644 790528 2 dest
0x00000000 196613 root 644 790528 2 dest
0x00000000 327689 oracle 644 790528 2 dest
0x00000000 360458 oracle 644 790528 2 dest
0x00000000 393227 oracle 644 790528 2 dest
0xecc5fba0 786447 oracle 640 5370806272 30
2)使用grep命令過濾後得到與oracle相關的內容
$ ipcs -m | grep oracle
0x00000000 327689 oracle 644 790528 2 dest
0x00000000 360458 oracle 644 790528 2 dest
0x00000000 393227 oracle 644 790528 2 dest
0xecc5fba0 786447 oracle 640 5370806272 31
2)使用awk命令獲得上面我們關心的shmid欄位內容
$ $ ipcs -m | grep oracle | awk '{print $2}'
327689
360458
393227
786447
3)最後使用ipcsrm命令釋放共享記憶體
$ ipcs -m | grep oracle | awk '{print $2}' | xargs ipcrm shm
resource(s) deleted
再次檢視一下,此時共享記憶體已經被釋放。
$ ipcs -m | grep oracle
0x00000000 327689 oracle 644 790528 2 dest
0x00000000 360458 oracle 644 790528 2 dest
0x00000000 393227 oracle 644 790528 2 dest
0x00000000 786447 oracle 640 5370806272 31 dest
3.此時,我們便可以登入到資料庫,最後啟動資料庫恢復生產。
4.小結
這種方法相對也是比較“粗暴”的。不過在危難之時還是可以派上用場。
重點強調:
手工殺掉oracle程式和手工釋放共享記憶體是非常危險的,不到萬不得已,千萬不要使用;
這裡我給出的兩條極具殺傷力的命令,請不要輕易嘗試。
Good luck.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-1994893/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle rac 12徹底刪除,徹底刪除該死的racOracle
- Linux基礎命令---殺死程式pkillLinux
- Linux基礎命令---殺死程式killallLinux
- Linux基礎命令—殺死程式pkillLinux
- 【linux】kill命令模板Linux
- 精通 Linux 的 “kill” 命令Linux
- linux之kill命令詳解Linux
- Mysql使用kill命令解決死鎖問題MySql
- linux殺死後臺程式Linux
- 死磕java concurrent包系列(四)基於AQS的條件佇列徹底理解ArrayBlockingQueueJavaAQS佇列BloC
- 兩萬字長文,徹底搞懂Kafka!Kafka
- 【oracle 殺死繁忙程式 ORA-00054】實驗Oracle
- oracle徹底刪除資料檔案Oracle
- 兩張圖徹底搞懂MyBatis的Mapper原理!MyBatisAPP
- Linux下 netstat ps kill 命令詳解及常用命令收集Linux
- 5分鐘,徹底精通Oracle DG切換Oracle
- 殺死Haskell的人也可能殺死Rust · GitHubHaskellRustGithub
- centos 系統如何徹底刪除docker命令CentOSDocker
- ChatGPT,我徹徹底底淪陷了!ChatGPT
- 這個殺手不太冷-kill家族
- 程式命令ps/top/kill
- oracle 資料庫徹底清除目錄指令碼Oracle資料庫指令碼
- 徹底解決Linux下mongodb的安裝LinuxMongoDB
- 徹底理解Linux的DISPLAY變數的作用Linux變數
- 記住這兩點,徹底終結原型鏈吧原型
- 殺死8080埠
- 10條有趣的Linux命令Linux
- 一條指令徹底刪除掃描出來的有害程式
- 一次徹底講清如何處理mysql 的死鎖問題MySql
- 徹底搞懂徹底搞懂事件驅動模型 - Reactor事件模型React
- “我想殺死兩個孩子再自殺”產後抑鬱的媽媽有多可怕!
- 徹底理解ReentrantLockReentrantLock
- 徹底理解volatile
- 徹底理解synchronizedsynchronized
- 簡述top命令與結束程式kill命令
- 「跳一跳」兩年後,廣告“殺死”遊戲小程式?遊戲
- 【轉載】Linux下徹底解除安裝mysql詳解LinuxMySql
- Linux系統徹底解除安裝MySQL資料庫LinuxMySql資料庫
- linux 檢視程式 kill程式Linux