客戶端登入Oracle 12.2伺服器報ORA-01017的解惑

skyin_1603發表於2018-06-15

最近安裝了一套OL5.6 x86-86的Oracle 12.2.0.1單機測試庫,導完資料交給業務後,業務反饋使用PL/SQL Developer連線時報如下錯誤:

登入失敗報錯

趕緊查了查MOS,原來在預設情況下Oracle 12.2對客戶端版本有限制,主要是由sqlnet.ora中的以下兩個引數控制:

SQLNET.ALLOWED_LOGON_VERSION_SERVER=n

SQLNET.ALLOWED_LOGON_VERSION_CLIENT=n

這兩個引數預設是11,表明預設只允許11g的客戶端進行連線,考慮到很多PC端 plsql developer用的客戶端都是10g,把這兩個引數改為10:

SQLNET.ALLOWED_LOGON_VERSION_SERVER10

SQLNET.ALLOWED_LOGON_VERSION_CLIENT10

SQLNET.ALLOWED_LOGON_VERSION_CLIENT引數主要是當資料庫作為dblink的客戶端時使用,設定後無需重啟監聽和資料庫就可以生效。對於RAC,Oracle讀取的這兩個引數是在RDBMS的ORACLE_HOME裡,而不是GRID的ORACLE_HOME裡。

解決完這個問題,有些客戶端可以連線了,但是有些客戶端報:ORA-01017: invalid username/password。於是我做了一些測試,發現在10.2.0.4版本的客戶端連線會報ORA-01017,而10.2.0.5的版本可以正常連線,11.2.0.3、11.2.0.4和12.2.0.1的客戶端也都沒有問題,其它版本沒有找到相關客戶端,也就沒有測試。

這裡已經設定了10g客戶端可以連線12.2的資料庫,但為什麼10.2.0.4的客戶端還會報ORA-01017口令錯誤,而10.2.0.5客戶端就可以連線。

經過檢查,在Oracle 12c的資料庫中(其實從11g開始就有了),dba_users檢視上有個欄位是password_versions,該值情況如下:

SQL>set linesize200

SQL>column username format a15

SQL>column account_status format a18

SQL>column default_tablespace format a25

SQL>column password_versions format a20

SQL>select username,account_status,default_tablespace,created,password_versions from dba_users where username='SUXING';

USERNAME ACCOUNT_STATUS DEFAULT_TABLESPACE CREATED PASSWORD_VERSIONS

-------------------------------------------------------------------------------

SUXING OPEN TBS_SU_TS_S12017-06-0621:36:1911G12C

password_versions表明當前SUXING使用者口令的認證方式是11g和12c,所以10.2.0.4客戶端連線出現了問題。那如何支援10g的認證方式呢,其實很簡單,只要確認sqlnet.ora中的SQLNET.ALLOWED_LOGON_VERSION_SERVER和SQLNET.ALLOWED_LOGON_VERSION_CLIENT已經設定為10,然後使用alert user xxx identified by xxxxxx後,PASSWORD_VERSIONS就支援10g的認證方式了,如下:

SQL>set linesize200

SQL>column username format a15

SQL>column account_status format a18

SQL>column default_tablespace format a25

SQL>column password_versions format a20

SQL>select username,account_status,default_tablespace,created,password_versions from dba_users where username='SUXING';

USERNAME ACCOUNT_STATUS DEFAULT_TABLESPACE CREATED PASSWORD_VERSIONS

-------------------------------------------------------------------------------

SUXING OPEN TBS_SU_TS_S12017-06-0621:36:1910G11G12C

所以整個問題的過程如下:在Oracle 12c上安裝建庫並遷移資料後,由於前期未設定SQLNET.ALLOWED_LOGON_VERSION_SERVER和SQLNET.ALLOWED_LOGON_VERSION_CLIENT為10,導致建立的使用者不支援10g的口令認證方式。而修改這兩個sqlnet引數後,資料庫裡使用者的口令認證方式未發生變化,所以10.2.0.4客戶端連線不上伺服器,報ORA-01017。使用alert user xxx identified by xxxxxx修改口令後,由於sqlnet中的這兩個引數已經修改為支援10g客戶端的連線,所以dba_user中的password_versions也相應地修改為支援10g的認證方式,所以10.2.0.4版本的客戶就可以連線資料庫了。

所以當一些客戶端是10.2.0.4的應用需要注意了,如果資料庫伺服器使用資料遷移的方式升級到Oracle 12c,需要注意在Oracle 12c中使用者口令是否支援10g的認證方式,否則遷移後就報默名其妙的口令錯誤,10.2.0.5版本的客戶端測試沒有問題。

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

相關文章