Dbms_datapumpへの呼び出しを使用して、独自のエクスポート関数を作成しました。一部のシステムでは、選択したディレクトリのファイル権限が不十分なため、エクスポートが失敗します。ただし、expdpを使用して同じディレクトリへのエクスポートを実行すると機能します。
この異なる動作の説明を探しています。 expdpセッションは、データベースサーバーとは異なるOSユーザーで実行されますか?そして、それはどのユーザーでしょうか?
編集:ユーザーセッションで実行されているutl_fileを使用したファイルの書き込みと、スケジュールされたジョブで実行されているファイルの書き込みには、同じような違いがあります。
そう、そう、奇妙なことが起こる可能性があります。
あなたのコメントの1つに、「どちらもデータベースでジョブとして実行する」と書いてあります。それは正しい用語ではありません。どちらもデータベース内のセッションであり、両方のセッションには、そのセッションに対応するLinuxプロセス、いわゆるシャドウプロセスがあります。もっと複雑な設定がありますが、私はこれを想定しています。
それでは、2つのセッションの違いは何ですか?データベースへの接続方法とシャドウプロセスが作成されます。
Tns-connectstringを使用するsqldeveloperの場合、ツールはリスナーに接続し、listener-processはOracleバイナリを実行してプロセス(シャドウプロセス)を作成します。ローカル接続を使用してサーバー上でexpdpツールを直接実行する場合、expdpツールはOracleバイナリを実行してプロセスを作成します。
このような結果が得られる状況は他にもあります。 RACデータベースで。データベースのDirectoryは、両方のノード上の異なる権限を持つローカルディレクトリを指します。
しかし、より詳細な情報がなければ、これをさらに調査することは意味がありません。
両方の状況でtns-connectionを使用して、シャドウプロセスが同じ方法で作成されるようにします。
データの実際のエクスポートに関しては、expdpとDBMS_DATAPUMPは同じです。 'expdp'は、ストアドプロシージャを開始し、いくつかの端末処理を行うバイナリです。
ファイルシステムへの書き込みを試みるユーザーは、常にデータベースソフトウェアが実行されているユーザーです。ほとんどの場合、これはおそらく「Oracle」です。これは変更されません。
Expdpコマンドライン引数とパラメーターファイルの内容がDBMS_DATAPUMP引数と同じであることを再確認することをお勧めします。
また、(そして私はこれが失礼なように聞こえますが、本当に)実際に両方が同じデータベースで実行されていることを再確認してください... expdpコマンドラインにTNSエントリがある場合は、本当に確実ですか?彼らはあなたが彼らがやると思う場所を指していますか?