OracleマスターSilver 12ｃ データの移動

※用語はなるべく、Oracle® Databaseリファレンス　12c リリース1 (12.1) より抜粋しております。

###■公式チェックリストより出題範囲
●データの移動
　・データの移動方法について説明する
　・SQL*Loaderを使用して非Oracleデータベースからデータをロードする
　・外部表を使用して、プラットフォームに依存しないファイルによるデータの移動を行う　　

試験内容チェックリストから除外されたトピック
　Oracle Data Pumpを使用してデータを移行する。
　・Oracle Data Pumpの一般的なアーキテクチャについて説明する
　・Data Pumpのエクスポートとインポートを使用してOracleデータベース間でデータを移動する
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

###要点
　データの移動方法については完璧に押さえておこう

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
■**ディレクトリオブジェクト**
　データベースサーバーのファイルシステム上の**物理ディレクトリを表す論理構造**です。
Data Pumpは、クライアントベースではなくサーバーベースなので、ダンプファイル、ログファイルおよびSQLファイルには、サーバーのディレクトリパスを基準としてアクセスします。
**Data Pumpでは、ディレクトリパスをディレクトリオブジェクトとして指定する**必要があります。
構文：CREATE [OR REPLACE] DIRECTORY ディレクトリオブジェクト名 AS 物理ディレクトリパス；

出題例：ディレクトリオブジェクトに関する説明として正しい物を
→READ権限とWRITE権限を付与することが出来る

【理解】
・ディレクトリオブジェクトはスキーマオブジェクトではない（常にSYSスキーマとして作成されるため）
・利用権限として読み込みにREAD権限、エクスポートにWRITE権限が必要
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

####■完全トランスポータブルエクスポート/インポート
　完全トランスポータブルエクスポート/インポートは、トランスポータブル表領域のメカニズムを使用し、データベース全体を異なるデータベースインスタンスに移動できる機能です。
トランスポータブル表領域は**大量のデータを高速に移動できますが、手順が複雑です。**しかし、完全トランスポータブルエクスポート/インポートはData Pumpの使いやすさを活かし、コマンドラインで必要なオプションを指定することでデータベース全体を移動できます。

完全トランスポータブルエクスポート/インポート機能は次のような場合に役立ちます。

●新しいコンピュータシステムへのデータベースの移動
　ハードウェアのアップグレード時や、データベースサーバーを異なるプラットフォームへ移動したりする際に、データベースを移動できます。

●Oracle Databaseの新しいリリースへのアップグレード
　Oracle Database 12ｃをインストールし、空のデータベースを作成した後に、完全トランスポータブルエクスポート/インポートを使用することで、11ｇリリースのデータベースを12ｃにアップグレードできます

●非CDBのCDBへの移動
　12ｃから利用可能なマルチテナントアーキテクチャを使用すると、非CDBデータベースからPDB、PDBから別のPDB、またはPDBから非CDBデータベースに移行できます。

※通常のエクスポートダンプファイルには、ユーザー定義表領域内に含まれるオブジェクトのメタデータのみが含まれますが、完全トランスポータブルエクスポート/インポートでは、ユーザー定義表領域と管理表領域（SYSTEMや、SYSAUXなど）の両方に存在するデータがトランスポートされます。

【重要】
トランポータブルモードでfull = y を使用するとエクスポートファイル内容（表の定義、データなど）すべてが対象になる
変換先となる表領域とスキーマは事前に準備しておく必要がある

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
###SQL*Loaderを使用して非Oracleデータベースからデータをロードする
 SQL*Loaderは、外部ファイルのデータをデータベースの表にロードするユーティリティです。ほとんどのデータ形式（書式）をロードすることができます。


●データファイル
　ロードするデータが格納されたファイルです。固定レコード形式、可変レコード形式、あまたはストリームレコード形式を使用することができます

●制御ファイル
　データの検索位置、データの解釈方法、データの挿入位置など、ロードに必要な制御情報を保持したテキストファイルです。

●ログファイル
　ロード件数やロード中に発生したエラーログなどを記録するファイルです。

●不良ファイル
　エラーによりロードされなかったレコードを記録するファイルです。

●廃棄ファイル
　エラー以外の理由によりロードされなかったレコードを記録するファイルです。

■制御ファイル
　**データファイルのレコード形式の指定**
　　　固定レコード形式の最も簡単なして方式は、INFILEキーワードに"FLXn"と指定します。nにはレコード長を指定します。
　　　可変レコードの場合はINFILEキーワードに"VARn"と指定します。ただし、nに直接レコード長を指定するものではなありません。
　　　ストリームレコード形式である場合には、INFILEキーワードに次のように指定します。
構文：INFILE 'データファイル名' [" str { キャラクタ文字列 | 16進文字列 } " ]
例：INFILE 'sample.dat' "str '\n' "

