トップ > DBA中級 > 8章
8章 データロード
本章ではデータのロードを行うツールについてご紹介していきます。
データの移行などに使用することもあり、ツールの機能を理解していると作業の幅も
広がるのでどのようなツールなのかしっかり理解していきましょう。

DataPump


DataPumpはOracleが提供するデータの抽出、取り込みを行うツールです。
エクスポートを実行するとテーブルのデータをダンプファイル呼ばれるファイルに出力し、 そのダンプファイルをインポートすることで簡単にテーブルのデータを別のDBに投入することが可能です。

DataPump

DataPumpの用途はデータ移行や、データベースのバックアップで使用されますが、データの再編成を実施する場合も使用します。

再編成とは断片化したデータを解消する作業です。DataPumpを使用して再度同じデータベースに再投入することで、データをきれいに入れなおすことができます。
エクスポートの単位は以下の通りです。

データベース全体 データベース全体のオブジェクトを取得
表領域 指定した表領域内に存在するすべての
オブジェクトを取得
スキーマ 指定したスキーマ内にあるすべてのオブジェクトを取得
テーブル 指定したテーブルを取得


ディレクトリ・オブジェクト


ダンプファイルの格納先はディレクトリ・オブジェクトで指定されているディレクトリに保存されます。 ディレクトリ・オブジェクトとはパスの別名のようなもので、エクスポート、インポート時はその別名を指定します。

ディレクトリ・オブジェクトは、データベース上で管理されており、作成や削除が可能です。またそのディレクトリオブジェクトにアクセスできるユーザの権限を設定できるため、セキュリティも向上します。

それではディレクトリ・オブジェクトの作成方法を確認してきましょう。
ディレクトリオブジェクトはSQL文で作成します。

[構文] ディレクトリ・オブジェクトの作成
 SQL> CREATE DIRECTORY ディレクトリオブジェクト名    2  AS 'OSのディレクトリパス' ;

また事前に用意されているディレクトリオブジェクトも存在します。
作成したディレクトリオブジェクトはデータディクショナリ「DBA_DIRECTORIES」で確認できます。

  SQL> desc dba_directories
Name Null? Type ------------------------- -------- -------------- OWNER NOT NULL VARCHAR2(128) DIRECTORY_NAME NOT NULL VARCHAR2(128) DIRECTORY_PATH VARCHAR2(4000) ORIGIN_CON_ID NUMBER

  SQL> SELECT directory_name,directory_path FROM dba_directories;

  DIRECTORY_NAME          DIRECTORY_PATH
  ----------------------- ----------------------------------------------------
  ORACLE_HOME             /
  ORACLE_BASE             /
  OPATCH_LOG_DIR          /u01/app/oracle/product/12.0.1/dbhome_1/QOpatch
  OPATCH_SCRIPT_DIR       /u01/app/oracle/product/12.0.1/dbhome_1/QOpatch
  OPATCH_INST_DIR         /u01/app/oracle/product/12.0.1/dbhome_1/OPatch
  DATA_PUMP_DIR           /ade/b/1281484529/oracle/admin/seeddata/dpdump/
  XSDDIR                  /u01/app/oracle/product/12.0.1/dbhome_1/rdbms/xml/sc
  ORACLE_OCM_CONFIG_DIR   /u01/app/oracle/product/12.0.1/dbhome_1/ccr/hosts/li
  XMLDIR                  /u01/app/oracle/product/12.0.1/dbhome_1/rdbms/xml
  ORACLE_OCM_CONFIG_DIR2  /u01/app/oracle/product/12.0.1/dbhome_1/ccr/state

  10 rows selected.
  

上記は事前に作成されているディレクトリオブジェクトです。
今回は新規に作成してみましょう。

  SQL> CREATE DIRECTORY TEST_DIR AS '/home/oracle/TEST_DIR';

  Directory created.
  

今回はTEST_DIRというディレクトリオブジェクトを作成しました。
指定した「/home/oracle/TEST_DIR」は事前に作成していなくてもディレクトリオブジェクトは作成できます。

  SQL> SELECT directory_name,directory_path FROM dba_directories
    2  WHERE directory_name = 'TEST_DIR';

  DIRECTORY_ DIRECTORY_PATH
  ---------- ------------------------------
  TEST_DIR   /home/oracle/TEST_DIR
  

ディレクトリ・オブジェクトを作成できました。

エクスポート


では次にエクスポートを実行していきましょう。

[構文] DataPump エクスポート
 $ expdp ユーザ名/パスワード DIRECTORY=ディレクトリ・オブジェクト名
  DUMPFILE=ダンプファイル名 LOGFILE=ログファイル名

