首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle su 切換用戶後 sqlplus 登錄失敗:ORA-12162/SP2-0667 完整排查實錄

     編輯:Oracle 教學

Oracle su 切換用戶後 sqlplus 登錄失敗:ORA-12162/SP2-0667 完整排查實錄

生產環境 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 / terminfo 警告(非阻礙,但影響體驗)

# 安裝 rlwrap 依賴
yum install -y rlwrap ncurses-term
# 或建立軟連結修正 terminfo
ln -sf /usr/share/terminfo /etc/terminfo

第三層:sqlplus 執行權限與軟連結

# 確認 sqlplus 實體位置
ls -l $ORACLE_HOME/bin/sqlplus
# 若為腳本包裝器,建立直接軟連結
ln -sf $ORACLE_HOME/bin/sqlplus /usr/local/bin/sqlplus

第四層:實例未啟動(ORA-12162 真實含義)

環境變數修正後,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 別名卻失敗。

第五層:非 sys 使用者登錄驗證

# 以應用用戶登錄
rlwrap sqlplus "app_user/password@orcl"
# 成功 → 整個堆疊恢復正常

總結:避坑清單

檢查項命令預期結果
ORACLE_HOMEecho $ORACLE_HOME指向安裝目錄(如 /opt/oracle/product/11.2.0/dbhome_1)
ORACLE_SIDecho $ORACLE_SID與實例名一致(如 orcl)
PATH 包含 binwhich sqlplus指向 $ORACLE_HOME/bin/sqlplus
Listener 狀態lsnrctl status顯示 READY 狀態的服務名
實例狀態sqlplus "/ as sysdba" → SELECT STATUS FROM V$INSTANCEOPEN

核心心法

  1. 環境變數是基石:su - oracle 必須載入正確的 .bash_profile,缺一不可。
  2. ORA-12162 ≠ TNS 錯誤:本地 OS 驗證模式下,實例未啟動會拋出此錯誤,切勿誤改 tnsnames.ora/listener.ora。
  3. 分層驗證:環境 → Listener → 實例 → 網路連線,逐層排除,避免盲目試錯。
  4. 備份 .bash_profile:將標準環境變數模板納入版本控管,新機器部署秒級完成。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved