Database Support Blog

Database Support Blog>SQL*Loader互換のEDB*Loaderを使ってみよう

  • EDB Postgres
2017.07.31

SQL*Loader互換のEDB*Loaderを使ってみよう

SQL*Loader互換のEDB*Loaderを使ってみよう

Oracle Databaseにはcsv等を高速にデーターベースにロードするSQL*Loaderがあります。
PostgreSQLをベースにOracle互換機能をもたせたEDB Postgres Advanced Server(EPAS)にもSQL*Loaderと互換性があるEDB*Loaderというツールが用意されています。
EDB*LoaderとSQL*Loaderはほぼ同じ形式で使えますが、いくつか注意点もありますので、簡単な利用方法と合わせてご紹介します。

環境

本手順は以下環境で実施しています。
* OS: OracleLinux 6.4 64bit
* DB: EPAS 9.6.2 (64bit)

EDB*Loaderの基本的な使い方

EDB*LoaderはSQL*Loaderと同じく、ロード対象になるデータファイル(csvやtsv等)とロード対象等を指定した制御ファイルを用意します。コマンドライン引数等は接続先の指定を除きSQL*loaderとほぼ同じです。

EDB*Loaderのコマンドライン引数

[root@yamax ~]# edbldr --help
edbldr is a DIRECT PATH bulk data loading tool for EnterpriseDB
 
Usage:
Data Load : edbldr [-d DBNAME] [-p PORT] userid={dbuser[/dbpass]|/} direct={true|false} parallel={true|false} control=control_file_name log=log_file_name errors=num_errors  skip_index_maintenance={true|false} skip=num_skips  bad=bad_file_name parfile=par_file_name
 freeze={true|false}
 
Options for data load:
  -d DBNAME       database name
  -h HOSTNAME     database server to connect to
  -p PORT         port number to connect to
If these options are omitted, corresponding environment variables are used.
If the environment variables are also not available, this tool tries to use internal default values.
 
Keywords for data load:
userid -- username/password
direct -- use direct path for data load
parallel -- allow parallel data load
control -- name of the control file
log -- name of the log file
data -- name of the data file
discard -- name of the discard file
errors -- number of errors to tolerate before aborting the load
discardmax -- number of discards to tolerate before aborting the load
skip_index_maintenance -- skip index maintenance
skip -- number of initial input rows to skip during the load
bad -- name of the bad file
parfile -- name of the parameters file
edb_resource_group -- name of the resource group to be associated with
freeze -- load the data with rows already frozen
 
Other options:
  --help, -?      show this help information
  --version, -V   show version information

最低限、接続先DBの指定とuseridでのログイン情報、そして制御ファイルを指定するcontrolを指定します。その他のオプションは要件に応じて指定します。各オプションの詳細は以下のマニュアルを御覧ください。

EDB Postgres Advanced Server 9.6 Database Compatibility for Oracle Developers Tools and Utilities Guide
3.4 Invoking EDB*Loader

以下はEMP表へデータをロードする場合のデータファイルと制御ファイルのサンプルです。

ロード先の表構造

edb=# \d emp
               テーブル "public.emp"
    列    |             型              |  修飾語
----------+-----------------------------+----------
 empno    | numeric(4,0)                | not null
 ename    | character varying(10)       |
 job      | character varying(9)        |
 mgr      | numeric(4,0)                |
 hiredate | timestamp without time zone |
 sal      | numeric(7,2)                |
 comm     | numeric(7,2)                |
 deptno   | numeric(2,0)                |

制御ファイル(emp.ctlとして配置)

LOAD DATA
  INFILE    'emp.dat'
  BADFILE 'emp.bad'
  APPEND
  INTO TABLE emp
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
  (
    empno,
    ename,
    job,
    mgr,
    hiredate,
    sal,
    deptno,
    comm
  )

データファイル(emp.datとして配置)

9101,ROGERS,CLERK,7902,17-DEC-10,1980.00,20
9102,PETERSON,SALESMAN,7698,20-DEC-10,2600.00,30,2300.00
9103,WARREN,SALESMAN,7698,22-DEC-10,5250.00,30,2500.00
9104,"JONES, JR.",MANAGER,7839,02-APR-09,7975.00,20

データファイルと制御ファイルをDBサーバ上に配置して実行します。この時、 データファイルはEPAS起動ユーザからアクセスできるディレクトリに配置する必要がある 点に注意します。
EDB*Loaderの実装では、制御ファイルはedbldrプロセスが読み込みますが、データファイルにアクセスするのはEPASのバックエンドプロセスです。
そのため、EPAS起動ユーザ(デフォルトではenterprisedb)が参照できないディレクトリにデータファイルを配置した場合、edbldr実行時に以下のようなエラーになります。

[root@yamax ~]# edbldr -d edb userid=enterprisedb/enterprisedb control=/tmp/ctl/emp.ctl
EDB*Loader: Copyright (c) 2007-2016, EnterpriseDB Corporation.
edbldr error: ERROR:  could not open "/tmp/data/emp.dat" 許可がありません


なお、SQL*Loaderとは異なり useridパラメータは省略できません。そのため、SQL*Loaderで使われているedbldr scott/tiger control=xxxx といったログイン情報の指定はできないのでご注意ください。

リモートクライアントからの実行

EDB*LoaderはDBサーバ以外からも実行することが可能です。ただし、SQL*Loaderとは異なる点があります。
SQL*Loaderでは、リモートから実行する時も制御ファイル内のINFILE句はリモート環境上でのデータファイルの位置を指定します。
しかし、EDB*Loaderは上述の様に、データファイルにアクセスするのはEPASのバックエンドプロセスです。リモート環境のデータファイルをEPASのバックエンドプロセスは参照できないため、リモート環境側でのパス指定はできません。
リモート環境からEDB*Loaderを実行する場合は、以下のようにINFILE句にstdinを指定します。stdinを指定した場合、EDB*Loaderはロードするデータをデータファイルではなく標準入力から読み込みます。

リモートクライアントでの制御ファイル

LOAD DATA
  INFILE  stdin -- 標準入力を指定
  BADFILE 'emp.bad'
  APPEND
  INTO TABLE emp
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
  (
    empno,
    ename,
    job,
    mgr,
    hiredate,
    sal,
    deptno,
    comm
  )

例えば、クライアント側がLinux環境であれば以下のように実行します。

[root@yamax ~]# edbldr -h DB-SERVER-HOST -p 5444 -d edb userid=enterprisedb/enterprisedb control=emp_stdin.ctl < /tmp/data/emp.dat
EDB*Loader: Copyright (c) 2007-2016, EnterpriseDB Corporation.
Successfully processed (4) records

あるいは、以下のようにパイプを経由することも可能です。

[root@yamax ~]# cat /tmp/data/emp.dat|edbldr -h DB-SERVER-HOST -p 5444 -d edb userid=enterprisedb/enterprisedb control=emp_stdin.ctl
EDB*Loader: Copyright (c) 2007-2016, EnterpriseDB Corporation.
Successfully processed (4) records

このようにINFILE句にstdinを指定することでリモートからもEDB*Loaderを利用できることが確認できました。
Oracle Databaseからの移行の場合は、SQL*Loaderをリモートクライアントから実行するバッチ処理等を組まれているケースも多いと思いますので、INFLIE句の書き換えが必要になる事だけ注意してください。

SQL*Loader のエクスプレスモードの対応

Oracle Database 12cでは特定条件下で制御ファイルなしでデータをロードできるエクスプレスモードがSQL*Loaderに追加されています。

Oracle® Databaseユーティリティ SQL*Loaderエクスプレス

しかし、EPAS 9.6時点ではEDB*Loader にエクスプレスモードに相当する機能はありません。

まとめ

SQL*Loaderに相当するEDB*Loaderについて基本的な内容とSQL*Loaderとの互換性について紹介しました。
EDB*LoaderではSQL*Loaderの基本機能は移植されておりますので、殆ど制御ファイルを書き換えずにご利用いただけます。
本記事がEDB*Loaderの使用をご検討されている方の参考になりましたら幸いです。


アシスト データベース ウェビナー

関連している記事

  • PostgreSQL
  • EDB Postgres
2019.04.16

【PostgreSQL/EPAS11 新機能】autoprewarmでPostgreSQL再起動後の性能劣化を予防しよう

PostgreSQL/EDB Postgres Advanced Server 11にて、PostgreSQL/EPAS停止前の共有バッファの内容を復元する autoprewarm機能が実装されました。

  • PostgreSQL
  • EDB Postgres
2018.12.12

レプリケーションスロットを使用する際の4つの注意点

レプリケーションスロットを使用する際の4つの注意点を紹介します。

  • PostgreSQL
  • EDB Postgres
2018.10.19

【PostgreSQL/EPAS11 新機能】バックアップと同時にデータ破損チェック!

pg_basebackupにチェックサムの検証機能が付きました。

ページの先頭へ戻る