Oracle SID大小寫混用引起的sys賬號不能登入

realkid4發表於2017-07-14

 

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都會視為“遠端連線”,進行遠端連線處理。

 

那麼,sysscott使用者的差別在什麼地方?就是密碼檔案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,這樣重新啟動資料庫的時候,原有的那些環境檔案就能發揮作用。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-2142065/,如需轉載,請註明出處,否則將追究法律責任。

相關文章