expdpコマンドで使用できるオプションは以下の通りです。
データベース全体 FULL=y
EXP_FULL_DATABASEロールの権限が必要
表領域 TABLESPACE=表領域名
スキーマ SCHEMAS=スキーマ名
テーブル TABLES=テーブル名

エクスポートする時はNLS_LANG環境変数に設定された文字コードでダンプファイルが作成されます。エクスポートした時のNLS_LANGとインポート時のNLS_LANGが異なっているとインポートしたデータが文字化けしてしまう可能性があります。
その為、インポートとエクスポート時のNLS_LANGは必ず一致させましょう。

ではORAユーザのEMPLOYYES表とLOCATIONS表をエクスポートしてみます。


  $ export NLS_LANG=japanese_japan.UTF8
  $ expdp ora/ora@pdb1 DIRECTORY=test_dir DUMPFILE=ora_tbl.dmp \
    LOGFILE=exp.log TABLES=employees,locations

  Export: Release 12.1.0.2.0 - Production on 金 2月 10 01:13:01 2017

  Copyright (c) 1982, 2013, Oracle and/or its affiliates.  All rights reserved.

  接続先: Oracle Database 12c Release 12.1.0.1.0 - 64bit Production
  ORA-39002: 操作が無効です
  ORA-39070: ログ・ファイルをオープンできません。
  ORA-39087: ディレクトリ名TEST_DIRは無効です
  

失敗してしまいました。ORAユーザがTEST_DIRオブジェクトディレクトリへ書き込む為の権限が不足していました。ORAユーザに権限を付与してみます。

  SQL> GRANT read,write ON directory TEST_DIR to ORA;

  権限付与が成功しました。
  

それでは再度実施してみます。

  $ export NLS_LANG=japanese_japan.UTF8
  
  $ expdp ora/ora@pdb1 DIRECTORY=test_dir DUMPFILE=ora_tbl.dmp \
    LOGFILE=exp.log TABLES=employees,locations

  Export: Release 12.1.0.2.0 - Production on 金 2月 10 01:20:23 2017

  Copyright (c) 1982, 2013, Oracle and/or its affiliates.  All rights reserved.

  接続先: Oracle Database 12c Release 12.1.0.1.0 - 64bit Production
  ORA-39002: 操作が無効です
  ORA-39070: ログ・ファイルをオープンできません。
  ORA-29283: 無効なファイル操作です。
  ORA-06512: "SYS.UTL_FILE", 行536
  ORA-29283: 無効なファイル操作です。
  

