Oracle安裝,特別是Linux/Unix環境下安裝對于每一個初學者而言,都是一個挑戰。操作步驟多、各種配置項目復雜和細節點多,只要有一個步驟出現錯誤,就可能給后續安裝或者運行帶來問題。有時候一些問題還是比較有迷惑性,解決起來需要一些經驗和知識。
本篇主要介紹一個由于SID安裝過程中大小寫不一致引起的問題,以及解決策略。
1、環境介紹
筆者接到同事反饋,說一個已經安裝好的數據庫,遠程使用sys用戶登錄失敗,報錯用戶名密碼錯誤。但是使用其他用戶登錄就沒有問題。
由于是一個新安裝的數據庫,先去檢查一下各種環境變量和數據情況。當前后臺進程的確是正常運行,環境變量上也算正常。
[oracle@TEST-NE-TESTDB ~]$ ps -ef | grep pmon
oracle 13259 1 0 Jul13 ? 00:00:07 ora_pmon_TESTDB
oracle 16439 16414 0 08:31 pts/1 00:00:00 grep pmon
[oracle@TEST-NE-TESTDB ~]$ env | grep ORA
ORACLE_SID=TESTDB
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
在筆者之前的文章里,對于連接故障推薦過一個流程,是按照“從近到遠”的順序逐步遞進。簡單的說:先看服務器內部連接、之后從監聽器、網絡到特定連接客戶端。
在服務器上,匿名sys登錄是沒有問題的,普通用戶(以scott為例)也沒有問題。
SQL> conn / as sysdba
Connected.
SQL> conn scott/tiger
Connected.
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ WRITE
SQL> show parameter service
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string testdb
監聽器狀態也是正常的。
[oracle@TEST-NE-TESTDB ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 14-JUL-2017 08:35:54
Copyright (c) 1991, 2013, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
(篇幅原因,有省略……)
Services Summary...
Service "TESTDB" has 1 instance(s).
Instance "TESTDB", status READY, has 1 handler(s) for this service...
Service "testdbXDB" has 1 instance(s).
Instance "TESTDB", status READY, has 1 handler(s) for this service...
The command completed successfully
[oracle@TEST-NE-TESTDB ~]$
但是,遠程使用pl/sql developer或者sqlplus連接的時候,sys賬號是不成功的,scott賬號成功。
2、問題分析
這個問題的故障點應該不在客戶端到服務器的網絡層面,因為畢竟有用戶可能實現登錄。而且一個懷疑點就是報錯信息:sys連接時候報錯信息不是連接不上,而是用戶名密碼錯誤。
那么推回到服務器端,如果在服務器端使用監聽器進行連接,那么效果如何?
[oracle@TEST-NE-TESTDB admin]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.4.0 Production on Fri Jul 14 08:45:06 2017
Copyright (c) 1982, 2013, Oracle. All rights reserved.
SQL> conn sys/oracle@testdb as sysdba
ERROR:
ORA-01017: invalid username/password; logon denied
SQL> conn scott/tiger@testdb
Connected.
SQL>
錯誤提示是相同,說明在經過監聽器的情況下,引起了驗證錯誤。那么,是否經過監聽器,對Oracle而言有什么差別呢?經過監聽器,無論是否是服務器本地客戶端,Oracle都會視為“遠程連接”,進行遠程連接處理。
那么,sys和scott用戶的差別在什么地方?就是密碼文件Password File。普通用戶驗證信息是在數據庫內部,而具有sysdba權限的是在一個單獨的密碼文件中。所以猜想是密碼文件出了問題。
但是,在$ORACLE_HOME/dbs目錄下,存在疑似的參數文件和密碼文件。
[oracle@TEST-NE-TESTDB admin]$ cd $ORACLE_HOME/dbs
[oracle@TEST-NE-TESTDB dbs]$ ls -l
total 32
-rw-rw----. 1 oracle oinstall 1544 Jul 13 20:25 hc_testdb.dat
-rw-rw----. 1 oracle oinstall 1544 Jul 13 20:27 hc_TESTDB.dat
-rw-rw----. 1 oracle oinstall 1544 Jul 13 18:28 hc_TESTNETESTDB.dat
-rw-r--r--. 1 oracle oinstall 2851 May 15 2009 init.ora
-rw-r-----. 1 oracle oinstall 2112 Jul 13 20:15 initTESTDB.ora
-rw-r-----. 1 oracle oinstall 24 Jul 13 20:27 lkTESTDB
-rw-r-----. 1 oracle oinstall 1536 Jul 13 18:32 orapwtestdb
-rw-r-----. 1 oracle oinstall 3584 Jul 13 19:16 spfiletestdb.ora
但是,看起來很怪,特別是參數文件。當前參數文件發現,根本就沒有使用SPfile,而是直接使用Pfile啟動的。
SQL> conn / as sysdba
Connected.
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string
到此,筆者能猜出原因在于大小寫。在同事安裝數據庫過程中,環境變量和安裝文件上輸入的sid信息大小寫不一致。環境變量中輸入的是大寫TESTDB,而Oracle實例生成的是小寫testdb對應實例文件。
3、解決問題
了解了問題原因,解決起來就有方向了。這個問題要從參數文件和密碼文件兩個層面進行解決。首先要重建參數文件。
SQL> create spfile from pfile;
File created.
SQL> quit
對應目錄上,新生成了大寫的spfileTESTDB.ora文件。
[oracle@TEST-NE-TESTDB dbs]$ ls -l
total 36
-rw-rw----. 1 oracle oinstall 1544 Jul 13 20:25 hc_testdb.dat
(篇幅原因,有省略……)
-rw-r-----. 1 oracle oinstall 1536 Jul 13 18:32 orapwtestdb
-rw-r-----. 1 oracle oinstall 3584 Jul 13 19:16 spfiletestdb.ora
-rw-r-----. 1 oracle oinstall 2560 Jul 14 08:48 spfileTESTDB.ora
密碼文件重構。
[oracle@TEST-NE-TESTDB dbs]$ orapwd file=orapwTESTDB password=oracle entries=5 force=Y
[oracle@TEST-NE-TESTDB dbs]$ ls -l | grep orapw
-rw-r-----. 1 oracle oinstall 1536 Jul 13 18:32 orapwtestdb
-rw-r-----. 1 oracle oinstall 2048 Jul 14 08:56 orapwTESTDB
重新啟動數據庫。
SQL> conn / as sysdba
Connected.
SQL> startup force
ORACLE instance started.
Total System Global Area 4993982464 bytes
Fixed Size 2261808 bytes
Variable Size 1073745104 bytes
Database Buffers 3909091328 bytes
Redo Buffers 8884224 bytes
Database mounted.
Database opened.
重新測試故障消失。
SQL> select * from v$pwfile_users;
USERNAME SYSDB SYSOP SYSAS
------------------------------ ----- ----- -----
SYS TRUE TRUE FALSE
SQL> conn sys/oracle@testdb as sysdba
Connected.
SQL> show user;
USER is "SYS"
4、結論
注意:本案例其實還有另外的一種處理思路,就是順著實例小寫的特點,修改環境變量ORACLE_SID,這樣重新啟動數據庫的時候,原有的那些環境文件就能發揮作用。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。