欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Oracle數據庫升級到19C用戶登錄報錯問題解決辦法

 更新時間:2024年08月15日 09:46:47   作者:牛牛的筆記  
oracle是一款非常流行的關系型數據庫管理系統(tǒng),被廣泛應用于各個領域,下面這篇文章主要給大家介紹了關于Oracle數據庫升級到19C用戶登錄報錯問題的解決辦法,需要的朋友可以參考下

問題背景

Oracle從低版本遷移到高版本12c、19c之后,在用戶密碼保持不變的情況下,出現用戶密碼登錄報錯的問題,報錯為ORA-28040和ORA-01017。

        ORA-28040: No matching authentication protocol。

        ORA-01017: invalid username/password; logon denied。

問題一:使用低版本的客戶端連接19c數據庫出現ORA-28040報錯

錯誤:ORA-28040: No matching authentication protocol。

原因:數據庫允許客戶端連接版本過高,默認版本為12,導致低版本的客戶端連接認證協議不匹配。

解決方法:

1 調小數據庫服務器允許客戶端連接最小版本,在$ORACLE_HOME/network/admin/sqlnet.ora里面通過設置參數SQLNET.ALLOWED_LOGON_VERSION_SERVER,修改之后立即生效不需要重啟。

SQLNET.ALLOWED_LOGON_VERSION_SERVER=8

2 更新客戶端的連接驅動版本,兼容Oracle12c、19c。

例如:JDBC版本需要11.2.0或以上才能兼容Oracle12c、19c。

OJDBC需要8或以上才能兼容Oracle12c、19c。

JDK版本需要8或以上才能兼容Oracle12c、19c。

問題二:遷移到12c,19c之后,在用戶密碼沒有修改的情況下,用戶密碼登錄出現錯誤ORA-01017

錯誤:ORA-01017: invalid username/password; logon denied

原因:用戶的密碼哈希加密版本與數據庫的密碼認證算法不匹配導致,密碼的哈希加密版本表示用戶密碼使用了哪些版本的加密算法,有4個密碼加密版本10G、11G、12C和HTTP:

        10G: If an old case-insensitive ORCL hash exists,10G的不區(qū)分密碼大小的算法

        11G: If a SHA-1 hash exists

        12C: If a de-optimized PBKDF2-based hash exists

        HTTP: If an MD5 hash (for HTTP Digest authentication) exists

如果用戶的密碼加密算法與數據庫密碼認證算法不匹配,就會出現用戶密碼不正確的報錯。

關于PASSWORD_VERSIONS加密算法的版本生成

Oracle12c、19c默認生成的密碼加密版本為11G,12C,如果想生成10G的版本,需要先在sqlnet.ora里面配置數據庫默認允許客戶端連接版本SQLNET.ALLOWED_LOGON_VERSION_SERVER為低版本,再通過創(chuàng)建用戶或是重置密碼生成。

查詢用戶密碼加密信息。

?set linesize 400
set pagesize 400
col name for a10
col password_version for a15
col password for a40
col SPARE4 for a60
select u.name,decode(bitand(u.spare1, 65536), 65536, NULL, decode(
       REGEXP_INSTR(
         NVL2(u.password, u.password, ' '),
         '^                $'
       ),
       0,
       decode(length(u.password), 16, '10G ', NULL),
       ''
     ) ||
     decode(
       REGEXP_INSTR(
         REGEXP_REPLACE(
           NVL2(u.spare4, u.spare4, ' '),
           'S:000000000000000000000000000000000000000000000000000000000000',
           'not_a_verifier'
         ),
         'S:'
       ),
       0, '', '11G '
     ) ||
     decode(
       REGEXP_INSTR(
         NVL2(u.spare4, u.spare4, ' '),
         'T:'
       ),
       0, '', '12C '
     ) ||
     decode(
       REGEXP_INSTR(
         REGEXP_REPLACE(
           NVL2(u.spare4, u.spare4, ' '),
           'H:00000000000000000000000000000000',
           'not_a_verifier'
         ),
         'H:'
       ),
       0, '', 'HTTP '
     )) as password_version,u.password,u.SPARE4
from user$ u
where name like 'TEST%';

密碼加密算法版本是根據密碼的hash值進行計算生成,10G加密版本的密碼使用的是USER$的PASSWORD列進行存放,長度為16,11G加密版本的密碼為S:開頭,12C加密密碼版本為T:開頭。

關于修改password_versions

password_versions的版本是包含在加密后的密碼里面的,如果想修改用戶的密碼版本,通常需要通過重置密碼才行,不能通過使用user$里面查詢的hash密碼進行修改重置,否則,改完之后密碼版本還是跟原來一樣保持一致。

