生產環境 su - oracle 後執行 rlwrap sqlplus "/ as sysdba" 報錯 ORA-12162: TNS:net service name is incorrectly specified、SP2-0667: message file sp1.msb not found、rlwrap: warning: your terminfo is missing。本文還原完整排查過程,揭示環境變數缺失與實例未啟動的雙重根因。
[oracle@localhost ~]$ rlwrap sqlplus "/ as sysdba" rlwrap: warning: your terminfo is missing ... SP2-0667: message file sp1.msb not found SP2-0750: You may need to set ORACLE_HOME to your Oracle software directory SQL*Plus: Release 11.2.0.1.0 Production ERROR: ORA-12162: TNS:net service name is incorrectly specified
SP2-0750 明確提示 ORACLE_HOME 未設定。su - oracle 載入 .bash_profile,但該檔案可能未正確配置 Oracle 環境。
# 檢查當前環境 echo $ORACLE_HOME echo $ORACLE_SID echo $PATH # 修正 .bash_profile 或 .bashrc cat >> ~/.bash_profile <<'EOF' export ORACLE_BASE=/oracle/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1 export ORACLE_SID=orcl export PATH=$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH export TNS_ADMIN=$ORACLE_HOME/network/admin EOF # 立即生效 source ~/.bash_profile
# 安裝 rlwrap 依賴 yum install -y rlwrap ncurses-term # 或建立軟連結修正 terminfo ln -sf /usr/share/terminfo /etc/terminfo
# 確認 sqlplus 實體位置 ls -l $ORACLE_HOME/bin/sqlplus # 若為腳本包裝器,建立直接軟連結 ln -sf $ORACLE_HOME/bin/sqlplus /usr/local/bin/sqlplus
環境變數修正後,sqlplus "/ as sysdba" 進入 idle instance:
SQL> startup ORACLE instance started. Total System Global Area ... Database mounted. Database opened.
關鍵認知:ORA-12162 在 sqlplus "/ as sysdba" 時,往往不是 TNS 設定錯,而是 實例根本沒啟動,導致無法透過本地 IPC 連接,Oracle 退而嘗試解析 TNS 別名卻失敗。
# 以應用用戶登錄 rlwrap sqlplus "app_user/password@orcl" # 成功 → 整個堆疊恢復正常
| 檢查項 | 命令 | 預期結果 |
|---|---|---|
| ORACLE_HOME | echo $ORACLE_HOME | 指向安裝目錄(如 /opt/oracle/product/11.2.0/dbhome_1) |
| ORACLE_SID | echo $ORACLE_SID | 與實例名一致(如 orcl) |
| PATH 包含 bin | which sqlplus | 指向 $ORACLE_HOME/bin/sqlplus |
| Listener 狀態 | lsnrctl status | 顯示 READY 狀態的服務名 |
| 實例狀態 | sqlplus "/ as sysdba" → SELECT STATUS FROM V$INSTANCE | OPEN |
su - oracle 必須載入正確的 .bash_profile,缺一不可。tnsnames.ora/listener.ora。