■ 河南 劉京義
編者按:有時在啟動Oracle時也會出現(xiàn)問題,筆者單位一臺Oracle因為異常斷電宕機,當啟動系統(tǒng)后,需要重啟Oracle數(shù)據(jù)庫實例,因為某些原因導致重啟失敗。本文分析了故障過程及原因,并最終排查了故障。
單位一臺Oracle因為異常斷電宕機,當啟動系統(tǒng)后,需要重啟Oracle數(shù)據(jù)庫實例。按照常規(guī)方式,先要切換到Oracle賬戶,啟動數(shù)據(jù)庫監(jiān)聽。之后打開sqlplus,用sys賬戶以sysdba身份登錄,登錄完成后執(zhí)行startup命令,就可以啟動數(shù)據(jù)庫實例了。
但是,在執(zhí)行“su-oracle”命令,試圖切換到Oracle賬戶,來啟動監(jiān)聽時,系統(tǒng)卻出現(xiàn)“warning:cannot change directory to /home/oracle:Permission denied”的提示信息,導致操作失敗。即使重啟系統(tǒng),直接以Oracle賬戶身份登錄,也出現(xiàn)相同的錯誤提示,導致Oracle無法正常啟動。
根據(jù)以上提示信息進行分析,有可能是因為“/home/oracle”目錄訪問權限設置不當引發(fā)的,因為在執(zhí)行“su -oracle”命令時,必然會讀取該目錄下的相關配置文件,如果權限設置異常,就會造成讀取操作失敗,自然無法執(zhí)行賬戶切換操作。執(zhí)行“l(fā)s-al/home|grep oracle”命令,針對上述目錄查看權限設置信息,在返回內容中顯示該目錄的屬主為“oracle”賬戶,其擁有讀寫和執(zhí)行權限,據(jù)此分析Oracle擁有針對該目錄正確的訪問權限。
既然使用到了“su”命令,如果其執(zhí)行權限存在問題,也無法執(zhí)行切換賬戶操作。執(zhí)行“l(fā)l /bin/su”命令,在返回信息中的首列顯示“rwxr-xr-x”,并且屬主為“root”賬戶,說明root擁有可讀可寫可執(zhí)行的權限,同一組的用戶可讀不可寫可執(zhí)行,其他用戶擁有可執(zhí)行權限,這說明su命令的執(zhí)行權限沒有問題。因為su命令無法單獨運作,需要相關共享庫的配置方可。如果與之關聯(lián)的共享庫權限設置有誤,同樣會造成命令執(zhí)行失敗。執(zhí)行“l(fā)dd /bin/su”命令,顯示su命令所依賴的共享庫列表信息。注意,ldd不是一個可執(zhí)行程序,而只是一個shell腳本。
根據(jù)這些共享庫(例如“l(fā)ibcrypt.so.1” 等),使用上述方法逐個檢查其權限信息(例如執(zhí)行“l(fā)l /lib/ libcrypt.so.1” 等),來檢測root賬戶是否擁有執(zhí)行權限,經過逐個檢測,均不存在問題。在Linux中,為了提高安全性,可以使 用 SELinux(即 Security Enhanced Linux,安全性增強的Linux)技術,來實現(xiàn)靈活和強制性的訪問控制機制,用于提高Linux系統(tǒng)的安全性,提供強有力的安全保護,可以防御未知的攻擊,SELinux被整合到了2.6版本以上的Linux內核中。如果開啟了SELinux功能,就可能因為權限控制問題導致上述情況的發(fā)生。執(zhí)行“vim/etc/selinux/config”命令,打開SELinux的配置文件,在其中的“SELINUX=”欄中顯示“disabled”,說明當前SELinux處于關閉狀態(tài)。
如果根分區(qū)磁盤容量不夠,也很容易引發(fā)各種奇怪的故障。執(zhí)行“df -h”命令,在返回信息中發(fā)現(xiàn)根分區(qū)剩余空間比較緊張。因為Linux系統(tǒng)沒有回收站之類的功能。所以服務器在線的話,會將刪除的文件會先移動“/tmp”目錄下,之后定期清除該目錄中的數(shù)據(jù)。但是該服務器不知什么原因,沒有設置“/tmp”分區(qū),這樣原本屬于“/tmp”的數(shù)據(jù)就占用了根分區(qū)的空間。對于這種情況,只要刪除“/tmp”目錄下一些占用空間較大的文件即可。在該目錄中發(fā)現(xiàn)一個體積巨大的日志文件,為了順利將其刪除,執(zhí)行“echo" " >/tmp/xxx_log”命令,來快速清空該文件,這里“xxx_log”為具體的文件名。
之所以沒有使用rm命令進行刪除,是因為某個重要進程正在使用該文件。如果使用rm命令,是無法成功清除該日志文件的。因為文件在Linux中存放分為數(shù)據(jù)部分和指針部分,前者位于磁盤中,后者位于文件系統(tǒng)的Meta-Data中,將數(shù)據(jù)刪除后,該指針就會從Meta-Data中清除,這樣文件數(shù)據(jù)部分占用空間就可以被覆蓋了。
但是,因為上述重要進程鎖定了該日志文件,導致該日志文件的指針部分無法從Meta-Data中清除。所以,在該情況下使用rm命令是無效的。經過以上操作,再執(zhí)行“df -h”命令,發(fā)現(xiàn)根分區(qū)的可用空間已經寬裕了很多。但是當執(zhí)行“su-oracle”命令切換賬戶時,故障依然出現(xiàn)。
對問題進行進一步的分析,確定故障還是存在于權限設置上。進入“/home”目錄,執(zhí)行“l(fā)s-al”命令,列出其中的所有文件信息,其中包括隱藏文件,例如文件前面第一個字符為“.”的文件等。經過仔細查看,果然發(fā)現(xiàn)了一些端倪。之前只是針對正常的目錄進行檢測分析,而無視了對于隱藏目錄的檢測。對于名稱為“.”的隱藏目錄來說,其針對的是當前目錄,其擁有者為root,其具有的權限為“rwxrxr-x”,即 root 擁有可讀可寫可執(zhí)行的權限。
對于名稱為“..”的隱藏目錄來說,其針對的是根目錄,擁有者為root,其具有的權限為“rw-xr-x”,說明其沒有執(zhí)行權限,這自然會導致上述故障的發(fā)生。因為root賬戶時沒有權限對根目錄進行操作的,自然無法讀取“/home/oracle”中的配置信息。對于ls命令大家都比較熟悉,但是一般大家很少使用其提供的“-al”參數(shù),來查看隱藏信息,這就很容易出現(xiàn)判斷失誤的情況。
其實,可以使用stat命令加以彌補。例如執(zhí)行“stat/”命令。來查看目錄的詳細信息。找到了問題所在,解決起來就簡單多了,執(zhí)行“chmod 755 /”命令,為根目錄設置可讀可寫可執(zhí)行權限,之后執(zhí)行“su -oracle”命令就可以順利切換了,之后按照正常操作,順利啟動了Oracle數(shù)據(jù)庫實例。