Database Support Blog

  • 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の使用をご検討されている方の参考になりましたら幸いです。


■商標に関して
OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。
文中の社名、商品名等は各社の商標または登録商標である場合があります。

関連している記事

  • EDB Postgres
2021.07.02

PostgreSQL/EPAS13新機能:パラレルVacuumは高速に処理できるのか?

PostgreSQL管理者を悩ませる「肥大化」は可能な限り迅速にバキューム処理で対応する必要があります。PostgreSQL13では、単一テーブルに作成された複数のインデックスのバキューム並列を実行可能にする Parallel Vacuum機能が導入されました。本記事では検証結果をご紹介します。

  • EDB Postgres
  • PostgreSQL
2021.07.01

Postgres Vision 2021 に登壇しました!

毎年恒例のEnterpriseDB社主催イベント「Postgres Vision」が2021年6月22日・23日にバーチャル形式で開催。「アジアにおけるPostgresの採用と利用に関するパネルディスカッション」に日本PostgreSQLユーザ会(JPUG)理事長も務めるアシストの喜田紘介が登壇しました。

  • EDB Postgres
2021.06.18

EDB Postgres普及のきっかけとは~EDB藤田氏対談記事:EDBとアシストの10年を振り返る~

アシストはこれまで10年にわたりEDB Postgres Platformの販売・サポートを一貫して行ってまいりました。日本でのEDBのビジネスがどのように進んできたのか、今後のビジネスはどのような展開となるのか、エンタープライズDB株式会社 代表取締役社長 藤田祐治様と対談を行いました。

ページの先頭へ戻る