Oracle 文件權限 expdp 與 dbms_datapump
我們使用對 dbms_datapump 的呼叫編寫了自己的導出函式。在某些系統中,由於所選目錄的文件權限不足,導出失敗。但是,使用 expdp 執行導出到同一目錄的工作。
我正在尋找這種不同行為的解釋。expdp 會話是否在與數據庫伺服器不同的作業系統使用者下執行?那會是什麼使用者?
編輯:我們已經看到使用在使用者會話中執行的 utl_file 和在計劃作業中執行的文件寫入之間存在相同的差異。
- 我假設數據庫在 Linux 作業系統上執行。
- 我假設您使用 tns-connection 字元串(可能來自不同的機器)使用 sqldeveloper 之類的工具連接到數據庫
- 我假設您從數據庫伺服器啟動 expdp,而不是使用 tns-connection 字元串,而是設置 ORACLE_SID 並創建本地連接。
那麼,是的,有可能發生這種奇怪的事情。
在您的一條評論中,您寫道“兩者都作為數據庫中的作業執行”。這不是正確的術語。兩者都是數據庫中的會話,並且兩個會話都有一個對應於會話的 Linux 程序:所謂的影子程序。有更複雜的配置,但我假設這是一個。
那麼你的兩個會話有什麼區別?您連接到數據庫的方式和創建影子程序的方式。
對於使用 tns-connectstring 的 sqldeveloper,該工具會聯繫偵聽器,並且偵聽器程序執行 oracle 二進製文件以創建程序(影子程序)。如果您使用本地連接直接在伺服器上執行 expdp 工具,則 expdp 工具會執行 Oracle 二進製文件以創建程序。
還有其他情況可以得到這樣的結果,例如使用 RAC 數據庫。兩個節點上的數據庫目錄指向具有不同權限的本地目錄。
但是如果沒有更詳細的資訊,進一步調查是沒有意義的。
在這兩種情況下都使用 tns-connection,以便以相同的方式創建影子程序。
在實際導出數據時,expdp 和 DBMS_DATAPUMP 是一回事。’expdp’ 只是一個二進製文件,它啟動儲存過程並執行一些終端操作。
嘗試寫入文件系統的使用者始終是執行數據庫軟體的使用者——例如,在大多數情況下,它可能是“oracle”。這不會改變。
我建議您仔細檢查您的 expdp 命令行參數和參數文件內容是否與您的 DBMS_DATAPUMP 參數相同。
另外(我知道這聽起來像我很粗魯,但真的)仔細檢查你是否真的在同一個數據庫上執行……如果你的 expdp 命令行上有 TNS 條目,你絕對確定他們指出你認為他們做什麼?