またエラーとなってしまいました。原因はディレクトリオブジェクトで指定したディレクトリをまだ作成していませんでした。

  $ mkdir /home/oracle/TEST_DIR

  $ ls -ld /home/oracle/TEST_DIR/
  
  drwxr-xr-x 2 oracle oinstall 4096  2月 10 01:20 2017 /home/oracle/TEST_DIR/

  $ expdp ora/ora@pdb1 DIRECTORY=test_dir DUMPFILE=ora_tbl.dmp \
    LOGFILE=exp.log TABLES=employees,locations

  Export: Release 12.1.0.2.0 - Production on 金 2月 10 01:24:02 2017

  Copyright (c) 1982, 2013, Oracle and/or its affiliates. All rights reserved.

  "ORA"."SYS_EXPORT_TABLE_02"を起動しています: ora/********@pdb1 
  DIRECTORY=test_dir DUMPFILE=ora_tbl.dmp LOGFILE=exp.log 
  TABLES=employees,locations
  BLOCKSメソッドを使用して見積り中です...
  オブジェクト型TABLE_EXPORT/TABLE/TABLE_DATAの処理中です
  BLOCKSメソッドを使用した見積り合計: 128 KB
  オブジェクト型TABLE_EXPORT/TABLE/TABLEの処理中です
  オブジェクト型TABLE_EXPORT/TABLE/INDEX/INDEXの処理中です
  オブジェクト型TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
  オブジェクト型TABLE_EXPORT/TABLE/STATISTICS/INDEX_STATISTICSの処理中です
  オブジェクト型TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
  オブジェクト型TABLE_EXPORT/TABLE/STATISTICS/MARKERの処理中です
  . . "ORA"."EMPLOYEES"         9.867 KB      20行がエクスポートされました
  . . "ORA"."LOCATIONS"         5.570 KB       3行がエクスポートされました
  マスター表"ORA"."SYS_EXPORT_TABLE_02"は正常にロード/アンロードされました
  ***************************************************************************
  ORA.SYS_EXPORT_TABLE_02に設定されたダンプ・ファイルは次のとおりです:
    /home/oracle/TEST_DIR/ora_tbl.dmp
  ジョブ"ORA"."SYS_EXPORT_TABLE_02"が金 2月 10 01:25:43 2017 
  elapsed 0 00:01:32で正常に完了しました

  $ ls -l /home/oracle/TEST_DIR/
  
  合計 220
  -rw-r--r-- 1 oracle oinstall   1758  2月 10 01:25 2017 exp.log
  -rw-r----- 1 oracle oinstall 221184  2月 10 01:25 2017 ora_tbl.dmp
  

エクスポートが正常完了し、ダンプファイルが作成されました。

インポート


インポートはエクスポートしたダンプファイルを取り込むコマンドです。 インポートはエクスポート時のデータをそのまま取り込みます。例えばスキーマ単位でインポートした場合は、 そのまま同じスキーマ名でインポートされます。またテーブル単位でエクスポートした場合は、そのまま対象スキーマにテーブルをインポートします。 オプションを使用すれば、DB全体のダンプファイルから特定のテーブルや、スキーマ単位でもインポートすることもできます。

[構文] DataPump インポート
 $ impdp ユーザ名/パスワード DIRECTORY=ディレクトリ・オブジェクト名
  DUMPFILE=ダンプファイル名 LOGFILE=ログファイル名

impdpコマンドで使用できるオプションは以下の通りです。
REMAP_TABLESPACE インポートする表領域を変更
REMAP_DATAFILE インポートするデータファイルを変更
REMAP_SCHEMA インポートするスキーマを変更
REMAP_TABLE インポートするテーブル名を変更

インポートはエクスポートしたオプションに従ってそのままインポートされます。
例えば、ORAユーザをSHEMASオプションでエクスポートした場合、インポート時、ORAスキーマを作成し、インポートします。
インポートするユーザを変更したい場合は上記のREMAP_SCHEMAオプションを使用し、別のユーザにインポートすることができます。

その他のREMAPオプションも同じです。TABLEPSACEオプションでエクスポートしたダンプファイルは、インポート先に同じ表領域名がないとインポートできません。
その時にはREMAP_TABLESPACEを使用し、別の表領域に変更しインポートすることができます。

では実行例を確認していきましょう。今回は先ほどのダンプファイルをTESTユーザにEMPLOYEES表だけインポートしてみましょう。
TESTユーザは事前に作成しています。

  $ export NLS_LANG=japanese_japan.UTF8
  
  $ impdp ora/ora@pdb1 DIRECTORY=test_dir DUMPFILE=ora_tbl.dmp \
    LOGFILE=imp.log TABLES=employees REMAP_SCHEMA=ora:test

  接続先: Oracle Database 12c 12.1.0.1.0 - 64bit Production
  
  ORA-31631: 権限が必要です
  ORA-39122: 権限が与えられていないユーザーは、
  REMAP_SCHEMA再マッピングを実行できません。
  

impdpコマンドをORAユーザで実行しましたが、TESTスキーマにインポートする権限がないため、失敗しました。REMAP系のコマンドを使用する場合は、SYSTEMユーザで実施するのがいいでしょう。

  $ impdp system/manager@pdb1 DIRECTORY=test_dir DUMPFILE=ora_tbl.dmp \
    LOGFILE=imp.log TABLES=ora.employees REMAP_SCHEMA=ora:test

  Import: Release 12.1.0.2.0 - Production on 火 2月 14 00:26:44 2017

  Copyright (c) 1982, 2013, Oracle and/or its affiliates.  All rights reserved.

  Connected to: Oracle Database 12c Release 12.1.0.1.0 - 64bit Production

  マスター表"SYSTEM"."SYS_IMPORT_TABLE_01"は正常にロード/アンロードされました
  "SYSTEM"."SYS_IMPORT_TABLE_01"を起動しています: system/********@pdb1 
  DIRECTORY=test_dir DUMPFILE=ora_tbl.dmp \
  LOGFILE=imp.log TABLES=ora.employees REMAP_SCHEMA=ora:test
  オブジェクト型TABLE_EXPORT/TABLE/TABLEの処理中です
  オブジェクト型TABLE_EXPORT/TABLE/TABLE_DATAの処理中です
  . . "TEST"."EMPLOYEES"                          9.867 KB      
    20行がインポートされました
  オブジェクト型TABLE_EXPORT/TABLE/INDEX/INDEXの処理中です
  オブジェクト型TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
  オブジェクト型TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
  オブジェクト型TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
  オブジェクト型TABLE_EXPORT/TABLE/STATISTICS/MARKERの処理中です
  ジョブ"SYSTEM"."SYS_IMPORT_TABLE_01"が火 2月 14 00:29:29 2017 
  elapsed 0 00:00:21で正常に完了しました
 

インポートが成功しました。オプションどおりORAスキーマのテーブルをTESTユーザにインポートしました。それではちゃんとインポートできているか確認してみます。

  $ sqlplus test/test@pdb1

  SQL> select table_name from user_tables;

  TABLE_NAME
  -------------------------------------------------
  EMPLOYEES

  SQL> select * from employees;

      EMP_ID FIRST_NAME                     LAST_NAME
  ---------- ------------------------------ ------------------------------
  ADDRESS
------------------------------------------------------------------------ TEL SALARY HIRE_DATE MANAGER_ID DEPT_ID ------------ ---------- --------- ---------- ---------- 1 Suzuki Hiroshi 10-20XX-102 03-XXXX-XXXX 10000000 07-OCT-92 2 Sato Takashi 13-XXX2-102 03-XXXX-XXXX 8000000 11-OCT-92 1 20 … 20 rows selected.

正しくインポートができているようです。このようにREMAPオプションを使用すると、簡単に別ユーザにインポートすることができます。

NETWORK_LINK


NETWORK_LINKオプションはデータベースリンクを使用し、ダンプファイルを作成せず、そのままリモートのデータベースにインポートすることができます。 データベースリンクはリモートのデータベースに接続するための識別子のようなもので、データベースリンクを作成すると、リモートにある別のデータベースに接続することができるようになります。

では今回はPDB1のORAスキーマをPDB2にインポートしてみます。
まずはデータベースリンクをインポートするDB側に作成する必要があります。
データベースリンクはインポート先データベースに接続する為の情報で作成します。

  $ sqlplus system/manager@pdb1

  SQL*Plus: Release 12.1.0.2.0 Production on 火 2月 14 01:18:50 2017
  Copyright (c) 1982, 2014, Oracle.  All rights reserved.

  最終正常ログイン時間: 火 2月  14 2017 00:29:06 +09:00

  Oracle Database 12c Release 12.1.0.2.0 - 64bit Production
  に接続されました。

  SQL> CREATE DATABASE LINK impdp_link CONNECT TO system 
    2  IDENTIFIED BY manager USING 'PDB2';

  データベース・リンクが作成されました。

  SQL> exit
  

上記コマンドでデータベースリンクを作成しました。USING句に指定しているのは、
ネットサービス名です。ネットサービス名はTNSファイルに記載されています。

  $ cat $ORACLE_HOME/network/admin/tnsnames.ora

  PDB2 =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (CONNECT_DATA =
        (SERVICE_NAME = PDB2)
      )
    )
    

これでデータベースリンクを作成できました。あとはNETWORK_LINKを使用して
インポートを行ってみます。

  $ impdp system/manager@pdb2 DIRECTORY=test_dir SCHEMAS=ora \
    NETWORK_LINK=impdp_link LOGFILE=imp.log

  Import: Release 12.1.0.2.0 - Production on 火 2月 14 01:46:40 2017

  Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.

  接続先: Oracle Database 12c Release 12.1.0.2.0 - 64bit Production
  "SYSTEM"."SYS_IMPORT_SCHEMA_01"を起動しています: system/********@pdb2 
  DIRECTORY=test_dir SCHEMAS=ora NETWORK_LINK=impdp_link LOGFILE=imp.log
  BLOCKSメソッドを使用して見積り中です...
  オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
  BLOCKSメソッドを使用した見積り合計: 256 KB
  オブジェクト型SCHEMA_EXPORT/USERの処理中です
  オブジェクト型SCHEMA_EXPORT/SYSTEM_GRANTの処理中です
  オブジェクト型SCHEMA_EXPORT/DEFAULT_ROLEの処理中です
  オブジェクト型SCHEMA_EXPORT/TABLESPACE_QUOTAの処理中です
  オブジェクト型SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAの処理中です
  オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
  . . "ORA"."EMPLOYEES"                       20行がインポートされました
  . . "ORA"."GRADES"                           3行がインポートされました
  . . "ORA"."LOCATIONS"                        3行がインポートされました
  . . "ORA"."TEST"                             3行がインポートされました
  オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/INDEXの処理中です
  オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
  オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの
  処理中です
  オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
  オブジェクト型SCHEMA_EXPORT/STATISTICS/MARKERの処理中です
  ジョブ"SYSTEM"."SYS_IMPORT_SCHEMA_01"が火 2月 14 01:48:48 2017 
  
  elapsed 0 00:02:06で正常に完了しました
  

上記コマンドはORAユーザをPDB2に作成し、ORAスキーマのオブジェクトをすべて
インポートします。今までのようにダンプファイルを作成する必要がありません。
従来はダンプファイルをインポート先のデータベースサーバにコピーする必要があり
ましたが、NETWORK_LINKではその作業が不要になります。

以上がDataPumpについてのご紹介でした。