2023年9月27日 星期三

impdp 產生 ORA-39384 錯誤案例

Oracle 版本: 19.15

OS 版本: Aix 7.2


問題描述:

以 schema level 將 11.2.0.4 的使用者 expdp 出來後,將其 impdp 至 19.15 產生了 ORA-39384: Warning: User SCOTT Has Been Locked And The Password Expired 這個錯誤:

Export From 11g DB:

$ expdp \'/ as sysdba\' directory=expdir schemas=scott dumpfile=exp_scott%U.dmp logfile=exp_scott.log


Import to 19c DB:

$ impdp \'/ as sysdba\' directory=impdir dumpfile= exp_scott%U.dmp logfile=imp_scott.log

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.


Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Master table "SYS"."SYS_IMPORT_FULL_01" successfully loaded/unloaded

Starting "SYS"."SYS_IMPORT_FULL_01":  "/******** AS SYSDBA" directory=impdir dumpfile=exp_scott%U.dmp logfile=imp_scott.log 

Processing object type SCHEMA_EXPORT/USER

ORA-39384: Warning: User SCOTT Has Been Locked And The Password Expired


問題分析:

在 impdp 的過程當中,如果資料庫不存在需要的使用者,則會先行建立此使用者,這個訊息就是 impdp 一開始建立使用者的時候發生錯誤,使用者沒有建立起來,後續的物件自然也無法 import 成功。


ORA-39384 顯示使用者被 Locked 或者是密碼過期,可是檢查來源端 11g 的使用者卻沒有 Locked 或是密碼過期,為何 impdp 會無法建立此 User ?


這個問題來自於 Oracle 12c 之後對於安全性的嚴謹度加強,早期資料庫的使用者如果它的 password_versions (select password_versions from dba_users) 為 10G 或是更舊,那麼此使用者 impdp 到 12c 以上的資料庫就會產生此問題。


解決方法:

這個問題的解決思路在於讓 12c 以上的資料庫可以相容於舊資料庫的設定,於 $ORACLE_HOME/network/admin 底下的 sqlnet.ora 設定如下即可正常 impdp :

sqlnet.allowed_logon_version_server = 10

sqlnet.allowed_logon_version_client = 10


ORA-28040: No matching authentication

Oracle 版本: 12.2.0.1

OS 版本: Aix 7.1


問題描述:

在資料庫升級到 12.2.0.1 (或以上版本) 之後, Client 無法連線並出現 ORA-28040: No matching authentication 錯誤。


問題分析:

在資料庫升級之後, Client 端的版本 (Oracle Client 、 JDBC …etc) 沒有一併升級導致兩者不相容所產生的連線問題。


解決方法:

於 $ORACLE_HOME/network/admin 底下的 sqlnet.ora 設定如下,讓資料庫可以相容舊版本的 Client 即可:

sqlnet.allowed_logon_version_server = 8

sqlnet.allowed_logon_version_client = 8