Upload
others
View
25
Download
0
Embed Size (px)
Citation preview
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
第4回どさんこオラクル勉強会
今さら聞けないデータロード、Export/Import
Presented By シーズ・ネクスト 2016年1月27日
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものですまた、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さいオラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます
OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です文中の社名、商品名等は各社の商標または登録商標である場合があります
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Oracle Databaseのデータ・ローディング
Export/Import
Oracle Database からのCSVアンロード
知っておきたい便利な使い方
まとめ
Program Agenda
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved. 4
Oracle Databaseの データ・ローディング
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Oracle Databaseのデータ・ローディング
• 中間ファイルを利用するもの
– exp/impユーティリティ、DataPump(expdp/impdp)ユーティリティ
– SQL*Loaderユーティリティ
– 外部表機能
– トランスポータブル表領域機能 (ソース側のデータベースはEnterprise Edition必須)
• ネットワークを利用するもの
– 分散処理機能(データベース・リンク + SQL)
– Oracle Data Integrator (ETLツール)
– Oracle GoldenGate(リアルタイム・レプリケーション・ツール) (リアルタイムにデータ連携、データ移行、データベース・アップグレード等で利用)
データ・ロードの種類
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Oracle Databaseのデータ・ローディング
• 外部ファイルのデータをOracle Databaseの表に格納 –ユーティリティ(SQL*Loader)の利用
– Oracle Databaseの機能(外部表)を利用
主にテキスト・ファイルを利用するもの
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
SQL*Loader(概要)
• Oracle Databaseに付属しているユーティリティのひとつ
• SQL*Loaderの制御ファイルを用意することで、外部ファイルからの柔軟なローディングを実施
外部ファイル
Oracle Database
表
SQL*Loader
制御ファイル ログ・ファイル
廃棄ファイル
不良ファイル
•外部ファイルの場所 •ファイル形式(固定長、可変長) •データの挿入先となる表 •外部ファイル内のデータと表カラムの紐付け
•SQL*Loader実行ログを格納 (ロード件数、エラー情報など)
•条件等が合わず、ローディング されなかったレコードを格納
•エラーによりローディング されなかったデータを格納
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
SQL*Loader実行時モード
• 柔軟性、高速性に応じた実行モードを用意
– 柔軟) 従来型パス・モード
• 内部的にINSERT文を作成しINSERTを実行
– 高速) ダイレクト・パス・モード • 内部的にINSERTを実行しません
• ブロック(ORACLE_BLOCK=I/Oの単位)イメージを生成し、 物理的に直接書込みます(=ダイレクト・ロード)
• いくつかの制限事項があります
従来型パス・モード / ダイレクト・パス・モード
表ロック取得 DBブロック
イメージ作成
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
SQL*Loaderパラレル処理
• 同一の表もしくはパーティション表の同一パーティションに対して 同時にダイレクト・パス・ロードを実行できます
– あらかじめ準備が必要です • SQL*Loaderの同時実行数分、外部ファイル(データ)を分割
• 外部ファイルにあわせて制御ファイルを作成(もしくは実行時にパラメータ DATA で外部ファイルを指定)
– 実行時にパラメータ PALALLEL=TRUE を指定します
パラレル・ダイレクト・パス
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
SQL*Loader使用例
• 外部ファイルのフォーマット、ロード先の表の情報をもとに制御ファイルを作成
制御ファイルの作成
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
emp表の定義 LOAD DATA
INTO TABLE emp
APPEND
FIELDS TERMINATED BY ','
(
empno,
ename,
hiredate DATE 'YYYYMMDD',
job,
junk FILLER,
deptno
)
制御ファイル:emp.ctl
•カンマ区切りの可変長
•日付は8桁の数字列(YYYYMMDD)
•表のカラムすべてと1:1に紐付けできない
•表にロードすべきでないデータ「junk」が存在する
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
SQL*Loader 使用例
• 従来型パス・モード
• ダイレクト・パス・モード
• パラレル・ダイレクト・パス・モード
実行例
% 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 © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
SQL*Loaderロード方式性能比較
• ダイレクト・パス・モードは従来型パス・モードに比べ非常に高速
従来型パス・モード vs ダイレクト・パス・モード
0.19
1.00
0.00 0.20 0.40 0.60 0.80 1.00
ダイレクト・パス・ロード
従来型パス・ロード
emp表(カラム構成が単純)へのロード(10,000,000件)の比較例 (従来型パス・ロードを1としたときの相対時間)
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
外部表(概要)
• Oracle Database内に存在していない表
• アクセス・ドライバを通じてOracle Databaseから読取り専用のアクセスをおこないます – ORACLE_LOADER
– ORACLE_DATAPUMP
• 外部表へのDML(INSERT/UPDATE/DELETE)操作、 索引付けはできませんが、ビューやシノニムを作成できます
• 外部表へのアクセスはバッファ・キャッシュを経由しません(後述)
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
外部表アクセス・ドライバ
• ORACLE_LOADER
• ORACLE_DATAPUMP
– Oracle Database相互で利用
それぞれのアクセス・ドライバの利用イメージ
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
外部表アクセス・ドライバ
• ORACLE_LOADER – 外部ファイルはテキスト・データ・ファイルのみ
– 圧縮されたテキスト・データ・ファイルも利用可能
• PREPROCESSOR指定
• ORACLE_DATAPUMP – 当アクセス・ドライバでUNLOADしたファイルを利用
• 外部ファイルはプラットフォーム非依存のバイナリ・ファイル
• DATAPUMP(expdp)のdmpファイルは利用できません
– UNLOADで生成した外部ファイルは、Oracle Database相互のデータ交換で利用
– 当アクセス・ドライバの機能で外部ファイルの圧縮、暗号化が可能
– ORACLE_LOADERアクセス・ドライバに比べ高速
ORACLE_LOADERとORACLE_DATAPUMP
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
外部表 使用例
• 外部表を置くOS上のディレクトリを決め、Oracle Databaseの ディレクトリ・オブジェクトを作成します
• 外部表を作成するOracle Database上のユーザに対し、 ディレクトリ・オブジェクトの権限を付与します
使用前の準備
% 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 © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
外部表 使用例
• 外部ファイル(テキスト・ファイル)の構造をもとに外部表を定義します
ORACLE_LOADERアクセス・ドライバを使用した定義
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 © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
外部表 使用例
• 外部表へのSELECT文の実行
• 実行時のログファイル等の出力
ORACLE_LOADERアクセス・ドライバを使用した実行
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 © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
外部表 使用例
• 外部表の作成の一環として外部ファイル(ダンプファイル)を作成します
• 作成済外部ファイルを利用して外部表を作成します
ORACLE_DATAPUMPアクセス・ドライバを使用した定義
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 © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
外部表 前処理指定
• 前処理プログラムを使用することで、アクセス・ドライバがサポートしていない形式のファイルを外部ファイルとして利用できます
– 圧縮された外部ファイルを解凍
• 前処理プログラムを置くディレクトリ・オブジェクトの作成、権限付与を行います
ORACLE_LOADERアクセス・ドライバのPREPROCESSOR句 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 © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
外部表を利用したデータ・ローディング
• DML文(INSERT / UPDATE / MERGE / DELETE)をそのまま使用します –アクセス・ドライバ種別も意識せず、透過的に利用できます
• SQL*Loaderと同様、ダイレクト・ロードも可能です – SQL*Loaderのダイレクト・パスと同様、HWMより後ろのブロックを使用します
–ロード処理をPL/SQLでそのままバッチ処理の一部として取り込む事ができます
INSERT INTO emp SELECT * FROM ext_emp;
INSERT /*+ APPEND */ INTO emp SELECT * FROM ext_emp;
準備された外部表
準備された外部表
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
参考)DMLエラー・ロギング
• INSERT、UPDATE、MERGE、DELETE文で利用可能
– これまでは大量の行を対象とした単一のDMLにエラーが発生すると処理の すべてがロールバックされていました
– 上記DMLに「ERROR LOGS」句をつけることで利用します
• エラー・ロギング表(上記のERR$_EMP)は DBMS_ERRLOG パッケージで作成
– 実行DMLとエラーロギング表への書き込みトランザクションは分離
– DML操作に失敗したデータを記録する為のものであり、 すべてのエラーを書き込むものではありません 例) ORA-01653(領域不足)、ORA-01555
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 © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
参考)エラー・ロギング表
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 © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
外部表 アクセス・ドライバ性能比較
• ORACLE_DATAPUMPで利用する外部ファイルは バイナリであり、型変換がほとんど発生しない – Oracle Database間のデータ連携ではORACLE_DATAPUMP アクセス・ドライバの利用を推奨
ORACLE_LOADER vs ORACLE_DATAPUMP
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 © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
SQL*Loaderと外部表の比較
• 業務アプリケーションが利用している表にそのままデータをロードすることは ほとんどありません – 通常、ステージング表(*1)に一度データをロードした後、エラーチェックや変換処理を行ったあと、 業務アプリケーション用の表にロードします
• 外部表を利用すると、多くの場合でステージング表にロードする工程を省くことができます
ステージング表の利用
SQL*Loader利用 (ステージング表使用)
外部表利用 (ステージング表未使用)
(*1):データの変換処理やロードの準備の為に設けた一時的な中間表のこと
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
SQL*Loaderと外部表の比較
• ステージング表として利用している永続表への問い合わせ処理は基本的にOracle Databaseのバッファ・キャッシュを経由します
– 2回目以降のアクセスは高速化できます
– 必要に応じて、既存のキャッシュを破棄する場合があります
• 外部表への問い合わせ処理はOracle Databaseのバッファ・キャッシュを経由しません
– 既存のキャッシュを破棄せずに処理をおこなうことができます
– 複数回のアクセスはキャッシュがないため非効率となる場合があります
→ 複数回アクセスする場合はステージング表にロードします
バッファ・キャッシュの利用
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
SQL*Loaderと外部表の比較
• 外部表参照の場合、永続表と同様にパラレル処理が可能 – テーブルの属性としてパラレル度数を設定
– セッション単位で設定(ALTER SESSION)
– ヒントによる設定
• ORACLE_LOADERアクセス・ドライバも可能だが制約あり 文字の境界が文字列中の任意のバイトで始まり、境界を判断できないマルチバイト・キャラクタ・セット(SJIS、EUC)を含む可変長データはパラレル処理が出来ません(UTF-8は問題なし)
• SQL*Loaderは事前に外部ファイルを分割する必要がある 実行時も複数回SQL*Loaderを指定するので、結果として手間がかかる
外部表のパラレル処理
ALTER SESSION FORCE PARALLEL QUERY;
ALTER SESSION FORCE PARALLEL DDL;
INSERT /*+ APPEND */ INTO emp SELECT * FROM ext_emp;
(外部表を使用したパラレル処理の例)
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
SQL*Loaderと外部表の比較
• SQL*Loaderに適した処理 – ネットワークを介したデータのロード
– 複合オブジェクト・リレーショナル・データの任意のロード
– セカンダリ・ファイルを使用したLOBおよびコレクションのロード
– 定常的ではない、一時的なローディング(手早い)
•基本的には外部表を使用したデータローディング – 任意のSQL関数を利用した変換処理
– ダイレクト・パス・インサート
– パラレル・ロード(ファイル分割不要)
– 圧縮済ファイルの使用
SQL*Loaderと外部表の使い分け
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
参考)SQL*LoaderによるLOBロード
• LOB値を別ファイルから読み込むことができます
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 © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved. 30
Export/Import
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Export/Importとは
• データベース間のデータ の移動を可能にしています
データベース間のデータ 移動
Export
• 通称、このOSファイルのことをダンプ・ファイルと呼んでいます
このダンプファイルはバイナリ形式であり、エクスポートインポート
ユーティリティのみで読み書きがなされます
• FTPを使用して別サイトに転送、または物理的に移送
(テープの場合)できます
エクスポート対象のオブジェクトを抽出し、
OS上のファイルに書き込まれます
ダンプ・ファイルからオブジェクトの定義および
表データを読み込みます Import
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Export/Import 用途 論理バックアップの取得
Database Backup
Database
論理バックアップは、様々な状況で物理バックアップを補足するために役立ちます。
ただ、論理バックアップをリストアするためには物理バックアップを再構築して、
Oracleサーバーで使用できるようにする必要があります。
よって、論理バックアップは、物理バックアップを補うために使用する事を推奨します。
Exportユーティリティで論理バックアップを取得します。
Importユーティリティを使用して、インポート可能です。
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Export/Import 用途 データベースのバージョンアップ
ハードウェアが老朽化してきたから、そろそろハードウェアのリプレイスをしないと・・・・
このタイミングでOracle Database
もバージョンアップしよう!
バージョンアップするとなると、データを移行する必要があるな・・・
Export/Importでデータを移行しよう!
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Export/Import 種類
•オリジナルExport/Import – expおよびimpコマンドで起動するオリジナルの エクスポート・ユーティリティおよびインポート・ユーティリティです
– Oracle Database11g では非推奨(原則としてサポートされなくなりました)
• Data Pump – Oracle Database10gから搭載されたexpdpおよびimpdpコマンドで起動する エクスポート・ユーティリティおよびインポート・ ユーティリティです
– データのロード・アンロードを高速に行うことができます
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
オリジナルExport/Import 概要図 Import Utility
IMP Oracle Net
Oracle Database
Export Utility
EXP
xxx.dmp
ダンプ・ファイルはクライアント側に格納されます
(クライアントで
実行した場合)
Oracle Net
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Data Pump 概要図 Import Utility
IMPDP
Oracle Net
Export Utility
EXPDP
Oracle Net
PL/SQL Package Access Driver xxx.dmp
Oracle Database
ダンプ・ファイルはサーバー側に
格納されます
(クライアント実行時でも)
EXPDP/IMPDP
の実行エンジン
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
オリジナルとData Pumpの違い
• オリジナルExport/Importは、基本的にユーティリティ側で実行されますが、Data Pumpはデータベース・サーバー側で実行されます
サーバ側で実行するData Pumpのメリット
パラレル化が可能
APIにより呼び出しが可能
ジョブ管理・状況監視が可能
停止・再開が可能
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Export/Import 起動
• 次のいずれかの方法を使用して、Export/Importの起動および パラメータの指定ができます –コマンドライン
–対話方式モード(Oracle Enterprise Manager)
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Export/Importを使用する前に
• catexp.sqlまたはcatalog.sqlスクリプトの実行 – スクリプトを実行すると、データベースはエクスポートおよびインポート操作に備えて調整されます
– Export/Importを実行するデータベース上のSYSユーザーで1回実行しておく必要があります
– 通常はデータベースの作成時にcatalog.sqlが実行されているので、改めて実行する必要はありません
データ・ディレクトリへの必要なエクスポート・ビューおよびインポート・ビューの作成
EXP_FULL_DATABASEロールの作成
EXP_FULL_DATABASEおよびIMP_FULL_DATABASEロールへのすべての必要な権限の割当て
DBAロールへのEXP_FULL_DATABASEおよびIMP_FULL_DATABASEの割当て
インストールされているcatexp.sqlのバージョンの記録
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Export/Importを使用する前に
• 十分なディスク領域の確認 –実際にExport/Importを実行するOS上のユーザーが、エクスポート・ファイルの書き込み先のディスク上またはテープ上に、十分な記憶領域があることを確認してください
• アクセス権限の確認 – Export/Importを実行する際に接続するデータベース・ユーザには、 データベースに対するCREATE SESSION権限が必要です また、別のユーザーが所有する表をエクスポートする場合は、 EXP_FULL_ DATABASEロールを付与されている必要があります
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Export/Import 起動(コマンドプロンプト)
• 次のコマンド入力方法でExport/Importを起動できます
表モード
ユーザー・モード
表領域モード
全データベース・モード
exp(imp) ユーザ名/パスワード エクスポートモード ダンプファイル名
Ex. exp(imp) scott/tiger owner=oracle file=exp.dmp
ユーザー・モード
ダンプファイルは実行時のディレクトリに作成
ローカル接続
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. 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コマンドで起動するオリジナルエクスポート・ユーティリティ
フル・モードでの注意点
SYSが所有する オブジェクト、およびORDSYS、CTXSYS、 MDSYS およびORDPLUGINSスキーマはエクスポートされません
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
エクスポートオブジェクト
オブジェクトの指定
COMMAND > EXP scott/tiger TABLES=(wendy.emp) CONSTRAINTS=n
制約、権限、索引、トリガーをエクスポートするか指定します
COMMAND > EXP scott/tiger TABLES=(wendy.emp) GRANT=n
COMMAND > EXP scott/tiger TABLES=(wendy.emp) INDEXES=n
COMMAND > EXP scott/tiger TABLES=(wendy.emp) TRIGGERS=n
権限:GRANTS
索引:INDEXES
制約:CONSTRAINTS
デフォルトはすべて y
トリガー:TRIGGERS
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
データ一貫性
エクスポート・ユーティリティによって読み込まれたデータのある時点における一貫性を維持し、expコマンドの実行中に変更されないように指定します
COMMAND > EXP scott/tiger TABLES=(wendy.emp) CONSISTENT=n
CONSISTENT
注意: ユーザーSYSとして接続しているとき、またはAS SYSDBAを使用しているとき
(あるいはその両方)に実行するエクスポートでは、CONSISTENT=yはサポートされません
デフォルトはCONSISTENT=n
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
データ一貫性 処理の違い
時系列
ユーザB
TABLE1の
エクスポート開始
TABLE1、TABLE2の更新
トランザクションのコミット
TABLE1の
エクスポート終了
TABLE2の
エクスポート開始
CONSISTENT = n の場合 ・・・ TABLE2の更新は書き込まれますが、
TABLE1の更新は書き込まれません
CONSISTENT = y の場合 ・・・ TABLE1、TABLE2の更新ともに書き込まれません
• 読み取り一貫性の確保を実現 エクスポート開始した時点の整合性が確保できている状態で、データをエクスポートできます
ユーザA
2人のユーザーによる更新時のイベント順序
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
ダイレクト・パス・エクスポート
従来型パス・エクスポートに比べて非常に高速なダイレクト・パス・ エクスポートの使用を指定します
COMMAND > EXP scott/tiger TABLES=(wendy.emp) DIRECT=y
DIRECT
デフォルトはDIRECT=n
注意: 次の場合は、ダイレクトエクスポートは使用できません
• 対話方式でのエクスポートの起動
• 表領域モード( TRANSPORT_TABLESPACES=Y ) • Queryパラメータの指定
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
従来型とダイレクト・パス・ロードの違い 従来型パス・ロードによるエクスポート
Oracle専用の
メモリ領域
①エクスポートの実行
③データをディスクからバッファ・キャッシュへ読み込み
④行はクライアント・プロセスにある評価バッファに転送
します
②SELECT文発行
⑤式の評価が終了すると、エクスポート・ファイルに書き出さます
評価バッファ
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
従来型とダイレクト・パス・ロードの違い ダイレクト・パス・ロードによるエクスポート
Oracle専用の
メモリ領域
①エクスポートの実行
②データをディスクからバッファ・キャッシュへ読み込み
③評価バッファをバイパスし、エクスポートファイルに書き出されます
評価バッファをバイパスするため、
従来型パス・エクスポートに比べ
非常に高速です
評価バッファ
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. 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=wendy
ダンプファイルからwendyユーザーのオブジェクトをインポート
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
オブジェクト作成エラー処理
IGNORE=yに指定すると、データベース・オブジェクトの作成時に
作成エラーが発生しても、このエラーは無視され、エラーはレポートされずに継続します
COMMAND > IMP scott/tiger FILE=exp.dmp IGNORE=y
IGNORE
デフォルトはIGNORE=n
• 表がすでに存在する場合
IGNORE=yを指定すると、行は既存の表にインポートされます(エラー/メッセージは出力なし)
IGNORE=nを指定すると、エラーがレポートされ、表は行が挿入されないまま
スキップされます。また、表に依存するオブジェクトは作成されません。
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Data Pump とは
• Oracle Database10gから導入されたユーティリティ – Oracle Data Pumpテクノロジを使用すると、 データおよびメタデータをデータベース間で非常に高速に移動できます
利用方法 • expdp/impdpコマンド
• Oracle Enterprise Manager
• DBMS_DATAPUMP PL/SQLパッケージ
• その他、外部表などのエンジンとして内部利用
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Data Pump 利点
• エクスポート:オリジナルのExportに比べて2倍高速
• インポート:オリジナルのImportに比べて15~40倍高速
ダイレクトパスAPIの改善による処理速度向上
Oracle Data Pumpを使用したら速くなった!
Data Pumpは、大量データを扱う大きなジョブ向き
Data Pumpでは、マスター表を作成するためのオーバーヘッド
によって小さなジョブは遅くなりますが、大量のデータを高速に処理することは、中・大規模なジョブにとって大きなメリットとなります。
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
パフォーマンス検証 検証環境
Sun Enterprise 3000
400MHz * 4CPU
4GB Memory
索引の張られていないテーブル(53partitions21,000,000rows)を用いてData Pumpを使ったエクスポート・インポートと従来のものとを比較する作成されるダンプファイルは1.15GB
750.418
136.45774.708 55.193
0
200
400
600
800
秒
imp impdp impdp(2p) impdp(4p)
従来型インポートと Data Pump インポートの処理時間比較
443.483
80.005 49.664 51.269
0
200
400
600
800
秒
exp expdp expdp(2p) expdp(4p)
従来型エクスポートと Data Pump エクスポートの処理時間比較
従来エクスポートに比べ、Data Pump は2パラレルで
約9分の1の処理時間!!
従来インポートに比べ、Data Pump は4パラレルで約13分の1の処理時間!!
検証内容
検証結果
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Data Pump – 出力先ディレクトリ指定
• Data Pumpではクライアントではなくサーバーにより書き込みが行われるため、処理を行うディレクトリ位置が特定されている必要があります
• ダンプファイルを出力するディレクトリに対してDB上でディレクトリオブジェクトを作成し、実行時にはディレクトリオブジェクトをDIRECTORYパラメータで指定します
• パラメータでディレクトリを指定していない場合、OS環境変数「DATA_PUMP_DIR」、なければ ディレクトリオブジェクト「DATA_PUMP_DIR」が参照されます
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 © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Export – Data Pump –
オリジナル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
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Data Pumpによるデータの移動方法
• 従来型パスを使用したデータ移動
• ダイレクト・パスを使用したデータ移動
• 外部表を使用したデータ移動
• データ・ファイル・コピーを使用したデータ移動(Transportable Tablespace)
• ネットワーク・リンク・インポートを使用したデータ移動 – NETWORK_LINKインポート・パラメータ
注意:データ・ポンプでは、無効な一意索引を持つ表は、ロードされません データを表にロードするには、その索引を削除するかまたは再度有効にする必要があります
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
フィルタ処理
※空白等を区切り文字にしないためにダブルクオーテーションが必要ですが、OSによってはエスケープ文字が必要となります。従って、通常はパラメータを記述したファイルを読み込ませると便利です。
フィルタ処理を行い、エクスポートの対象となるオブジェクトを細かく設定することができます
エクスポートの対象オブジェクトをINCLUDEパラメータで指定します
COMMAND > expdp scott/tiger include=table
エクスポートの対象から除外するオブジェクトをEXCLUDEパラメータで指定します
COMMAND > expdp scott/tiger exclude=index:¥”LIKE ¥’EMP%¥’¥”
LIKEやINを指定することも可能
COMMAND > expdp scott/tiger include=index
INCLUDE / EXCLUDE
※INCLUDEとEXCLUDEパラメータは排他的で、同時に指定できません
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
フィルタ処理 フィルタ処理を行い、エクスポートの対象となるデータを細かく設定することができます
• エクスポート対象表のセットから行のサブセットを選択できます
例:職種が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 © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
ファイルサイズ 各ダンプ・ファイルがそのサイズを上限とし、置換変数(%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 © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
フラッシュバック・モード 指定した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
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
パラレル・エクスポート
エクスポート処理をパラレルで行うことが可能です
並列度を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
Enterprise Edition
置き換え変数(%U)を指定しない場合、dumpfileのファイル数はparallelの値に合わせる必要があります。
指定している場合、指定されたファイル指定がラウンドロビンに使用されます。
生成されたダンプファイルセットの確認
PARALLEL
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
ダンプファイルサイズ事前見積
ESTIMATE ダンプファイルを生成せず、生成されるダンプファイルのサイズを
見積もることが可能です
見積もりのモードをESTIMATEパラメータで指定します
パラメータ値には次のどちらかを設定します
BLOCKS ・・・ ブロックサイズにオブジェクトのブロック数をかけて見積もります
(精度は高くありません)
STATISTICS ・・・ 統計情報を元に見積もります
見積もりのみ出力する場合には、ESTIMATE_ONLY=yを指定します
COMMAND > expdp scott/tiger tables=emp,dept estimate=blocks estimate_only=y
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
見積例 実際にデータを作成し(40万行、2GB)、見積もりの精度を計測。dbms_statsはサンプル100%で実施。
COMMAND > expdp scott/tiger tables=test estimate=blocks estimate_only=y
Estimate in progress using BLOCKS method...
Processing object type TABLE_EXPORT/TABLE/TBL_TABLE_DATA/TABLE/TABLE_DATA
. estimated “SCOTT".“TEST" 3.062 GB
Total estimation using BLOCKS method: 3.062 GB
COMMAND > expdp scott/tiger tables=test estimate=statistics estimate_only=y
Estimate in progress using STATISTICS method...
Processing object type TABLE_EXPORT/TABLE/TBL_TABLE_DATA/TABLE/TABLE_DATA
. estimated “SCOTT".“TEST" 1.947 GB
Total estimation using STATISTICS method: 1.947 GB
COMMAND > ls –l
……. 2092179456 …. expdat.dmp
約1.948GB マスターテーブルの容量が見積もりに入らないため、その分は考慮する必
要があります
BLOCKS
STATISTICS
確認
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. 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
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Import – Data Pump – オリジナルインポートツールと同様の操作性をもった新インポートユーティリティ
Import Utility
IMPDP IMPDPでは、EXPDPで使用できたパラメータのほとんどを利用することができます
IMPDPでパラメータを指定することにより、EXPDPで作成したダンプファイルからさらに対象データを絞りこんでインポートすることが可能です
COMMAND > impdp scott/tiger include=index
COMMAND > impdp scott/tiger tables=emp,dept
ダンプファイルからemp表とdept表のみをインポート
ダンプファイルから索引のみをインポート
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
ネットワーク・リンク
NETWORK_LINK データベース・リンクを使用して、リモートデータベースから直接ローカルデータベースにインポートを行うことができます
参考:エクスポートのネットワーク・リンク指定は、リモートデータベースのデータをローカルにエクスポートする機能です。インポートの場合には直接ローカルデータベースに書き込むので、ダンプファイルを作成しません。
COMMAND > impdp scott/tiger tables=emp,dept directory=dpump_dir
network_link=scott.jp.oracle.com
接続するリモートデータベースを、NETWORK_LINKパラメータで指定します。
指定する値はデータベース・リンク名です。
DB LINKの指定
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved. 67
Oracle Databaseからの CSVアンロード
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
なぜCSVでロード / アンロードしたいのか?
• RDBMS製品間のデータ交換 – Oracle Database から他社RDBMSへ
–他社RDBMSから Oracle Database へ
• 業務処理(本番環境)としてデータ交換を行なっている
• 検証・開発用にデータをベンダーに提供する
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
CSVロード / アンロードに関する問題
• CSVはフォーマット・エラーが発生しやすい –ローディングが行えず、PoC(導入前実機検証)や開発等の実作業が始められない
• Oracle Database には CSVアンローダーが存在しない –どのような手法でアンロードするかが性能に大きく影響する
– CSVフォーマット・エラーが発生しやすい
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
CSVフォーマットとは
• 狭義では CSV = Comma-Separated Values [RFC4180] –フィールド終端: , レコード終端: CRLF
• 広義では CSV = Character-Separated Values –フィールド終端とレコード終端が特定の文字
• 狭義のCSVを使いがちだが ほとんどのソフトウェアが広義のCSVに対応している
• 狭義のCSVはフォーマット・エラーを起こしやすい
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
フォーマット・エラー
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列に分割されてしまっている
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
正しい対応例
• 例)フィールド終端: タブ(^I) abc^Idef^I1,234 uvw^Ixyz^I7,890
• タブ区切りテキスト (TSV) は Microsoft Excel 含め、 対応ソフトウェアが多いので利用しやすい
• 注意: ユーザーが自由入力できるアプリケーション (textarea要素を含むWebアプリケーションなど)では データにタブが含まれることが少なくない
終端記号をデータに含まれない文字にする
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
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制御文字を使用する
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
誤った対応例
• エンクロージャ " を追加する "abc","def","1,234"
• データに " は含まれていないか? → 含まれている → エラー "abc","def","1'23""
• データに " が含まれていないことが確実なのであれば、 フィールド終端を " にするだけで解決 abc"def"1,234
エンクロージャでは解決できない
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
ORACLE_LOADERで間違いやすい対応例 1
• ORACLE_LOADERドライバー(SQL*Loader含む)は エンクロージャを使ってもデータにレコード終端を含められない 例)フィールド終端: , レコード終端: 改行 エンクロージャ: “ ”abc“,”def“,”12 34“ → エラー: 2番目の囲み文字列がありません
• 可変レコード形式 (VAR) を使った対応方法もあるが、 レコード終端を改行から別のASCII制御文字に変更したほうが簡単
エンクロージャをつけても、レコード終端はデータに含められない
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
ORACLE_LOADERで間違いやすい対応例 2
• ORACLE_LOADERドライバー(SQL*Loader含む)は エスケープ文字でフィールド終端とレコード終端を無効化できない 例)フィールド終端: , レコード終端: 改行 abc,def,1¥,234 uvw,xyz,78¥ 90
エスケープ文字は使用できない
abc def 1¥ 234
uvw xyz 78¥
90
単なる文字として扱われる
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
ORACLE_LOADERで間違いやすい対応例 3
• ORACLE_LOADERドライバー(SQL*Loader含む)は 文字 “列” に対応できるが、これで常に解決できるわけではない
• 例)フィールド終端: ,, abc,,def,,1,234 ← 一見良さそう uvw,,xy,,,7,890 ← 想定外の区切り
文字列にしても解決できない
uvw xy ,7,890
区切りがずれている
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
正しいアプリケーション実装
• 終端記号にマイナーなASCII制御文字を使用できないシステムでは 少なくとも2個の印字可能文字は、データに含まれないように RDBMSからの入力時 / RDBMSからの出力時に置き換える – ISO10646文字実体参照: , → ,
– SQLインジェクション対策に合わせて実装する
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved. 79
知っておきたい 便利な使い方
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
複数の表を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
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
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
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
索引作成文を受け取る方法 -オリジナル-
エクスポート・ファイルのCREATE TABLE文もコメントとして含まれます
オリジナル
Option INDEXFILE
デフォルト なし
用途 索引作成文を受け取るファイルを指定します
使用例 imp scott/tiger TABLES=(wendy.emp) INDEXFILE=‘index.txt’
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
索引作成文を受け取る方法 -Data Pump- Data PumpではすべてのSQL文を受け取れます
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 © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Data Pump SQLFILE例 Data Pump
CREATE TABLE文や
CREATE INDEX文を
確認する事ができます
さらにINSERT文も
確認する事ができます
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Data Pump 圧縮
• COMPRESSION={ALL | DATA_ONLY | METADATA_ONLY | NONE} – NONE...エクスポート操作全体について圧縮が無効 – METADATA_ONLY(default)...全ての“メタデータ”が圧縮形式でダンプ・ファイルへ書き込み (以下の操作はAdvanced Compressionオプションが必要) – DATA_ONLY...全ての“データ”が圧縮形式でダンプ・ファイルへ書き込み – ALL...データ、メタデータともに圧縮
• (例)スキーマを指定し、メタデータ、データともに圧縮してダンプ・ファイルscott.dmpへエクスポート
データやメタデータを圧縮してダンプファイルにエクスポートできる Advanced Compression
Option
Data Pump
$ expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott.dmp
COMPRESSION=ALL SCHEMAS=scott
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
Data Pump 暗号化
• ENCRYPTION = {ALL | DATA_ONLY | ENCRYPTED_COLUMNS_ONLY | METADATA_ONLY | NONE}
– ALL:すべてのデータおよびメタデータについて暗号化が有効
– DATA_ONLY:データのみが暗号化
– ENCRYPTED_COLUMNS_ONLY:暗号化された列のみが暗号化される
– METADATA_ONLY:メタデータのみが暗号化
– NONE:データは暗号化されない
• (例)ダンプ・ファイルでデータのみが暗号化されるエクスポート操作
データやメタデータを暗号化してダンプファイルにエクスポートできる
$ expdp scott/tiger DIRECTORY=dpump_dir DUMPFILE=scott_enc.dmp
SCHEMAS=scott ENCRYPTION=data_only ENCRYPTION_PASSWORD=tiger
Advanced Security
Option
Data Pump
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved. 87
まとめ
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
まとめ
• Oracle Databaseにおいてテキスト・ファイルからのデータ・ロード方法は2種類
– SQL*Loader
– 外部表を使用したローディング
• SQL*Loaderは以前のバージョンから提供されており馴染み深いが、現在は外部表の利用が主流
• 外部表を利用することでデータ・ロードをSQLで柔軟に実現可能
• エクスポート・インポートの種類は2種類
– オリジナルExport/ImportとData Pump
– Oracle Database 10gからはData Pumpを使用
• Oracle Database 10g以前のバージョンからデータを移行する場合は、オリジナルエクスポート・インポートを使用
• ダイレクト・パス・ロードで高速な移行を実現
• Optionコマンドを使って、最適なExport/Importを実現
– Advanced Compressionで圧縮して高速化を実現
– セキュリティを高めたいなら、Advanced Security
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved. 89
Appendix HWMを下げる オペレーション
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
参考)ダイレクト・ロードとHWM
• テーブルに割り当てたブロックの中で、いままでデータが挿入されたことのある最後尾のブロック
– ハイウォーターマーク(High Water Mark):高水位標
• テーブルのフルスキャン時にはHWMまで読み取ります
– メリット:テーブルの大きさに対してデータ量が少ない場合、高速に検索できる
– デメリット: 大量削除などでHWM以前の空きが多い場合、実レコード数に比較して時間がかかる
ハイウォーターマーク(HWM)とは
HWM
データ格納済
ブロック
空き ブロック
HWM
データ格納済
ブロック
空き ブロック
データ削除
HWM
空き ブロック テーブルのフルスキャン
空き ブロック
HWM
空き ブロック テーブルのフルスキャン
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
参考)ダイレクト・ロードとHWM
• ダイレクト・ロードはHWMの後ろにデータを書き込みます
– ブロック・イメージを作成し直接物理的に書き込む為、使用中のブロックを利用しません
– ダイレクト・ロードは書込み速度は速いが、利用できない空き領域 (HWMよりも前の空き領域)がでてきます
• データ削除が頻繁に発生する表にダイレクト・ロードを行う際はHWMを下げるような運用も検討してください
ダイレクト・ロードの書込み
HWM
データ格納済
ブロック
空き ブロック
ダイレクト・ロードによる データ書込み開始ブロック
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. 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. オンライン・セグメント縮小(標準機能)
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved.
HWMを下げるオペレーション
• オンライン・セグメント縮小
–業務でテーブルを利用中でもセグメント縮小が可能
–自動セグメント領域管理(ASSM)のみ利用可能
オンライン・セグメント縮小
ALTER TABLE <表名> ENABLE ROW MOVEMENT; ALTER TABLE <表名> SHRINK SPACE[CASCADE];
① ②
データの移動 HWMの移動
③
領域の解放 HWM 空き領域
Copyright © 2015 Oracle & C’sNEXT Co.,Ltd. All rights reserved. 94
95