Database Support Blog

  • EDB
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、MySQL及びNetSuiteは、Oracle、その子会社及び関連会社の米国及びその他の国における登録商標です。
 ・Amazon Web Services、AWS、Powered by AWS ロゴ、[およびかかる資料で使用されるその他の AWS 商標] は、Amazon.com, Inc. またはその関連会社の商標です。
  文中の社名、商品名等は各社の商標または登録商標である場合があります。

関連している記事

  • EDB
  • PostgreSQL
2024.01.16

EDBがもたらすデータベースの新たな価値 ~ EDB社Field CTO Ajit Gadge氏来日、セミナー講演レポート ~

EDB社のAjit Gadge氏を招き「PostgreSQLユーザーに捧ぐ、EDBを使ったDB機能向上とコスト削減の両立」セミナーを開催しました。DB市場の現状やトレンド、EDBの最新動向について紹介しております。アシストセッションのアーカイブ配信の視聴申し込みも可能です。ぜひご覧ください。

  • PostgreSQL
  • EDB
2023.12.20

PostgreSQLのSQLチューニングを体験してみよう!

35年以上教育事業を展開しているアシストが新たに取り組み始めた「ポスグレ学園」。連載最終回となる9回目の記事では、「PostgreSQL SQLチューニング実践」のワークショップ主管である 田中 健一朗 にインタビューしました。

  • PostgreSQL
  • EDB
2023.10.30

データベースの健康診断! ~ PostgreSQL DB稼働分析体験 ~

35年以上教育事業を展開しているアシストが新たに取り組み始めた「ポスグレ学園」。連載8回目となる今回の記事では、PostgreSQL DB稼働分析ワークショップの主管である保田 公貴にインタービューしました。

ページの先頭へ戻る