いくつかの特定の要件の下で、Oracle データベース ユーザーのデータのバックアップ/エクスポートおよび復元/インポートを実現しようとしています。すでに解決策を考えていますが、それが正しい方法である場合は、フィードバックをいただければ幸いです。
クライアントでは、jdbc を介してリモート oracle データベースにアクセスできる Java アプリケーションが実行されています。sql*plus
クライアントで ProcessBuilder を介して実行することもできます。クライアントには最低限の権利が必要です。サーバーでは、Oracle Database 10 (またはそれ以上) が実行されています。
目標は
、a) このアプリケーション/ユーザーのデータのみ (およびそれ以降) をエクスポートすること、
b)
リモート データベース サーバーへのファイル アクセスなし (ssh、ftp、Enterprise Manager なし、経由のみ) でデータを他のリモート データベースにインポートすることです。 jdbc、sql*plus、またはその他のクライアント ツール)、およびデータベース インスタンスはサーバー上にデータを作成しないでください。クライアントはファイルを削除できないためです。中間ファイルなしで別のデータベースにデータを直接コピー/複製することは意図されていません。
私のアプローチ
書き出す
i) sql*plus を介してテーブル定義ファイル (tableName.sql) を作成します。
spool tableName.sql
select dbms_metadata.get_ddl('TABLE','tableName','dbUser') from dual;
spool off;
ii) sqlplus と適切な変数 (ラインサイズなど) を使用して、ユーザーのすべてのテーブルのデータをフラットファイル (tableName.txt) に抽出します。
spool tableName.txt;
select * from tableName;
spool off;
輸入
i) 生成された SQL スクリプトを実行してテーブルを作成する
ii) テーブル データをインポートするために sql*Loader を実行します。
sqlldr dbUser/dbPW control=loadTable.control
ここで、loadTable.control は次のとおりです。
load data
infile 'tableName.txt'
into table tableName
fields terminated by ',' optionally enclosed by '"'
TRAILING NULLCOLS
( ... )
現時点では、tableName.txt のフォーマットに問題があり、別の方法がないか自問自答しています。さらに、クライアント/サーバーの文字セットにも問題があると思います。
私の理解が正しければ、データ ポンプ エクスポート/インポート ツールには DATABASE LINK が必要であり、そのためクライアント上で Oracle インスタンスが実行されている必要があります。
RMAN にはあまりにも多くの権限が必要であり、データベース全体のバックアップに重点が置かれていると思います。
いくつかの背景情報
私は、MySQL データベースの同じ手順をすでに実現しています。私は次のようにエクスポートを実装しました: i)すべてのテーブルに対して
テーブル定義ファイル(tableName.sql)を作成する
ii)すべてのテーブルのデータをファイル(tableName.txt)に抽出するSHOW CREATE TABLE
mysql --host=dbHost --port=dbPort --user=dbUser --password=dbPassword --default-character-set=DEFAULT_CHARACTER_SET --quick --database=dbName --execute='Select * from table' > tableName.txt
インポートのために、生成された sql スクリプトを実行してテーブルを作成し、続いて以下を実行します。
LOAD DATA LOCAL INFILE 'tablename.txt' REPLACE INTO TABLE tableName;