2020/11/09

20201109-技術-Oracle使用DBMS_DATAPUMP API執行匯入時遇到的問題


(純生活技術日記,沒有什麼機密可言的XDD)

這篇的焦點,就集中於「DBMS_DATAPUMP」這件事!


緣起


在做兩個Oracle DB之間的每月備份這需求,借助於 DBMS_DATAPUMP 的API工具,且達到 檔案不落地的方式,備份到目標的Archive Server.

在DEV環境建置時,遇到「ORA-31626: job does not exist」的問題,卡關卡好久!

在QAT環境建置時,以為會很ok,結果遇到「ORA-31631: privileges are required」的問題,讓我整整三天的時間,翻遍所有文章、問了能問的人,還是無解! 因為DEV OK,而到了QAT 不行,所以比對了兩個環境的:User權限、授權角色….該有的都有,但還是不對。



解決方式:

The gains and pains of dbms_datapump. Part II | Dani's IT Blog
https://danirey.wordpress.com/2009/09/15/the-gains-and-pains-of-dbms_datapump-part-ii/

(這一篇解教了我,完整的寫出 Source 及Target User 所需要的授權)

--Source 授權
--privileges for dbms_datapump
GRANT EXP_FULL_DATABASE TO XXXSOURCEUSER;
GRANT FLASHBACK ANY TABLE TO XXXSOURCEUSER;
GRANT CREATE SESSION TO XXXSOURCEUSER;     
ALTER USER XXXSOURCEUSER DEFAULT ROLE ALL;   --最後是這個解決此問題 !!!ORA-31631: privileges are required
        (註1:不一定要寫’ALL’,而是讓其EXP_FULL_DATABASE 角色 DEFULT_ROLE的flag變為YES )

       (註2:select * from session_roles;  知道每次此User登錄Session時,會預設授與的角色)
GRANT SELECT ON sys.v_$instance TO XXXSOURCEUSER;
GRANT EXECUTE ON sys.dbms_flashback TO XXXSOURCEUSER;


--Target上的授權
--privileges for dbms_datapump
GRANT IMP_FULL_DATABASE TO XXXTARGETUSERARCH;
GRANT DROP USER TO XXXTARGETUSERARCH;
GRANT ALTER USER TO XXXTARGETUSERARCH;
GRANT CREATE SESSION TO XXXTARGETUSERARCH;
GRANT CREATE TABLE TO XXXTARGETUSERARCH;
--GRANT FLASHBACK ANY TABLE TO target_user;
 
ALTER USER XXXTARGETUSERARCH DEFAULT ROLE ALL;
ALTER USER XXXTARGETUSERARCH QUOTA UNLIMITED ON users;
 
GRANT SELECT ON sys.dba_users TO XXXTARGETUSERARCH;
GRANT EXECUTE ON sys.dbms_flashback TO XXXTARGETUSERARCH;


針對Default Role Flag屬性 理解:

SELECT * FROM USER_ROLE_PRIVS; -- 此User的權限 (留意DEFAULT_ROLE欄位)

SELECT * FROM SESSION_ROLES ; --此USER登錄後的Session下的授與角色。

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

此User在登錄後,代表了一個SESSION,而此Session的角色資訊,不一定”等同”於User的角色資訊。

視「DEFAULT_ROLE」的欄位=YES 而定。

若 角色的 DEFAULT_ROLE = YES,則Create Session時,就預設給予該角色。


ALTER USER XXXXXX DEFAULT ROLE ALL;   --將此USER下的角色,全設為DEFAULT_ROLE = YES.

ALTER USER XXXXXX DEFAULT ROLE CONNECT; --只有CONNECT為DEFAULT_ROLE,

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

所以沒留意到「DEFAULT ROLE」這flag時,會發生 明明有將這角色給予此USER,但為何操作時還是說「沒有授權」呢?


結論:

有時,自已的筆記還是要寫完整的前因後果,將所要執行的授權清單整理出來  (且要分出 Source / Target 要執行的授權)

這一次過程中,我將看過的文章下,它所提到的授權,全部LOG下來,一個一個的實驗 (結果全不行)

但至少,我知道了我執行過那一些權限。

只要過了一段時間,沒有「被整理」的筆記,會讓自已完全想不出當時的情境是什麼。


(THE END)