■**SQL*Loaderを使用したデータのロード**
　SQL*Loaderをコマンドプロンプトから実行する場合は、sqlldrと入力します。
ほとんどのパラメータにはデフォルト値が用意されていますが、何も指定しなかった場合には、必要高m句について対話式に入力が要求されます。
ロード後に作成される不良ファイルには、エラーになったレコードそのものが記録されます。

■**ロード方法**

●従来型パス
　従来型パスでは挿入の行の配列を作りSQLの通常のNSERTとCOMMITを使用してデータをロードします。

●<FONT COLOR=red>ダイレクトパス</FONT>
メモリー上でデータブロック全体を構築し、**最高水位標より上に直接書き込みます**
また、COMMITとは異なる**データ保存**という機能を追加います。

・COMMITとの違い
　－全データベースブロックのみがデータベースに書き込まれる
　－最高水位標より上（未使用ブロック）に書き込む
　－トランザクションは終了しない
　－索引はデータ保存ごとに更新されない

####■従来型パスとダイレクトパスの違い

従来型パス
・常にREDOエントリを生成する
・すべての制約が施行される
・**INSERTトリガーが起動する
・**クラスタ表にロードできる
・ほかのユーザーが表を更新することができる

ダイレクトパス
・NOARCHIVELOGモードではREDOエントリは生成されない
・ARCHIVELOGモードでは、表属性がNOLOGGINGである
・制御ファイルにUNRECOVERABLEが設定されている場合REDOエントリは生成されない
・NOT NULL、UNIQUE、PRIMARY KEY制約のみ施行される
・**INSERTトリガーは起動しない**
・**クラスタ表にロードできない**
・ほかのユーザーが表を更新することができない
・COMMITではなくデータ保存が使用される

####■エクスプレスモード
　**エクスプレスモードとは、仔魚ファイルなしでデータを簡単にローディングできる機能です**
**表名と同じデータファイル**を用意し、コマンドラインで、ユーザー名およびTABLEパラメータのみを指定します。

例：sample表にロードする場合
- sqlldr user TABLE = sample

SQL*Loaderは、表の列定義を使用し、データファイル内に記載されたデータをロードします。ただし、表の全列のデータ型は、**文字、数値、日付**に限られます。
またデータファイルには、文字データ（デリミタ付き含む）のみで作成されていなければなりません。

・ログ
　●表名.log
　　－制御ファイル出力
　　－外部表を作成し、SQL INSERT AS SELECT文を使用してロードを実行するためのSQLスクリプト
　●表明_%p.log_xt
　　－ロード結果


出題例：SQL*Loaderのエクスプレスモードに関する説明として正しい物を2つ選択しなさい
→CSV形式などの区切られた文字データであること
→生成されるログファイルには制御ファイルと外部表を作成してロードするSQLスクリプトが出力される

####■外部表
　外部表は、OS上にあるファイルのデータを表のデータのように扱うことができるオブジェクトです。
ディレクトリオブジェクト上に存在するテキスト形式またはバイナリ形式のファイルをアクセスドライバを使用して読み込むことができます。

Oracleでは、外部表に対して次の2つのアクセスドライバが用意されています。
　●ORACLE_LOADER:SQL*Loaderユーティリティによって解釈される
　●ORACLE_DATAPUMP：Data Pumpユーティリティによって解釈される

■外部表のメリット
　●データを、外部ファイルから直接使用したり、別のデータベースにロードしたりできる。
　●データベースに存在する表とパラレルで、外部データに対する直接の問合せや結合ができる
　●複雑な問合せの結果を外部ファイルにアンロードできる
　●異なるソースから生成されたファイルを結合することができる

■外部表と内部データベース表の違い
　●外部表は読取り専用であるためDML操作はできない
　●外部表に索引を作成することはできない
　●外部表に問合せすることができる
　●外部表と内部表で結合することができる


Data Pumpに関しては覚える必要はないが、ひっかけ問題の選択肢として出てきそうなのでさっと流す程度に見ておきたい。
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
###Oracle Data Pumpの一般的なアーキテクチャについて説明する
　Oracle Data Pumpにより、データベース間でデータとメタデータを高速で移動できます。

■Oracle Data Pumpは、次のような部分から構成されています。
　Data Pumpユーティリティは次のコンポーネントから構成されています

