1. 程式人生 > >ORACLE 低版本客戶端登入Oracle 12c監聽報錯之ORA-28040

ORACLE 低版本客戶端登入Oracle 12c監聽報錯之ORA-28040

    今天,測試要求遠端登入oracle 12c資料庫,但是他本地安裝的連線客戶端工具版本比較低,他本地安裝的oracle資料庫是11.2.0.1

要遠端登入的資料庫是12.2.0.1,通過tns遠端登入時報錯:ORA-28040

    開始時使用tnsping測試TNS連線名ora12c時報錯TNS-03505名字無法解析,原因是他本地安裝有Oracle的廋客戶端工具,tns配置是

在廋客戶端配置的而不是oracle_home\network\admin下,這裡需要特別說明一下,tnsping是oracle軟體自帶的工具,它預設使用的oracle_home\

network\admin下的tnsnames.ora檔案,測試是( C:\oracle\product\11.2.0\dbhome_1\network\admin),於是將配置新增到oracle_home\network

\admin下,tnsping能夠正常通過了:

C:\Users\localadmin>tnsping ora12c
TNS Ping Utility for 64-bit Windows: Version 11.2.0.1.0 - Production on 13-6月 -2017 13:47:00
Copyright (c) 1997, 2010, Oracle.  All rights reserved.
已使用的引數檔案:
C:\oracle\product\11.2.0\dbhome_1\network\admin\sqlnet.ora
已使用 TNSNAMES 介面卡來解析別名
嘗試連線 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.117.130.29)(PORT = 1522))) (CONN
ECT_DATA = (SERVICE_NAME = ora12c)))
OK (0 毫秒)
C:\Users\localadmin>

但是,使用tns遠端登入時無法登入,登入報錯:ORA-28040

C:\Users\localadmin>sqlplus bmi14/[email protected]
SQL*Plus: Release 11.2.0.1.0 Production on 星期二 6月 13 11:54:29 2017
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
ERROR:
ORA-28040: No matching authentication protocol

請輸入使用者名稱:
ERROR:
ORA-12560: TNS: 協議介面卡錯誤

請輸入使用者名稱:
ERROR:
ORA-12560: TNS: 協議介面卡錯誤

SP2-0157: 在 3 次嘗試之後無法連線到 ORACLE, 退出 SQL*Plus
C:\Users\localadmin>

    看網上說,這是低版本客戶端向高版本伺服器發起連線,需要配置sqlnet.ora,新增引數:SQLNET.ALLOWED_LOGON_VERSION=8

這裡需要宣告的是sqlnet.ora配置是在伺服器端而不是客戶端:

[[email protected] admin]$ lsnrctl status
LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 13-JUN-2017 13:51:21
Copyright (c) 1991, 2016, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora29)(PORT=1522)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.2.0.1.0 - Production
Start Date                12-JUN-2017 11:28:58
Uptime                    1 days 2 hr. 22 min. 22 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u03/app/oracle/product/12.2.0/db_1/network/admin/listener.ora
Listener Log File         /u03/app/diag/tnslsnr/ora29/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora29)(PORT=1522)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1522)))
Services Summary...
Service "ora12c" has 1 instance(s).
  Instance "ora12c", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[[email protected] admin]$ pwd
/u03/app/oracle/product/12.2.0/db_1/network/admin
[[email protected] admin]$ cat sqlnet.ora 
SQLNET.ALLOWED_LOGON_VERSION=8
[[email protected] admin]$ 

sqlnet.ora配置完成後不需要重新啟動Oracle服務或監聽程式。

    然後,在測試端再次使用TNS遠端登入,發現還是報錯:ORA-01017

C:\Users\localadmin>sqlplus bmi14/[email protected]
SQL*Plus: Release 11.2.0.1.0 Production on 星期二 6月 13 13:16:53 2017
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied

請輸入使用者名稱:
ERROR:
ORA-12560: TNS: 協議介面卡錯誤

請輸入使用者名稱:
ERROR:
ORA-12560: TNS: 協議介面卡錯誤

SP2-0157: 在 3 次嘗試之後無法連線到 ORACLE, 退出 SQL*Plus
C:\Users\localadmin>

    很奇怪的是,我在12c資料庫新建使用者zhul,同樣在測試登入卻可以登入:

C:\Users\localadmin>sqlplus zhul/[email protected]


SQL*Plus: Release 11.2.0.1.0 Production on 星期二 6月 13 13:18:57 2017


Copyright (c) 1982, 2010, Oracle.  All rights reserved.




連線到:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production


SQL> quit
從 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 斷開


C:\Users\localadmin>

    好奇之下,讓其他同事使用相同的tns登入bmi14卻可以,唯一不同的是同事本地安裝的oracle資料庫是11.2.0.3的資料庫。


加上sqlnet.ora與之前建立的使用者的密碼版本引數發現,新建的使用者有10G而之前建立的使用者沒有,新使用者登入需要sqlnet.ora

不過jdbc測試bmi14不受sqlnet.ora限制,刪除sqlnet.ora檔案,jdbc程式使用jdk1.8、jdk1.7和ojdbc8.jar能連線資料庫。