• 検索結果がありません。

DB LINKの指定

ドキュメント内 スライド 1 (ページ 66-83)

ネットワーク・リンク

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)

関連したドキュメント