測試修改password_versions:

--從10G數據庫里面獲取的用戶創(chuàng)建語句和加密后的密碼
 CREATE USER TEST10G IDENTIFIED BY VALUES '70C204055C9E3A1E';
--在19c數據庫進行直接執(zhí)行create user進行創(chuàng)建,可以看到只有PASSWORD_VERSIONS 10G的版本,說明密碼的加密版本是根據加密后的hash密碼進行計算的。
USERNAME                                 PASSWORD_VERSIONS
---------------------------------------- -----------------
TEST10G                                  10G
--在19c數據庫通過明文密碼進行重置,可以看到默認密碼版本重新生成包含11G、12C版本
alter user test10g identified by oracle;
?
?
USERNAME                                 PASSWORD_VERSIONS
---------------------------------------- -----------------
TEST10G                                  11G 12C
?
SQL> 
--在sqlnet.ora配置數據庫服務器允許客戶端連接最小版本為8
[oracle@rac19a admin]$ cat sqlnet.ora 
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
--再重新通過明文密碼進行重置,可以看到在設置允許客戶端連接最小版本為8之后,密碼版本包含10G、11G、12C版本
USERNAME                                 PASSWORD_VERSIONS
---------------------------------------- -----------------
TEST10G                                  10G 11G 12C
?
--創(chuàng)建帶10G,12C加密算法的用戶,T:(12C)+16位的密碼(10G)
 CREATE USER TEST10G12C IDENTIFIED BY VALUES 'T:F27F1408CD6F04D3A569151B2E746C14177229A3052D6B819477A0DB370496355DFEB13DE546064A39A51220E35B8345D030235A00AAB4B6148BA2464E7099247FCD1FCDE8ADC8A37FED9751E1E7A252;9CFF9DBE2FEA9B56';
?
USERNAME                                           PASSWORD_VERSIONS
-------------------------------------------------- -----------------
TEST10G12C                                         10G 12C
?
--創(chuàng)建帶10G,11G加密算法的用戶,S:(11G)+16位的密碼(10G)
CREATE USER TEST10G11G IDENTIFIED BY VALUES 'S:36931834C6D687D4571AF489E2E043722DD1DBC8BEEB39522B0510978681;56D8C02DC8D4AED4';
?
USERNAME                                 PASSWORD_VERSIONS
---------------------------------------- -----------------
TEST10G11G                               10G 11G
?
?
?
--創(chuàng)建帶11G,12G加密算法的用戶,S:(11G)+T:(12C)
CREATE USER TEST11G12C IDENTIFIED BY VALUES 'T:716B0136FDC758F2F5DF45F26AC5C8745EF21FCF1854E4B9C21F420FFF1CE0A99EB5DB6593B579396E4F2C0E3F5C543DC49958F6F6EC5680AB6F018A4D689D25AC0932EA45F77246AB882C82F354219B;S:36931834C6D687D4571AF489E2E043722DD1DBC8BEEB39522B0510978681';
?
USERNAME                                 PASSWORD_VERSIONS
---------------------------------------- -----------------
TEST11G12C                               11G 12C
?
?
--創(chuàng)建只帶12G加密算法的用戶,T:(12C)
CREATE USER TEST12C IDENTIFIED BY VALUES 'T:937995B3C97D239C7E1DBD6216F2A47093CC7F8F593DC901D99DD6FB0EF76BD57E290F23DF57099B7664CB685B3C5114927032D13822CD1E9B4E43B9795A4C3235F24A09855CAA5DCFF447FD2E6AD9CB';
?
USERNAME                                 PASSWORD_VERSIONS
---------------------------------------- -----------------
TEST12C                                  12C

問題二-測試場景1:19c數據庫設置了sec_case_sensitive_logon=false導致ORA-01017

數據庫參數設置了sec_case_sensitive_logon=false數據庫會啟用case-insensitive password-based authentication(10G版本的認證算法,不區(qū)分密碼大小寫)認證,這時候如果用戶密碼的加密算法沒有包含10G的版本,就會出現密碼報錯,因為11g、12c采用的是區(qū)分密碼大小寫的認證,并且12c的密碼認證會與10G版本的認證算法產生沖突。

測試過程:

測試用戶:TEST2(11G,12c),TEST3(10G,11G,12c)
---默認參數為true
SQL> show parameter sec_case_sensitive_logon
?
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sec_case_sensitive_logon             boolean     TRUE
---測試鏈接TEST2,TEST3用戶都可以正常鏈接
[oracle@rac1 ~]$  sqlplus test2/oracle@172.20.10.100:1521/testpdb 
?
SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 11 17:16:45 2024
?
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
?
?
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
?
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
[oracle@rac1 ~]$  sqlplus test3/oracle@172.20.10.100:1521/testpdb 
?
SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 11 17:16:50 2024
?
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
?
?
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
?
SQL> 
---修改參數為false,可以在線改,不能在pdb里面單獨修改
alter system set sec_case_sensitive_logon=false;
---測試TEST2(11G,12c)用戶連接出現ORA-01017
[oracle@rac19a admin]$ sqlplus test2/oracle@172.20.10.100:1521/testpdb 
?
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Mar 11 17:18:22 2024
Version 19.21.0.0.0
?
Copyright (c) 1982, 2022, Oracle.  All rights reserved.
?
?
ERROR:
ORA-01017: invalid username/password; logon denied
?
---測試TEST3(10G,11G,12c)連接正常
[oracle@rac19a admin]$ sqlplus test3/oracle@172.20.10.100:1521/testpdb 
?
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Mar 11 17:18:39 2024
Version 19.21.0.0.0
?
Copyright (c) 1982, 2022, Oracle.  All rights reserved.
?
Last Successful login time: Mon Mar 11 2024 17:16:50 +08:00
?
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0
?
SQL>

建議:在12c之后sec_case_sensitive_logon參數已經被廢棄,只保留參數向下兼容,不建議在12c之后的環(huán)境手動設置該參數為false。

問題二-測試場景2:用戶密碼加密算法沒有包含10G版本,并且客戶端使用了低版本進行連接,連接19c數據庫出現ORA-01017報錯

測試過程:

測試連接用戶TEST2(11G,12c)
---使用10.2.0.5的sqlplus,出現ORA-01017報錯
[oracle@rac1 ~]$  sqlplus test2/oracle@172.20.10.100:1521/testpdb 
?
SQL*Plus: Release 10.2.0.5.0 - Production on Mon Mar 11 17:22:42 2024
?
Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.
?
ERROR:
ORA-01017: invalid username/password; logon denied
?
?
Enter user-name: 
?
---使用高版本的11.2.0.4的sqlplus,測試成功
[oracle@rac1 admin]$ sqlplus test2/oracle@172.20.10.100:1521/testpdb 
?
SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 11 17:23:11 2024
?
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
?
?
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
?
SQL> 
---測試連接用戶TEST3(10G,11G,12c)
---使用10.2.0.5的sqlplus,連接成功
[oracle@rac1 ~]$ sqlplus test3/oracle@172.20.10.100:1521/testpdb 
?
SQL*Plus: Release 10.2.0.5.0 - Production on Mon Apr 15 15:10:50 2024
?
Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.
?
?
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
?
SQL>

建議:

1 客戶端版本需要進行升級,兼容12c、19c版本。

2 對于使用低版本的客戶端連接,用戶的密碼加密版本需要包含10G版本。

問題二-測試場景3:password_versions只有10G版本,連接19c數據庫出現報錯ORA-01017

測試過程:

測試連接用戶TEST10g(10g)
---使用oracle11g的sqlplus連接報錯ORA-01017
[oracle@rac1 admin]$ sqlplus test10g/oracle@172.20.10.100:1521/testpdb 
?
SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 11 17:33:14 2024
?
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
?
ERROR:
ORA-01017: invalid username/password; logon denied
?
?
Enter user-name: ^C
---需要在19c的數據庫服務器上配置允許低版本客戶端連接的SQLNET.ALLOWED_LOGON_VERSION_SERVER,才能正常登錄使用
[oracle@rac1 admin]$ sqlplus test10g/oracle@172.20.10.100:1521/testpdb 
?
SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 11 17:33:25 2024
?
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
?
?
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
?
SQL>
?

建議:對于低版本數據庫遷移到12c之后的數據庫版本,要配置允許客戶端連接版本為低版本,兼容低版本的算法。

關于不同客戶端版本連接ORACLE19C的密碼版本測試

        數據庫:19.21.0.0

        數據庫SQLNET:ALLOWED_LOGON_VERSION_SERVER:8

        測試用戶:

測試結果:

結論:

1 使用10G的客戶端,只要用戶的password_version里面有包含10G加密算法,就可以連接成功。

2 使用11G的客戶端,對于password_version包含單獨的一個加密版本,11G及以下的加密算法都可以連接成功,對于包含兩個及以上的加密版本,需要包含11G加密算法才能連接成功。

3 使用12C的客戶端,password_version不管包含什么版本的加密算法都可以連接成功。

總結

到此這篇關于Oracle數據庫升級到19C用戶登錄報錯問題解決辦法的文章就介紹到這了,更多相關Oracle升級19C用戶登錄報錯內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論