ネットワーク・リンク
NETWORK_LINK
データベース・リンクを使用して、リモートデータベースから直接ローカル データベースにインポートを行うことができます参考:エクスポートのネットワーク・リンク指定は、リモートデータベースのデータを ローカルにエクスポートする機能です。インポートの場合には直接ローカル データベースに書き込むので、ダンプファイルを作成しません。
COMMAND > impdp scott/tiger tables=emp,dept directory=dpump_dir network_link=scott.jp.oracle.com
接続するリモートデータベースを、
NETWORK_LINK
パラメータで指定します。指定する値はデータベース・リンク名です。
Oracle Databaseからの
CSVアンロード
なぜ CSV でロード / アンロードしたいのか?
• RDBMS 製品間のデータ交換
– Oracle Database から他社 RDBMS へ – 他社 RDBMS から Oracle Database へ
• 業務処理 ( 本番環境 ) としてデータ交換を行なっている
• 検証・開発用にデータをベンダーに提供する
CSV ロード / アンロードに関する問題
• CSV はフォーマット・エラーが発生しやすい
– ローディングが行えず、 PoC( 導入前実機検証 ) や開発等の実作業が始めら れない
• Oracle Database には CSV アンローダーが存在しない
– どのような手法でアンロードするかが性能に大きく影響する
– CSV フォーマット・エラーが発生しやすい
CSV フォーマットとは
• 狭義では CSV = Comma-Separated Values [RFC4180]
– フィールド終端 : , レコード終端 : CRLF
• 広義では CSV = Character-Separated Values
– フィールド終端とレコード終端が特定の文字
• 狭義の CSV を使いがちだが
ほとんどのソフトウェアが広義の CSV に対応している
• 狭義の CSV はフォーマット・エラーを起こしやすい
フォーマット・エラー
abc def 1,234
uvw xyz 7,890
データにフィールド終端が含まれている
abc def 1 234
uvw xyz 7 890
abc,def,1,234
uvw,xyz,7,890 2
列に分割されてしまっている正しい対応例
• 例)フィールド終端 : タブ( ^I ) abc^Idef^I1,234
uvw^Ixyz^I7,890
• タブ区切りテキスト (TSV) は Microsoft Excel 含め、
対応ソフトウェアが多いので利用しやすい
• 注意 : ユーザーが自由入力できるアプリケーション
( textarea 要素を含む Web アプリケーションなど)では
データにタブが含まれることが少なくない
終端記号をデータに含まれない文字にする
ORACLE_LOADER での最適な対応例
• ORACLE_LOADER ドライバー( SQL*Loader 含む)は
ASCII 制御文字を含むあらゆる文字に対応できる
• 例)フィールド終端 : ユニット分離標識( ^_) レコード終端 : レコード分離標識( ^^ )
abc^_def^_1,234^^uvw^_xyz^_7,890
• マイナーな ASCII 制御文字がデータに含まれている確率はほぼゼロ
• Vim では Ctrl + V → Ctrl + ^ で ASCII 制御文字を入力可能
• 制御ファイルでは DELIMITED BY X'1E' のように 16 進数指定も可能
終端記号にマイナーな ASCII 制御文字を使用する
誤った対応例
• エンクロージャ " を追加する
"abc","def","1,234"
• データに " は含まれていないか? → 含まれている → エラー
"abc","def","1'23""
• データに " が含まれていないことが確実なのであれば、
フィールド終端を " にするだけで解決 abc"def"1,234
エンクロージャでは解決できない
ORACLE_LOADER で間違いやすい対応例 1
• ORACLE_LOADER ドライバー( SQL*Loader 含む)は
エンクロージャを使ってもデータにレコード終端を含められない
例)フィールド終端 : , レコード終端 : 改行 エンクロージャ : “
” abc“,” def“,”12 34“
→ エラー : 2 番目の囲み文字列がありません
• 可変レコード形式 (VAR) を使った対応方法もあるが、
レコード終端を改行から別の ASCII 制御文字に変更したほうが簡単
エンクロージャをつけても、レコード終端はデータに含められない
ORACLE_LOADER で間違いやすい対応例 2
• ORACLE_LOADER ドライバー( SQL*Loader 含む)は
エスケープ文字でフィールド終端とレコード終端を無効化できない 例)フィールド終端 : , レコード終端 : 改行
abc,def ,1¥,234 uvw ,xyz,78¥
90
エスケープ文字は使用できない
abc def 1¥ 234
uvw xyz 78¥
90
単なる文字として扱われる
ORACLE_LOADER で間違いやすい対応例 3
• ORACLE_LOADER ドライバー( SQL*Loader 含む)は
文字 “列” に対応できるが、これで常に解決できるわけではない
• 例)フィールド終端 : ,,
abc,,def ,,1,234 ← 一見良さそう uvw ,,xy,,,7,890 ← 想定外の区切り
文字列にしても解決できない
uvw xy ,7,890
区切りがずれている
正しいアプリケーション実装
• 終端記号にマイナーな ASCII 制御文字を使用できないシステムでは 少なくとも 2 個の印字可能文字は、データに含まれないように
RDBMS からの入力時 / RDBMS からの出力時に置き換える
– ISO10646 文字実体参照 : , → ,
– SQL インジェクション対策に合わせて実装する
知っておきたい
便利な使い方
複数の表を Export し、データのみを Import したい
複数の表を
Export
し、データのみをImport
したいが、外部キーが多数あり、整合性制約に違反してしま う・・・
COMMAND> expdp system/manager ;
SQL> alter table emp disable constraint emp_no_fk ;
・・・関連するすべての参照整合性約を
disable
に設定しますCOMMAND> impdp system/manager ;
SQL> alter table emp enable constraints emp_no_fk ;
・・・関連するすべての参照整合性約を
enable
に設定しますA:
以下のように、関連する参照整合性制約をdisable
し、Import
後に参 照整合性制約をenable
にすると、エラーを解消できますオリジナル
/ Data Pump
Export ダンプから一部データを取り出す方法
誤って一部データをdeleteし、
commit してしまった!!
エクスポートのダンプ・ファイル から取り出したい・・・
COMMAND> impdp system/manager
remap_schema=oradirect:dummy
SQL> insert into oradirect.emp select * from dummy.emp where emp_id=100;
SQL> drop table dummy.emp
SQL> delete from oradirect.emp
where emp_id=100;
SQL> commit;
A
:以下のように削除したデータをエクスポートの ダンプ・ファイルより取り出せます注)エクスポートした時点のデータと削除したデータが一致するかは不明であるため、
この例の場合emp_id=100のデータに関して、 エクスポート時と誤って削除した時が 同じであったことを前提と しています
オリジナル / Data Pump
索引作成文を受け取る方法 -オリジナル-
エクスポート・ファイルの CREATE TABLE 文もコメ ントとして含まれます
オリジナル
Option INDEXFILE
デフォルト なし
用途 索引作成文を受け取るファイルを指定します
使用例
imp scott/tiger TABLES=(wendy.emp) INDEXFILE=‘index.txt’
索引作成文を受け取る方法 - Data Pump -
ドキュメント内
スライド 1
(ページ 66-83)