●コマンドラインクライアンド expdp および impdp
　－これらのクライアントは、DBMS_DATAPUMPパッケージに対してコールし、Oracle Data Pump操作を実行します。コマンドラインで入力されたパラメータを使用してエクスポートおよびインポートを実行するためにDBMS_DATAPUMPで提供されているプロシージャを使用します

●PL/SQLパッケージ DBMS_DATAPUMP（データポンプAPI)
　このAPIによって、高速でインポートおよびエクスポートされます。

●PL/SQLパッケージ DBMS＿METADATA（メタデータAPI）
　－メタデータを移動する機能です。データディクショナリからオブジェクトのDDL文を出力することができます。オブジェクト定義がXML形式で格納されます

　Data Pumpユーティリティを**ネットワークモードで使用すると**、ファイルを介さずに、ソースデータベースから**ターゲットデータベースに直接データをロード**することができます。
###Data Pumpのエクスポートとインポートを使用してOracleデータベース間でデータを移動する
■**Data Pumpを使用したデータのエクスポート**
　エクスポートの単位には次の5通りがあります。

●**データベース（全体）**
データベース全体をエクスポートします。ただし、SYS、ORDSYS、ORDPLUGINS、CTXSYS、MDSYS、LABCSYSおよびXDBなどの**システムスキーマは含まれません**
FULLパラメータを使用します。DATAPUMP_EXP_FULL_DATABASEロールが必要です。

●**スキーマ**
1つ以上のスキーマ内のオブジェクトをエクスポートします。参照整合性制約が存在する場合、参照スキーマも指定しないと相互スキーマ参照はエクスポートされません。
SCHEMASパラメータを使用します。DATAPUMP_EXP_FULL_DATABASEロールを所有している場合は、スキーマのリストを指定し、オプションでスキーマ定義およびこれらのスキーマに対するシステム権限を指定することができます。
ロールを所有していない場合は、自分のスキーマのみをエクスポートできます。

●表
特定の表、パーティションおよびその依存オブジェクトのセットのみがエクスポートされます。同時に指定できるのは1つのスキーマのみです。TABLESパラメータを使用します。

●表領域
指定した表領域内に存在する表のみがエクスポートされます。指定した表領域内に表の一部が存在する場合、その表と、すべての依存オブジェクトがエクスポートされます。特権ユーザーはすべての表をエクスポートできますが、権限のないユーザーは自分のスキーマ内の表のみです。TABLESPACEパラメータを使用します。

●**トランスポート**
トランスポータブル表領域モードでは、指定した**表領域セット内にある表のメタデータ（およびその表の依存オブジェクト）のみがエクスポート**されます。
TRANSPORT_TABLESPACEパラメータを使用します。

■**Data Pumpを使用したデータのインポート**
インポートで指定できる主なパラメータ

●REMAP_DATAFILE：ソースデータファイルの名前をターゲットデータファイルの名前に変更。ファイルシステム軽視が異なるプラットフォーム間でデータベースを移動する場合に有効です。

●REMAP_TABLESPACE：ソース表領域内の永続データをターゲット表領域にインポートする。表領域間でオブジェクトを移動することができる。

●**REMAP_SCHEMA**：ソーススキーマにあるすべてのオブジェクトをターゲットスキーマにインポートする。**オブジェクトの所有者を変更することができます。**
つまり、スキーマオブジェクトをほかのスキーマオブジェクトにインポートすることが可能。

●TRANSFORM：インポート中のオブジェクトに対するオブジェクト作成DDLを変更。SEGMENT_ATTRIBUTESをｙに指定するとDDLにセグメント属性が含まれます。STORRAGEをｙに指定すると、STORAGE句を含めることができます。
OIDをｎに指定するとオブジェクトの表と型の作成時に、新しいOIDが割り当てられます。
PCTSPACEはエクステントの割当とデータファイルサイズの変更に使用する割合の乗数を表します。

___
###出題例

**出題例**：Oracle Data Pumpのエクスポートインポート操作について
→データポンプのエクスポートジョブから切断し、再接続することができる
→パラレル実行のサーバープロセスを使用してパラレルインポートを実装する
→マスター表はデータポンプがエクスポートする最後のオブジェクトである

**出題例**：SQL*LOADERを使用してデータをロードするしたい条件
→データをトランスフォームしながらデータベースにロードする場合（元ファイルがcsv,text,tsvなど）
→特定の列に連続した一意のキー値を生成する場合
※エクスプレスモードでは制御ファイルが不要　という点も忘れないように。12ｃからの機能です。

**出題例**：外部表に対して実行できるタスク、できないタスク
■できない
　-DML操作、索引の作成、パブリックシノニムを作成する
■できる
　-SELECT文の発行、内部表との結合、複雑な問合せの結果を外部ファイルにアンロードできる