(純生活技術日記,沒有什麼機密可言的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)