oracle的数据导出方式之SQLULDR2

简介

SQLULDR2是一个可以从oracle快速导出数据到文件的工具。它可以像插入语句一样自定义导出数据的语句(通过query关键字指定)、自定义字段的分割符、压缩导出文件(通过指定导出文件的后缀,例如:”.gz”)、还可以生成sqlldr用的control文件、并行导出、使用密钥对输出文件加密。

下载安装

$ unzip sqluldr2linux64.zip
$ mv sqluldr2linux64.bin $ORACLE_HOME/bin/
$ ll $ORACLE_HOME/bin/sqluldr2linux64.bin
-rwxr-xr-x. 1 root root 185894 Jan 27  2016 /opt/oracle/11.2.0/bin/sqluldr2linux64.bin
$ mv $ORACLE_HOME/bin/sqluldr2linux64.bin $ORACLE_HOME/bin/sqluldr2
$ ll $ORACLE_HOME/bin/sqluldr2
-rwxr-xr-x. 1 root root 185894 Jan 27  2016 /opt/oracle/11.2.0/bin/sqluldr2
$ echo 'export LD_LIBRARY_PATH=$ORACLE_HOME/bin:$ORACLE_HOME/lib:/lib:/usr/lib' >> ~/.bash_profile
$ source ~/.bash_profile
$ sqluldr2

SQL*UnLoader: Fast Oracle Text Unloader (GZIP, Parallel), Release 4.0.1
(@) Copyright Lou Fangxin (AnySQL.net) 2004 - 2010, all rights reserved.

License: Free for non-commercial useage, else 100 USD per server.

Usage: SQLULDR2 keyword=value [,keyword=value,...]

Valid Keywords:
   user    = username/password@tnsname
   sql     = SQL file name
   query   = select statement
   field   = separator string between fields
   record  = separator string between records
   rows    = print progress for every given rows (default, 1000000)
   file    = output file name(default: uldrdata.txt)
   log     = log file name, prefix with + to append mode
   fast    = auto tuning the session level parameters(YES)
   text    = output type (MYSQL, CSV, MYSQLINS, ORACLEINS, FORM, SEARCH).
   charset = character set name of the target database.
   ncharset= national character set name of the target database.
   parfile = read command option from parameter file

  for field and record, you can use '0x' to specify hex character code,
  \r=0x0d \n=0x0a |=0x7c ,=0x2c, \t=0x09, :=0x3a, #=0x23, "=0x22 '=0x27

常见用法

#!/bin/sh

SQL="select to_char(a.start_time,'yyyy-mm-dd hh24:mi:ss'), \
            a.
            a.city_name \
       from lqz.test partition(p_1d) a
       where a.city_name <> '北京'"

for (( DAY=20181008; DAY<=20181031; DAY++)); do
    PARTITION=p_1d_$DAY
    QUERY=$(echo $SQL | sed s/p_1d/${PARTITION}/g )
    sqluldr user='lqz/123456@192.168.37.10/APP' query="${QUERY}" field=',' file=/data/${PARTITION}.csv
    echo ">>>>>>> ${PARTITION}.csv export finish <<<<<<<"
done

echo ">>>>>>>  all data export finish <<<<<<<"

注意:小于1的数值的数据,小数点前的0不显示,例如:0.1导出后变成了.1,可以结合to_char(数值,'fm9990.0099')进行转换,规避该问题。

References

Written on November 16, 2018