8章 データロード
本章ではデータのロードを行うツールについてご紹介していきます。
データの移行などに使用することもあり、ツールの機能を理解していると作業の幅も
広がるのでどのようなツールなのかしっかり理解していきましょう。
DataPump
DataPumpはOracleが提供するデータの抽出、取り込みを行うツールです。
エクスポートを実行するとテーブルのデータをダンプファイル呼ばれるファイルに出力し、
そのダンプファイルをインポートすることで簡単にテーブルのデータを別のDBに投入することが可能です。
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についてのご紹介でした。