Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
<Insert Picture Here>
夜な夜な! なにわオラクル塾 Presented By アシスト #48
Oracle Database データロード、Export/Import
1
2016年4月20日
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved. 2
OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Program Agenda
Oracle Databaseのデータ・ローディング
Export/Import
Oracle Database からのCSVアンロード
知っておきたい便利な使い方
まとめ
3
1
2
3
4
5
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved. 4
Oracle Databaseのデータ・ローディング
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Oracle Databaseのデータ・ローディング
データ・ロードの種類
• 中間ファイルを利用するもの
• exp/impユーティリティ、Data Pump(expdp/impdp)ユーティリティ
• SQL*Loaderユーティリティ
• 外部表機能
• トランスポータブル表領域機能 (ソース側のデータベースはEnterprise
Edition必須)
• ネットワークを利用するもの
• 分散処理機能(データベース・リンク + SQL)
• Oracle Data Integrator (ETLツール)
• Oracle GoldenGate(リアルタイム・レプリケーション・ツール) (リアルタイムにデータ連携、データ移行、データベース・アップグレード等で利用)
5
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Oracle Databaseのデータ・ローディング
主にテキスト・ファイルの内容をロードする
• 外部ファイルのデータをOracle Databaseの表に格納
• ユーティリティ(SQL*Loader)の利用
• Oracle Databaseの機能(外部表)を利用
6
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loaderの概要
• Oracle Databaseに付属しているユーティリティのひとつ
• SQL*Loaderの制御ファイルを用意することで、
外部ファイルからの柔軟なローディングをおこないます
7
廃棄ファイル
不良ファイル
ログ・ファイル 制御ファイル
Oracle Database
表
SQL*Loader
外部ファイル
•外部ファイルの場所 •ファイル形式(固定長、可変長) •データの挿入先となる表 •外部ファイル内のデータと表カラムの紐付け
•SQL*Loader実行ログを格納 (ロード件数、エラー情報など)
•条件等が合わず、ローディング されなかったレコードを格納 •エラーによりローディング されなかったデータを格納
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loaderの実行時モード
従来型パス・モード / ダイレクト・パス・モード
• 柔軟性、高速性に応じた実行モードを用意
• 柔軟) 従来型パス・モード
• 内部的にINSERT文を作成しINSERTを実行
• 高速) ダイレクト・パス・モード
• 内部的にINSERTを実行しません
• ブロック(ORACLE_BLOCK=I/Oの単位)イメージを生成し、
物理的に直接書込みます(=ダイレクト・ロード)
• いくつかの制限事項があります
8
表ロック取得
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loaderのパラレル処理
パラレル・ダイレクト・パス
• 同一の表もしくはパーティション表の同一パーティションに対して
同時にダイレクト・パス・ロードを実行できます
• あらかじめ準備が必要です • SQL*Loaderの同時実行数分、外部ファイル(データ)を分割
• 外部ファイルにあわせて制御ファイルを作成(もしくは実行時にパラメータ DATA で外部ファイルを指定)
• 実行時にパラメータ PALALLEL=TRUE を指定します
9
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loader使用例
制御ファイルの作成
• 外部ファイルのフォーマット、ロード先の表の情報をもとに制御ファイルを作成
10
emp表の定義
制御ファイル:emp.ctl
LOAD DATA
INTO TABLE emp
APPEND
FIELDS TERMINATED BY ','
(
empno,
ename,
hiredate DATE 'YYYYMMDD',
job,
junk FILLER,
deptno
)
SQL> DESCRIBE emp 名前 NULL? 型 --------- -------- ------------ EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2)
1001,ichiro,20001025,SALESMAN,junk,10
1002,jiro,20011125,ANALYST,junk,20
1003,saburo,20021225,MANAGER,junk,30
外部ファイル:emp.dat ・カンマ区切りの可変長
・日付は8桁の数字列(YYYYMMDD)
・表のカラムすべてと1:1に紐付けできない
・表にロードすべきでないデータ「junk」が存在する
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loader使用例
実行例
• 従来型パス・モード
• ダイレクト・パス・モード
• パラレル・ダイレクト・パス・モード
11
% sqlldr scott/xx CONTROL=emp.ctl DATA=emp.dat
% sqlldr scott/xx CONTROL=emp.ctl DATA=emp.dat DIRECT=true
% sqlldr scott/xx CONTROL=emp.ctl DATA=emp1.dat LOG=emp1.log DIRECT=true PARALLEL=true &
% sqlldr scott/xx CONTROL=emp.ctl DATA=emp2.dat LOG=emp2.log DIRECT=true PARALLEL=true &
事前に主キーを無効にしておくか、
パラメータ SKIP_INDEX_MAINTENANCE = true をセットします
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loaderのロード方式性能比較
従来型パス・モード vs ダイレクト・パス・モード
• ダイレクト・パス・モードは従来型パス・モードに比べ非常に高速
12
0.19
1.00
0.00 0.20 0.40 0.60 0.80 1.00
ダイレクト・パス・ロード
従来型パス・ロード
emp表(カラム構成が単純)へのロード(10,000,000件)の比較例 (従来型パス・ロードを1としたときの相対時間)
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
外部表
外部ファイルにあるデータをデータベース内に表があるかのようにアクセスする
•既存のSQL*Loader機能を補足する機能
•データベースに表がある場合と同様に、外部ソースのデータにアクセス可能 • テキストファイル or バイナリファイル
13
外部ファイル
Oracle Database
表 外部表 INSERT INTO
SELECT
任意のSQL関数を利用した変換処理 ダイレクト・パス・インサート パラレル・ロード 圧縮済ファイルの使用(11g R2以降)
利用例:ステージング表を作成しないデータロード
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
テキストファイル or バイナリファイル
アクセス・ドライバの利用イメージ • ORACLE_LOADER
• 外部ファイルはテキスト・データ・ファイルのみ
• 圧縮されたテキスト・データ・ファイルも利用可能
• PREPROCESSOR指定
• ORACLE_DATAPUMP
• 当アクセス・ドライバでUNLOADしたファイルを利用
• 外部ファイルはプラットフォーム非依存のバイナリ・ファイル
• Data Pump(expdp)のdmpファイルは利用できません
• ORACLE_LOADERアクセス・ドライバに比べ高速
• 外部ファイルの圧縮、暗号化が可能
• UNLOADで生成した外部ファイルは、
Oracle Database相互のデータ交換で利用します
14
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
外部表の使用例(1)
使用前の準備
•外部表を置くOS上のディレクトリを決め、Oracle Databaseの ディレクトリ・オブジェクトを作成します
•外部表を作成するOracle Database上のユーザに対し、 ディレクトリ・オブジェクトの権限を付与します
15
% sqlplus / as sysdba SQL> CREATE DIRECTORY ext_tbls AS '/app/oracle/admin/orcl/ext_tbls';
SQL> GRANT READ ON DIRECTORY ext_tbls TO scott; SQL> GRANT WRITE ON DIRECTORY ext_tbls TO scott;
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
外部表の使用例(2)
ORACLE_LOADERアクセス・ドライバを使用した定義
• 外部ファイル(テキスト・ファイル)の構造をもとに外部表を定義します
16
1001,ichiro,20001025,SALESMAN,junk,10
1002,jiro,20011125,ANALYST,junk,20
1003,saburo,20021225,MANAGER,junk,30
外部ファイル:ext_emp.dat
•カンマ区切りの可変長
•日付は8桁の数字列(YYYYMMDD)
•表のカラムすべてと1:1に紐付けできない
•表にロードすべきでないデータ「junk」が存在する
CREATE TABLE ext_emp (
empno NUMBER(4),
ename VARCHAR2(10),
job VARCHAR2(9),
hiredate DATE,
deptno NUMBER(2)
)ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ext_tbls
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ','(
empno CHAR(4),
ename CHAR(10),
hiredate CHAR(8) date_format DATE mask "YYYYMMDD",
job CHAR(9),
junk CHAR(4),
deptno CHAR(2)
)
) LOCATION ('ext_emp.dat')
);
外部ファイルの
定義文
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
外部表の使用例(3)
ORACLE_LOADERアクセス・ドライバを使用した実行
• 外部表へのSELECT文の実行
• 実行時のログファイル等の出力
17
SQL> select * from ext_emp; EMPNO ENAME JOB HIREDATE DEPTNO ---------- ---------- --------- -------- ---------- 1001 ichiro SALESMAN 00-10-25 10 1002 jiro ANALYST 01-11-25 20 1003 saburo MANAGER 02-12-25 30
指定ディレクトリに
・ログファイル
・不良ファイル(対象データがあれば) ・廃棄ファイル(対象データがあれば)
が出力されます
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
外部表の使用例(4)
ORACLE_DATAPUMPアクセス・ドライバを使用した定義
•外部表の作成の一環として外部ファイル(ダンプファイル)を作成します
•作成済外部ファイルを利用して外部表を作成します
18
CREATE TABLE ext_emp_ul ORGANIZATION EXTERNAL ( TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY ext_tbls LOCATION ('ext_emp_ul.dmp') ) AS SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno FROM emp ;
CREATE TABLE ext_emp ( empno NUMBER(4), ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2), deptno NUMBER(2) ) ORGANIZATION EXTERNAL ( TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY ext_tbls LOCATION ('ext_emp_ul.dmp') ) ; 外部ファイル作成 外部ファイル利用
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
外部表の前処理
ORACLE_LOADERアクセス・ドライバのPREPROCESSOR句
• 前処理プログラムを使用することで、アクセス・ドライバがサポートしていない形式のファイルを外部ファイルとして利用できます
• 圧縮された外部ファイルを解凍
• 前処理プログラムを置くディレクトリ・オブジェクトの作成、権限付与を行います
19
CREATE TABLE ext_emp ( empno NUMBER(4), ename VARCHAR2(10), job VARCHAR2(9), hiredate DATE, deptno NUMBER(2) ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY ext_tbls ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE PREPROCESSOR exec_dir:'zcat' FIELDS TERMINATED BY ','( ... ) ) LOCATION ('ext_emp.dat.gz') );
外部ファイル の定義文
% cd /app/oracle/admin/orcl/exec_dir % ln -s /bin/zcat % sqlplus / as sysdba SQL> CREATE DIRECTORY exec_dir AS '/app/oracle/admin/orcl/exec_dir'; SQL> GRANT READ ON DIRECTORY exec_dir TO scott; SQL> GRANT EXECUTE ON DIRECTORY exec_dir TO scott;
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
外部表を利用したデータ・ローディング
• DML文(INSERT / UPDATE / MERGE / DELETE)をそのまま使用します
• アクセス・ドライバ種別も意識せず、透過的に利用できます
• SQL*Loaderと同様、ダイレクト・ロードも可能です
• SQL*Loaderのダイレクト・パスと同様、HWMより後ろのブロックを使用します
• ロード処理をPL/SQLでそのままバッチ処理の一部として取り込む事ができます
20
INSERT INTO emp SELECT * FROM ext_emp; 外部表
INSERT /*+ APPEND */ INTO emp SELECT * FROM ext_emp; 外部表
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loaderと外部表の比較
ステージング表の利用
• 業務アプリケーションが利用している表にそのままデータをロードすることは ほとんどありません
• 通常、ステージング表(*1)に一度データをロードした後、エラーチェックや変換処理を行ったあと、業務アプリケーション用の表にロードします
• 外部表を利用すると、多くの場合でステージング表にロードする工程を
省くことができます
21
SQL*Loader利用 (ステージング表使用)
外部表利用 (ステージング表未使用)
(*1):ステージング表とは、データの変換処理やロードの準備の為に設けた一時的な中間表のこと
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loaderと外部表の比較
バッファ・キャッシュの利用
• ステージング表として利用している永続表への問い合わせ処理は基本的にOracle Databaseのバッファ・キャッシュを経由します
• 2回目以降のアクセスは高速化できます
• 必要に応じて、既存のキャッシュを破棄する場合があります
• 外部表への問い合わせ処理はOracle Databaseのバッファ・キャッシュを経由しません
• 既存のキャッシュを破棄せずに処理をおこなうことができます
• 複数回のアクセスはキャッシュがないため非効率となる場合があります
→ 複数回アクセスする場合はステージング表にロードします
22
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loaderと外部表の比較
外部表のパラレル処理
• 外部表の参照の場合、永続表と同様にパラレル処理が可能 • テーブルの属性としてパラレル度数を設定
• セッション単位で設定(ALTER SESSION)
• ヒントによる設定
• ORACLE_LOADERアクセス・ドライバは制約があるので注意
• 文字の境界が文字列中の任意のバイトで始まり、境界を判断できないマルチバイト・キャラクタ・セット(SJIS、EUC)を含む可変長データはパラレル処理が出来ません(UTF-8は問題なし)
• SQL*Loaderは事前に外部ファイルを分割する必要があるため、手間がかかります
23
ALTER SESSION FORCE PARALLEL QUERY; ALTER SESSION FORCE PARALLEL DDL; INSERT /*+ APPEND */ INTO emp SELECT * FROM ext_emp;
外部表を使用した パラレル処理の例
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loaderと外部表の比較
SQL*Loaderと外部表の使い分け
• SQL*Loaderに適した処理
• ネットワークを介したデータのロード
• 複合オブジェクト・リレーショナル・データの任意のロード
• セカンダリ・ファイルを使用したLOBおよびコレクションのロード
• 定常的ではない、一時的なローディング(手早い)
•基本的には外部表を使用したロードをおこないます
• 任意のSQL関数を利用した変換処理
• ダイレクト・パス・インサート
• パラレル・ロード(ファイル分割不要)
• 圧縮済ファイルの使用
24
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
外部表のアクセス・ドライバ性能比較
ORACLE_LOADER vs ORACLE_DATAPUMP
• ORACLE_DATAPUMPで利用する外部ファイルは バイナリであり、型変換がほとんど発生しない
• Oracle Database間のデータ連携ではORACLE_DATAPUMPアクセス・ドライバの利用を推奨
25
0.84
1.00
0.00 0.20 0.40 0.60 0.80 1.00
ORACLE_DATAPUMP
ORACLE_LOADER
emp表(カラム構成が単純)へのロード(10,000,000件)の比較例(ORACLE_LOADERアクセス・ドライバを1としたときの相対時間)
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
EXPORT/IMPORT
26
Export / Import
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Export/Importとは
データベース間のデータ の移動を可能にします
•データベース間のデータ の移動を可能にしています
27
エクスポート
インポート
• 通称、このOSファイルのことをダンプ・ファイルと呼んでいます
このダンプファイルはバイナリ形式であり、エクスポートインポート ユーティリティのみで読み書きがなされます • FTPなどを使用して別サイトに転送、または物理的に移送(テープの場合)できます
エクスポート対象のオブジェクトを抽出し、 OS上のファイルに書き込まれます
ダンプ・ファイルからオブジェクトの定義および表データを読み込みます
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Export/Importの用途
論理バックアップの取得
28
Database
Backup Database
論理バックアップは、様々な状況で物理バックアップを補足するために役立ちます ただ、論理バックアップをリストアするためには物理バックアップを再構築して、 Oracleサーバーで使用できるようにする必要があります よって、論理バックアップは、物理バックアップを補うために使用する事を推奨します
Exportユーティリティで論理バックアップを取得します Importユーティリティを使用して、 再インポート可能です
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Export/Importの用途
データベースのバージョンアップ
29
ハードウェアが老朽化してきたから、そろそろハードウェアのリプレイスをしないと・・・・
このタイミングでOracle Databaseもバージョンアップしよう!
バージョンアップするとなると、
データを移行する必要があるな・・・
Export/Importでデータを移行しよう!
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Export/Importの種類
• オリジナルのExport/Import
• expおよびimpコマンドで起動するオリジナルの エクスポート・ユーティリティおよびインポート・ユーティリティです
• Oracle Database11g では非推奨(原則としてサポートされなくなりました)
• Data Pump
• Oracle Database10gから搭載されたexpdpおよびimpdpコマンドで起動する エクスポート・ユーティリティおよびインポート・ ユーティリティです
• データのロード・アンロードを高速に行うことができます
30
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
オリジナルのExport/Import 概要図
31
Import Utility
IMP Oracle Net
Export Utility
EXP
xxx.dmp
Oracle Database
Oracle Net
ダンプ・ファイルはクライアント側に格納されます
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Data Pump 概要図
32
Oracle Net
PL/SQL Package Access Driver
Oracle Database
expdp/impdpの実行エンジン
Import Utility
impdp Oracle Net
Export Utility
expdp
xxx.dmp
ダンプ・ファイルはサーバー側に 格納されます
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
コマンドからのExport/Importの起動
• 次のコマンドからExport/Importを起動できます
33
表モード ユーザー・モード 表領域モード 全データベース・モード
exp(imp) ユーザ名/パスワード エクスポートするモード ダンプファイル
Ex. exp(imp) scott/tiger owner=scott file=exp.dmp
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Export – オリジナル –
モード 機能説明 パラメータ
フル データベース全体のエクスポート FULL=y
ユーザー 指定したユーザー全体のエクスポート OWNER=user[, …]
テーブル 指定したテーブル全体のエクスポート TABLES=table[, …]
テーブルスペース 指定したテーブルスペース全体のエクスポート
TABLESPACES=tablespace[, …]
EXPで利用可能なモード
例1: > exp scott/tiger full=y
例2: > exp scott/tiger file=exp.dmp tables=(emp,dept)
フルモード
テーブルモード
Export Utility
EXP expおよびimpコマンドで起動する オリジナルのエクスポート・ユーティリティ
フル・モードでの注意点 SYSが所有する オブジェクト、およびORDSYS、CTXSYS、 MDSYS およびORDPLUGINSスキーマはエクスポートされません
オリジナル
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Import – オリジナル –
Import Utility
IMP impコマンドで起動する オリジナルのインポート・ユーティリティ
COMMAND > imp scott/tiger tables=emp,dept
IMPでは、EXPで使用できたパラメータのほとんどを利用することができます
IMPでパラメータを指定することにより、EXPで作成したダンプファイルからさらに対象データを絞りこんでインポートすることが可能です
ダンプファイルからemp表とdept表のみをインポート
COMMAND > imp scott/tiger owner=scott
ダンプファイルからscottユーザーのオブジェクトをインポート
オリジナル
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Data Pump とは
• Oracle Database10gから導入されたユーティリティです
• Data Pumpテクノロジを使用すると、
データおよびメタデータをデータベース間で非常に高速に移動できます
36
利用方法 • expdp/impdpコマンド • Oracle Enterprise Manager • DBMS_Data Pump PL/SQLパッケージ • その他、外部表などのエンジンとして内部利用
Data Pump
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Data Pumpのここがすごい!
ダイレクトパスAPIの改善による処理速度向上
• エクスポート:オリジナルのExportに比べて2倍高速
• インポート:オリジナルのImportに比べて15~40倍高速
37
Data Pumpを使用したら 速くなった!
Data Pumpは、大量データを扱う大きなジョブ向き! Data Pumpでは、マスター表を作成するためのオーバー
ヘッドによって小さなジョブは遅くなりますが、大量のデータを高速に処理することは、中・大規模なジョブにとって大きなメリットとなります!
Data Pump
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Export/Import – 出力先ディレクトリの指定
• Data Pumpではクライアントではなくサーバーにより書き込みが行われるため、
処理を行うディレクトリ位置が特定されている必要があります
• ダンプファイルを出力するディレクトリに対して、DB上でディレクトリオブジェクトを作成します実行時には、ディレクトリオブジェクトをDIRECTORYパラメータで指定します
• パラメータでディレクトリを指定していない場合、OS環境変数「DATA_PUMP_DIR」、なければ ディレクトリオブジェクト「DATA_PUMP_DIR」が参照されます
38
Data Pump
SQL > CREATE DIRECTORY DPUMP_DIR1 AS ‘/home/oracle/oradata/dpump_dir’;
SQL > GRANT READ, WRITE ON DIRECTORY dpump_dir1 TO scott;
COMMAND > expdp scott/tiger tables=emp,dept directory=dpump_dir1 権限付与
ディレクトリオブジェクト作成
環境変数の設定 COMMAND > set DATA_PUMP_DIR=DPUMP_DIR1; export DATA_PUMP_DIR
COMMAND > expdp scott/tiger schemas=scott
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Tips
• Oracle RAC構成でData Pumpまたは外部表を使用するには、ディレクトリ・オブジェクトのパスが
クラスタ・ファイル・システム上に存在するようにする必要があります
• この目的で使用できる共有ストレージが構成内にない場合にも並列処理が必要であれば、CLUSTER=noパラメータを使用して、すべてのワーカー・プロセスを、Data Pumpジョブが開始されたインスタンスのみに置くことができます
• ASMを使用可能にした場合のディレクトリ・オブジェクトの使用方法
SQL> CREATE or REPLACE DIRECTORY dpump_dir as '+DATAFILES/‘;
• ログ・ファイル用の個別のディレクトリ・オブジェクトの作成
SQL> CREATE or REPLACE DIRECTORY dpump_log as
'/homedir/user1/‘;
• 使用例
> expdp hr DIRECTORY=dpump_dir DUMPFILE=hr.dmp
LOGFILE=dpump_log:hr.log
39
Data Pump
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Export – Data Pump –
40
オリジナルのexportと同様の操作性をもった エクスポートユーティリティ
モード 機能説明 パラメータ
フル データベース全体のエクスポート FULL=y
スキーマ 指定したスキーマ全体のエクスポート SCHEMAS=schema[, …]
テーブル 指定したテーブル全体のエクスポート TABLES=table[, …]
テーブルスペース 指定したテーブルスペース全体のエクスポート
TABLESPACES=tablespace[, …]
expdpで利用可能なモード
例1: > expdp scott/tiger full=y
例2: > expdp scott/tiger dumpfile=exp.dmp tables=emp,dept
フルモード
テーブルモード
Export Utility
expdp
Data Pump
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
フィルタ処理を行います
41
エクスポートの対象から除外するオブジェクトをEXCLUDEパラメータで指定します
COMMAND > expdp scott/tiger exclude=index:¥”LIKE ¥’EMP%¥’¥”
LIKEやINを指定することも可能です ※空白等を区切り文字にしないためにダブルクオーテーションが
必要ですが、OSによってはエスケープ文字が必要となります従っ
て、通常はパラメータを記述したファイルを読み込ませると便利です
※INCLUDEとEXCLUDEパラメータは排他的で、同時に指定できません
COMMAND > expdp scott/tiger include=index
フィルタ処理を行い、エクスポートの対象となるオブジェクトを細かく設定することができます
INCLUDE / EXCLUDE
Data Pump
エクスポートの対象オブジェクトをINCLUDEパラメータで指定します
COMMAND > expdp scott/tiger include=table
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
データのフィルタ処理を行います
42
Data Pump
フィルタ処理を行い、エクスポートの対象となるデータを細かく設定することができます
エクスポート対象表のセットから行のサブセットを選択できます
例:職種がSALESMANで、給与が1600より少ない従業員のみをエクスポートする場合
COMMAND > expdp scott/tiger TABLES=emp QUERY=¥"WHERE job=¥'SALESMAN¥' and sal ¥<1600¥"
サンプリングしてソース・データベースからアンロードするデータ行の割合を指定できます
例:SCOTTのEMP表の50%がエクスポートされます
COMMAND > expdp scott/tiger tables=emp SAMPLE=“SCOTT"."EMP":50
QUERY / SAMPLE
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
ファイルサイズを指定します
43
Data Pump
各ダンプ・ファイルがそのサイズを上限とし、置換変数(%U)を持つテンプレートを指定していてダンプ・ファイルを分割します
サイズが3MBのダンプ・ファイルを設定する
COMMAND > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=hr_3m.dmp FILESIZE=3MB
3MBでもすべてのエクスポート・データを保持するのに十分でなかった場合、次のエラーが表示され、ジョブは中止されます
ORA-39095: Dump file space has been exhausted: Unable to allocate 217088 bytes
FILESIZE
ファイル指定に置換変数が含まれている場合は、新しいファイルが作成されます
COMMAND > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=hr_3m%U.dmp FILESIZE=3MB
キロバイト(KB)、メガバイト(MB)、 ギガバイト(GB)を付けて指定する事もできます
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
フラッシュバック・モードを指定します
44
指定したSCNもしくは時刻における一貫性を維持したデータの エクスポートが可能です
あるSCNにおける一貫性を維持したデータをエクスポートするために FLASHBACK_SCNパラメータを指定します
COMMAND > expdp scott/tiger flashback_scn=364909 SCN指定
ある時刻における一貫性を維持したデータをエクスポートするために FLASHBACK_TIMEパラメータを指定します
COMMAND > cat parfile.txt
FLASHBACK_TIME=“TO_TIMESTAMP(‘2004/03/20 10:00’,’YYYY/MM/DD HH:MI’)”
COMMAND > expdp scott/tiger parfile=parfile.txt
時刻指定
TO_TIMESTAMP()で時刻を指定 エスケープ文字が必要となるので、 パラメータファイルで指定
FLASHBACK_SCN / FLASHBACK_TIME
Data Pump
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
パラレル・エクスポートを指定します
45
Data Pump
エクスポート処理をパラレルで行うことが可能です
並列度をPARALLELパラメータで指定します
出力先ディレクトリをそれぞれ指定することも可能です
COMMAND > expdp scott/tiger parallel=3 dumpfile=dpump_dir1:expdat%U.dmp, dpump_dir2%U.dmp
COMMAND > ls –lR
dpump_dir1:
…….expdat01.dmp
…….expdat02.dmp
dpump_dir2:
…….expdat01.dmp
置き換え変数(%U)を指定しない場合、dumpfileのファイル数はparallelの値に合わせる必要があります指定している場合、
指定されたファイル指定がラウンドロビンに使用されます
並列度の指定
生成されたダンプ ファイルセットの確認
PARALLEL
※要Enterprise Edition
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
ダンプファイルのサイズの見積もります
46
ESTIMATE
ダンプファイルを生成せず、生成されるダンプファイルのサイズを 見積もることが可能です
見積もりのモードをESTIMATEパラメータで指定します
パラメータ値には次のどちらかを設定します
BLOCKS ・・・ ブロックサイズにオブジェクトのブロック数をかけて見積もります (精度は高くありません)
STATISTICS ・・・ 統計情報を元に見積もります
見積もりのみ出力する場合には、ESTIMATE_ONLY=yを指定します
COMMAND > expdp scott/tiger tables=emp,dept estimate=blocks estimate_only=y
Data Pump
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Import – Data Pump –
47
Data Pump
COMMAND > impdp scott/tiger tables=emp,dept
Import Utility
impdp
impdpでは、expdpで使用できたパラメータのほとんどを利用することができます
impdpでパラメータを指定することにより、expdpで作成したダンプファイルからさらに対象データを絞りこんでインポートすることが可能です
ダンプファイルからemp表とdept表のみをインポート
COMMAND > impdp scott/tiger include=index
ダンプファイルから索引のみをインポート
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
ネットワーク・リンクを使用します
48
Data Pump
NETWORK_LINK
データベース・リンクを使用して、リモートデータベースから直接ローカルデータベースにインポートを行うことができます
参考:エクスポートのネットワーク・リンク指定は、リモートデータベースのデータをローカルにエクスポートする機能ですインポートの場合には直接ローカルデータベースに書き込むので、ダンプファイルを作成しません
COMMAND > impdp scott/tiger tables=emp,dept directory=dpump_dir network_link=scott.jp.oracle.com
接続するリモートデータベースを、NETWORK_LINKパラメータで指定します 指定する値はデータベース・リンク名です
DB LINKの指定
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
ORACLE DATABASE からのCSVアンロード
49
Oracle Database からのCSVアンロード
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
なぜCSVでロード / アンロードしたいのか?
• RDBMS製品間のデータ交換
• Oracle Database から他社RDBMSへ
• 他社RDBMSから Oracle Database へ
• 業務処理(本番環境)としてデータ交換を行なっている
• 検証・開発用にデータをベンダーに提供する
50
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
CSVロード / アンロードに関する問題
• CSVはフォーマット・エラーが発生しやすい
• ローディングが行えず、検証/開発が始まらない
• Oracle Database には CSVアンローダーが存在しない
• どのような手法でアンロードするかが性能に大きく影響する
• CSVフォーマット・エラーが発生しやすい
51
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
CSVフォーマットとは
• 狭義では CSV = Comma-Separated Values [RFC4180]
• フィールド終端: , レコード終端: CRLF
• 広義では CSV = Character-Separated Values
• フィールド終端とレコード終端が特定の文字
• 狭義のCSVを使いがちだが
ほとんどのソフトウェアが広義のCSVに対応している
• 狭義のCSVはフォーマット・エラーを起こしやすい
52
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
フォーマット・エラーの例
データにフィールド終端が含まれている
abc def 1,234
uvw xyz 7,890
53
abc def 1 234
uvw xyz 7 890
abc,def,1,234 uvw,xyz,7,890 2列に分割されてしまっている
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
望ましい対応例
終端記号をデータに含まれない文字にする
• 例)フィールド終端: タブ(^I) abc^Idef^I1,234
uvw^Ixyz^I7,890
• タブ区切りテキスト (TSV) は Microsoft Excel 含め、
対応ソフトウェアが多いので利用しやすい
• 注意: ユーザーが自由入力できるアプリケーション
(textarea要素を含むWebアプリケーションなど)では
データにタブが含まれることが少なくない
54
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
ORACLE_LOADERの場合のよい対応例
終端記号にマイナーなASCII制御文字を使用する
• ORACLE_LOADERドライバー(SQL*Loader含む)は
ASCII制御文字を含むあらゆる文字に対応できる
• 例)フィールド終端: ユニット分離標識(^_) レコード終端: レコード分離標識(^^) abc^_def^_1,234^^uvw^_xyz^_7,890
• マイナーなASCII制御文字がデータに含まれている確率はほぼゼロ
• Vimでは Ctrl + V → Ctrl + ^ でASCII制御文字を入力可能
• 制御ファイルでは DELIMITED BY X'1E' のように16進数指定も可能
55
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
ORACLE_LOADERの場合の間違いやすい対応例1
エンクロージャでは解決できない
• エンクロージャ " を追加する
"abc","def","1,234"
• データに " は含まれていないか? → 含まれている → エラー
"abc","def","1'23""
• データに " が含まれていないことが確実なのであれば、
フィールド終端を " にするだけで解決
abc"def"1,234
56
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
ORACLE_LOADERの場合の間違いやすい対応例2
エンクロージャをつけても、レコード終端はデータに含められない
• ORACLE_LOADERドライバー(SQL*Loader含む)は
エンクロージャを使ってもデータにレコード終端を含められない
例)フィールド終端: , レコード終端: 改行 エンクロージャ: “
”abc“,”def“,”12
34“
→ エラー: 2番目の囲み文字列がありません
• 可変レコード形式 (VAR) を使った対応方法もあるが、
レコード終端を改行から別のASCII制御文字に変更したほうが簡単
57
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
ORACLE_LOADERの場合の間違いやすい対応例3
エスケープ文字は使用できない
• ORACLE_LOADERドライバー(SQL*Loader含む)は
エスケープ文字でフィールド終端とレコード終端を無効化できない
例)フィールド終端: , レコード終端: 改行
abc,def,1¥,234
uvw,xyz,78¥
90
58
abc def 1¥ ,234
uvw xyz 78¥
90
単なる文字として扱われる
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
ORACLE_LOADERの場合の間違いやすい対応例4
文字列にしても解決できない
• ORACLE_LOADERドライバー(SQL*Loader含む)は
文字 “列” に対応できるが、これで常に解決できるわけではない
• 例)フィールド終端: ,,
abc,,def,,1,234 ← 一見良さそう
uvw,,xy,,,7,890 ← 想定外の区切り
59
uvw xy ,7,890
区切りがずれている
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved. 60
知っておきたい便利な使い方
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
複数の表をExportし、データのみをImportしたい
61
オリジナル / Data Pump
複数の表を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に設定します
以下のように、関連する参照整合性制約を disableし、 Import後に参照整合性制約を enable にすると、エラーを解消できます
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Exportダンプから一部データを取り出す方法
62
オリジナル / Data Pump
誤って一部データを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;
以下のように削除したデータを エクスポートのダンプ・ファイルより取り出せます
注)エクスポートした時点のデータと削除したデータが一致するかは不明であるため、 この例の場合emp_id=100のデータに関して、 エクスポート時と誤って削除した時が 同じであったことを前提と しています
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
索引作成文を受け取る方法 -オリジナル-
63
オリジナル
エクスポート・ファイルのCREATE TABLE文もコメントとして含まれます
Option INDEXFILE
デフォルト なし
用途 索引作成文を受け取るファイルを指定します
使用例 imp scott/tiger TABLES=(wendy.emp) INDEXFILE=‘index.txt’
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
さらにData PumpではすべてのSQL文を
受け取れます
64
Data Pump
Option SQLFILE
デフォルト なし
用途 インポートが他のパラメータに基づいて実行するすべてのSQL
DDLの書込み先のファイルを指定します
使用例 impdp scott/tiger TABLES=(wendy.emp) SQLFILE=‘index.txt’
注意: パスワードは、SQLファイルに含まれないことに注意してください たとえば、実行したDDLにCONNECT文が含まれている場合、 その文はコメントで置き換えられ、スキーマ名のみが表示されます
例:TEST_TABLE表をインポートする際のSQLFILEを受け取る場合
impdp oradirect/oradirect dumpfile=test_table.dmp tables=test_table sqlfile=sqlfile.txt
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQLFILEの一例
65
Data Pump
CREATE TABLE文や CREATE INDEX文を 確認する事ができます
さらにINSERT文も 確認する事ができます
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Data Pump 圧縮
データやメタデータを圧縮してダンプファイルにエクスポートできる
• COMPRESSION={ALL | DATA_ONLY | METADATA_ONLY | NONE}
• NONE...エクスポート操作全体について圧縮が無効
• METADATA_ONLY(default)...全ての“メタデータ”が圧縮形式で
ダンプ・ファイルへ書き込み
(以下の操作はAdvanced Compressionオプションが必要)
• DATA_ONLY...全ての“データ”が圧縮形式でダンプ・ファイルへ書き込み
• ALL...データ、メタデータともに圧縮
• (例)スキーマを指定し、メタデータ、データともに圧縮してダンプ・ファイルscott.dmp
へエクスポート
66
$ expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott.dmp COMPRESSION=ALL SCHEMAS=scott
Data Pump
Advanced Compression Option
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Data Pump 暗号化
データやメタデータを暗号化してダンプファイルにエクスポートできる
• ENCRYPTION = {ALL | DATA_ONLY | ENCRYPTED_COLUMNS_ONLY |
METADATA_ONLY | NONE}
• ALL:すべてのデータおよびメタデータについて暗号化が有効
• DATA_ONLY:データのみが暗号化
• ENCRYPTED_COLUMNS_ONLY:暗号化された列のみが暗号化される
• METADATA_ONLY:メタデータのみが暗号化
• NONE:データは暗号化されない
• (例)ダンプ・ファイルでデータのみが暗号化されるエクスポート操作
67
$ expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott_enc.dmp SCHEMAS=scott ENCRYPTION=data_only ENCRYPTION_PASSWORD=tiger
Data Pump
Advanced Security Option
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Direct NFS(dNFS)の概要
• dNFSとは
• Oracle Database内部に実装されたNFSクライアント機能
• Oracle Database 11g Release 1から使用可能
• dNFSの特徴
1. OSカーネルのNFSクライアント(kNFS)より高いディスクI/O性能
2. 簡単な手順で機能を有効化
• アプリケーションの書き換えは必要ない
• ストレージの構成や運用に影響はない
• 複数イーサネット・ポートを使用したネットワーク帯域のスケーラビリティの設定が簡単
68
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loader及び外部表でのdNFSの使用
• SQL*Loader及び外部表の入力ファイルに対して、dNFSを使用したアクセスが可能
• ファイルサイズに応じて自動でdNFSが利用される
• 1GB以上の入力ファイルに対しては、自動でdNFSを使用したアクセスを実行
• 1GB以下の入力ファイルに対しては、kNFSを使用したアクセスを実行
• 明示的にdNFSによるアクセスを実行したい場合は、DNFS_ENABLEパラメータをENABLEに指定する
• dNFSによる読み取りバッファ数に対して制限をかけることも可能
• DNFS_READBUFFERSパラメータの値を変更する
69
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loader/外部表での使用方法
明示的な設定方法 • SQL*Loader での使用方法
1. 明示的にdNFSを使用して入力ファイルにアクセスする場合
2. 明示的にdNFSを使用せずに入力ファイルにアクセスする場合
• 外部表での使用方法
• access パラメータのDNFS_ENABLE/ DNFS_DISABLEで指定する
• 外部表でdNFSが利用されるのは、ORACLE_LOADERを使用した場合
• ORACLE_DATAPUMPでは使用できない
70
$ sqlldr username/password control=control_file DNFS_ENABLE=TRUE
$ sqlldr username/password control=control_file DNFS_ENABLE=FALSE
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Data PumpでのLOB記憶域の変更
• Data Pump(impdp)で、インポートするLOBをSecureFilesに変更可能
• Oracle Database 11gまで:従来のリリースまでは、LOBをインポートする時にexpdpをしたLOBの属性のままでしかインポートできなかった
• Oracle Database 12cでは:TRANSFORMパラメータのLOB_STORAGEオプションでLOBの属性を変更可能
• 設定方法
• TRANSFORM=LOB_STORAGE:[SECUREFILE | BASICFILE | DEFAULT | NO_CHANGE]をimpdp時に指定する
• デフォルトはNO_CHANGE(変更しない)
71
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
Data PumpでのLOB記憶域の変更
実行例
72
SQL> select table_name,column_name,securefile from user_lobs;
TABLE_NAME COLUMN_NAME SEC
-------------------- -------------------- ---
T1 C1 NO
$ expdp test/test directory=datapump_dir tables=t1
…中略…
ジョブ"TEST"."SYS_EXPORT_TABLE_01"が月 9月 2 17:59:43 2013 elapsed 0 00:00:24で正常に完了しました
$ impdp test/test directory=datapump_dir transform=LOB_STORAGE:SECUREFILE
…中略…
ジョブ"TEST"."SYS_IMPORT_FULL_01"が月 9月 2 17:33:35 2013 elapsed 0 00:00:02で正常に完了しました
SQL> select table_name,column_name,securefile from user_lobs;
TABLE_NAME COLUMN_NAME SEC
-------------------- -------------------- ---
T1 C1 YES
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
参考)SQL*LoaderによるLOBのロード
• LOB値を別ファイルから読み込むことができます
73
1 disk.bmp 2 book.bmp
LOAD DATA INFILE test.dat INTO TABLE lob_tab TRUNCATE FIELDS TERMINATED BY WHITESPACE OPTIONALLY ENCLOSED BY '"' ( id integer external, ext_fname FILLER CHAR(10), blob_col lobfile(ext_fname) terminated by EOF )
制御ファイル
データ・ファイル:test.dat
カレント・フォルダに存在すること
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
参考)DMLエラー・ロギング
• INSERT、UPDATE、MERGE、DELETE文で利用可能
• これまでは大量の行を対象とした単一のDMLにエラーが発生すると処理の すべてがロールバックされていました
• 上記DMLに「ERROR LOGS」句をつけることで利用します
• エラー・ロギング表(上記のERR$_EMP)は DBMS_ERRLOG パッケージで作成
• 実行DMLとエラーロギング表への書き込みトランザクションは分離
• DML操作に失敗したデータを記録する為のものであり、 すべてのエラーを書き込むものではありません 例) ORA-01653(領域不足)、ORA-01555
74
INSERT INTO emp (empno, ename, dptno, sal) ( SELECT empno, ename, dptno, sal FROM ext_emp ) LOG ERRORS INTO ERR$_EMP ('WEEKLY_BATCH') REJECT LIMIT 50;
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
参考)エラー・ロギング表の例
75
INSERT INTO emp (empno,ename,dptno,sal) (SELECT empno,ename,dptno*1000,sal FROM ext_emp WHERE empno = 1) LOG ERRORS INTO ERR$_EMP ('WEEKLY_BATCH') REJECT LIMIT 50;
UPDATE emp SET dptno = dptno*1000 WHERE empno = 20 LOG ERRORS INTO ERR$_EMP ('WEEKLY_BATCH2') REJECT LIMIT 50;
INSERT でエラー発生 UPDATE でエラー発生
対象となるROWID
故意に桁あふれ 故意に桁あふれ
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loader Express Mode
外部データの取り込み、データ・ローディングが簡単に
• シンプルなデータを簡単にロード
• 制御ファイルの作成が不要、実行時に必要なファイルはデータのみ (パラメータを指定したカスタマイズも可能)
• 通常のSQL*Loader よりも高速なロード
• 外部表を経由したロード
• 外部表の作成・削除を自動実行
• ダイレクト・インサートによりデータをロード
• ロードを実行せず、SQL文だけの生成も可能
76
$ sqlldr scott/tiger table=EMP
制御ファイルは不要
7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20 7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30 7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30 ……
EMP.dat 表名.dat
• 列データは「,」で区切る
• 行データは「改行」で区切る
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loader Expressモード
デフォルト動作
• 外部表を経由したロード
• ロード中に外部表の作成・削除を自動実行
• 外部表を使用して、ロードするデータを参照
• ダイレクト・インサートによりデータをロード
• ロードを実行せず、SQL文だけの生成も可能
• EXTERNAL_TABLE パラメータで制御
• EXECUTE (デフォルト) : 外部表を使用してロード
• NOT_USED : 従来型モードでロード
• GENERATE_ONLY : SQL 文のみ生成
77
Direct Insert
参照
EMP
外部表
$ sqlldr scott/tiger table=EMP
データファイル emp.dat
1
2
3
4
5
5
ロード完了
6
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loader Expressモード
デフォルト動作 • データファイルの指定
• カレントディレクトリの「<表名>.dat」を読み込む
• DATA パラメータで任意のファイルの読み込みも可能
• 単一ファイルの読み込み
• 複数ファイルの読み込み
• 複数ファイルのデータを一括ロード
78
$ sqlldr scott/tiger table=EMP data=emp.dat
$ sqlldr scott/tiger table=EMP data='emp*.dat'
$ sqlldr scott/tiger table=EMP data='emp?.dat'
任意の値・文字列を含むファイル (ex) emp.dat, emp1.dat, emp10.dat
任意の値(1文字)を含むファイル (ex) emp1.dat, emp2.dat, emp3.dat
$ sqlldr scott/tiger table=EMP data='emp1.dat','emp2.dat'
$ sqlldr scott/tiger table=EMP data=emp1.dat data=emp2.dat
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
SQL*Loader Expressモード
出力ファイル • 実行時に以下のファイルが出力される
• <表名>.log
• SQL*Loader 実行時のログファイル
• SQL*Loader から実行されている SQL 文も参照可能
• <表名>_<実行プロセスのPID>.log_xt
• Database 上での処理実行時のログファイル
• エラー発生時にはそのエラー情報を出力
• <表名>_<PID>.bad
• ロードできなかったデータ
• ロード時にエラーが発生した場合のみ出力される
• DATA パラメータ指定時は「 <最初のDATAファイル名>_<PID>.bad」となる
79
$ sqlldr scott/tiger table=EMP
• emp.log • emp_21300.log_xt • emp_21300.bad
$ sqlldr scott/tiger table=EMP DATA=emp1.dat, emp2.dat
• emp.log • emp_21301.log_xt • emp_21302.log_xt • emp_21301.bad • emp_21302.bad
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
まとめ
• Oracle Databaseにおいて2種類のテキスト・ファイルからのデータ・ロード
方法があります
• SQL*Loader
• 外部表を使用したローディング
• SQL*Loaderは以前のバージョンから提供されており、馴染み深いのですが、
現在は外部表の利用が主流です
• 外部表を利用することでデータ・ロードをSQLで柔軟におこなえます
• エクスポート・インポートの種類は2種類
• オリジナルのExport/ImportとData Pump
• Oracle Database 10gからはData Pumpを使用する
• ダイレクト・パス・ロードで高速な移行を実現
• Oracle Database 12cからはSQL*Loader Express Modeも検討
• Optionコマンドを使って、最適なExport/Importを実現
• Advanced Compressionで圧縮して高速化を実現
• セキュリティを高めたいなら、Advanced Security
80
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved. 81
Appendix HWMを下げるオペレーション
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
参考)ダイレクト・ロードとHWM
ハイウォーターマーク(HWM)とは
• テーブルに割り当てたブロックの中で、いままでデータが挿入されたことのある最後尾のブロック
• ハイウォーターマーク(High Water Mark):高水位標
• テーブルのフルスキャン時にはHWMまで読み取ります
• メリット:テーブルの大きさに対してデータ量が少ない場合、高速に検索できる
• デメリット: 大量削除などでHWM以前の空きが多い場合、実レコード数に比較して時間がかかる
82
HWM
データ格納済
ブロック
空き ブロック
HWM
空き ブロック テーブルのフルスキャン
HWM
データ格納済
ブロック
空き ブロック
データ削除 空き ブロック
HWM
空き ブロック テーブルのフルスキャン
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
参考)ダイレクト・ロードとHWM
ダイレクト・ロードの書込み
• ダイレクト・ロードはHWMの後ろにデータを書き込みます
• ブロック・イメージを作成し直接物理的に書き込む為、使用中の
ブロックを利用しません
• ダイレクト・ロードは書込み速度は速いが、利用できない空き領域
(HWMよりも前の空き領域)がでてきます
• データ削除が頻繁に発生する表にダイレクト・ロードを行う際はHWMを下げるような運用も検討します
83
HWM
データ格納済
ブロック
空き ブロック
ダイレクト・ロードによる データ書込み開始ブロック
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
HWMを下げるオペレーション
• 業務的に対象表にアクセスさせない状態で実施
1. 論理バックアップユーティリティ(EMP/IMP) + 元表削除(DROP)
2. CREATE AS SELECT + TRUNCATE + INSERT SELECT
3. CREATE AS SELECT + 元表削除(DROP) + RENAME
4. ALTER TABLE <表名> MOVE TABLESPACE <表領域名>)
※ 索引等のメンテナンスも必須
• オンライン状態で実施
1. オンライン表再定義(Enterprise Edition機能)
2. オンライン・セグメント縮小(標準機能)
84
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
HWMを下げるオペレーション
オンライン・セグメント縮小
• オンライン・セグメント縮小
• 業務でテーブルを利用中でもセグメント縮小が可能
• 自動セグメント領域管理(ASSM)のみ利用可能
85
ALTER TABLE <表名> ENABLE ROW MOVEMENT; ALTER TABLE <表名> SHRINK SPACE[CASCADE];
① ②
データの移動 HWMの移動
③
領域の解放 HWM 空き領域
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved. 86
Appendix オリジナル exp/imp
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
エクスポートするオブジェクトを指定します
87
オリジナル
トリガー:TRIGGERS
オブジェクトの指定
制約、権限、索引、トリガーをエクスポートするか指定します
権限:GRANTS
索引:INDEXES
制約:CONSTRAINTS
COMMAND > EXP scott/tiger TABLES=(wendy.emp) GRANT=n
COMMAND > EXP scott/tiger TABLES=(wendy.emp) TRIGGERS=n
COMMAND > EXP scott/tiger TABLES=(wendy.emp) INDEXES=n
COMMAND > EXP scott/tiger TABLES=(wendy.emp) CONSTRAINTS=n
デフォルトはすべて y になります
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
データの一貫性を維持できるよう指定します
88
オリジナル
エクスポート・ユーティリティによって読み込まれたデータのある時点における一貫性を維持し、expコマンドの実行中に変更されないように指定します
COMMAND > EXP scott/tiger TABLES=(wendy.emp) CONSISTENT=n
CONSISTENT指定
CONSISTENT
注意: ユーザーSYSとして接続しているとき、またはAS SYSDBAを使用しているとき (あるいはその両方)に実行するエクスポートでは、CONSISTENT=yはサポートされません
デフォルトはCONSISTENT=nです
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
2人のユーザーによる更新時のイベントの順序
89
オリジナル
時系列
ユーザB
TABLE1の エクスポート開始
TABLE1、TABLE2の更新 トランザクションのコミット
TABLE1の エクスポート終了
TABLE2の エクスポート開始
CONSISTENT = n の場合 ・・・ TABLE2の更新は書き込まれますが、 TABLE1の更新は書き込まれません CONSISTENT = y の場合 ・・・ TABLE1、TABLE2の更新ともに書き込まれません
• 読み取り一貫性の確保を実現 エクスポート開始した時点の整合性が確保できている状態で、 データをエクスポートできます
ユーザA
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
ダイレクト・パス・エクスポートの使用を指定します
90
オリジナル
従来型パス・エクスポートに比べて非常に高速なダイレクト・パス・ エクスポートの使用を指定します
COMMAND > EXP scott/tiger TABLES=(wendy.emp) DIRECT=y
ダイレクト・パス・ロードの指定
DIRECT
デフォルトはDIRECT=nです
注意: 次の場合は、ダイレクトエクスポートは使用できません • 対話方式でのエクスポートの起動 • 表領域モード( TRANSPORT_TABLESPACES=Y ) • Queryパラメータの指定
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
従来型とダイレクト・パス・ロードの違い
91
オリジナル
Oracle専用の メモリ領域
①エクスポートの実行
③データをディスクからバッファ・キャッシュへ読み込み
④行はクライアント・プロセスにある評価バッファ
に転送します
従来型パス・ロードによるエクスポート
②SELECT文発行
⑤式の評価が終了すると、エクスポート・ファイルに書き出さます
評価バッファ
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
従来型とダイレクト・パス・ロードの違い
92
Oracle専用の メモリ領域
ダイレクト・パス・ロードによるエクスポート
評価バッファ ①エクスポートの実行
②データをディスクからバッファ・キャッシュへ読み込み
③評価バッファをバイパスし、エクスポートファイルに書き出されます
評価バッファをバイパスするため、 従来型パス・エクスポートに比べ 非常に高速です
オリジナル
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved.
オブジェクト作成エラーの処理方法を指定します
93
オリジナル
IGNORE=yに指定すると、データベース・オブジェクトの作成時に作成エラーが発生しても、このエラーは無視され、エラーはレポートされずに継続します
COMMAND > IMP scott/tiger FILE=exp.dmp IGNORE=y
エラーを無視するよう指定
IGNORE
デフォルトはIGNORE=nですこの場合、オブジェクト作成エラーがログに記録
または表示されて、インポートが停止します
表がすでに存在する場合
IGNORE=yを指定すると、行は既存の表にインポートされます(エラー/メッセージは出力なし)
IGNORE=nを指定すると、エラーがレポートされ、表は行が挿入されないまま
スキップされますまた、表に依存するオブジェクトは作成されません
Copyright© 2016, Oracle & K.K.Ashisuto All rights reserved. 95
ご清聴ありがとうございました。
株式会社アシスト 西日本支社