SQLUDLR2 :A High Performance Text Unload Utility For Oracle Database
下载SQLULDR2(Windows /Linux-x64),解压缩,文件夹内容如下:
sqluldr2.exe 用于32位windows平台;
sqluldr2_linux32_10204.bin 适用于linux32位操作系统;
sqluldr2_linux64_10204.bin 适用于linux64位操作系统;
sqluldr264.exe 用于64位windows平台。
安装步骤
一、 Linux环境配置
1创建sqluldr2目录
在 /home/profit下创建sqluldr2目录
mkdir -m 775 sqluldr2
2文件拷贝到sqluldr2目录下:
把sqluldr2linux64.bin文件拷贝到sqluldr2目录下
给文件添加权限为775
chmod 775 sqluldr2linux64.bin
3创建sqlData目录
进入目录/home/profit/uploadFile下创建sqlData目录,用于存放sql脚本
mkdir -m 775 sqlData

导出成功后,会生成2个文件,log日志文件,执行sql脚本文件;
二、 Oracle client安装
1安装Oracle客户端软件目录:
cd /home/profit/soft/
oracle-instantclient-11.2.0.4.0-1.1.x86_64.rpm
oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm
oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
2使用rpm -ivh [包名] 进行安装:
如:rpm -ivh oracle-instantclient-11.2.0.4.0-1.1.x86_64.rpm
安装的文件默认放在两个位置:
头文件:/usr/lib/oracle/11.2/client64/
下,如果在使用时报错找不到头文件,记得看路径是否是这个。
包文件:/usr/lib64/oracle/11.2.0.4.0/client/ 下,包含{bin、lib}两个文件夹;
3创建oracle-instantclient.conf文件,并添加内容:
vim /etc/ld.so.conf.d/oracle-instantclient.conf
添加内容
/usr/lib64/oracle/11.2.0.4.0/client/lib/
4生效环境变量
source .ldconfig
5创建软连接
cd /usr/lib64/oracle/11.2.0.4.0/client/lib
执行
cd /usr/lib64/oracle/11.2.0.4.0/client/lib/
ln -s libclntsh.so.11.1 libclntsh.so
6 sqluldr2导出命令
./sqluldr2linux64.bin -help

(1).使用sql参数
./sqluldr2linux64.bin user=‘账号/密码’@IP:表空间 sql=1.sql head=yes
file=/home/profit/sqluldr2/tmp002.csv
(2).使用log参数,当集成sqluldr2在脚本中时,就希望屏蔽上不输出这些信息,但又希望这些信息能保留,这时可以用“LOG”选项来指定日志文件名
./sqluldr2linux64.bin user=‘账号/密码’@IP:表空间 sql=1.sql head=yes
file=/home/profit/sqluldr2/tmp002.csv log=+/home/profit/sqluldr2/tmp003.log
(3).大数据量操作,对于大表可以输出到多个文件中,指定行数分割或者按照文件大小分割,例如:
./sqluldr2linux64.bin user=‘账号/密码’@IP:表空间 sql=1.sql head=yes
file=/home/profit/sqluldr2/tmp002_%B.csv log=+/home/profit/sqluldr2/tmp003.log
batch=yes rows=500000

(4).带有table参数的导出
sqluldr264 user=zxx/zxx query=“select * from mv_xlsymx1 where ysyddm=‘00001H’”
table=mv_xlsymx1 head=yes file=h:\mx.csv
它会在当前目录下生成一个.ctl文件(mv_xlsymx1_sqlldr.ctl,默认生成在sqluldr文件下,我的就生成在h:\sqluldr\
mv_xlsymx1_sqlldr.ctl)
(5).指定.ctl文件生成的位置
sqluldr264 user=zxx/zxx query=“select * from mv_xlsymx1 where ysyddm=‘00001H’”
table=mv_xlsymx1 control=h:\mx.ctl head=yes file=h:\mx.csv
7 sqluldr2生产环境导出
./sqluldr2linux64.bin user=‘账号/密码’@IP:表空间 query=“select * from 表名
where sign_org = ‘207160’ and trans_month=‘201904’” head=yes
file=/home/profit/sqluldr2/tmp001.csv log=+/home/profit/sqluldr2/tmp001.log
8 sqluldr2测试环境导出
./sqluldr2linux64.bin user=‘账号/密码’@IP:表空间 query=“select * from 表名”
head=yes file=/home/profit/sqluldr2/tmp003.csv
log=+/home/profit/sqluldr2/tmp003.log
9 sqluldr2测试导出INSERT语句
./sqluldr2linux64.bin user=‘账号/密码’@IP:表空间 sql=D:\1.sql table=表名
format=SQL file=D:\tmp002_%B.sql log=+D:\tmp002.log batch=yes rows=1000
field=0x2c escape=0x5c null=null quote=0x27 record=0x2a safe=yes charset=UTF8
10 sqlldr 导入
导入之前,先熟悉一下.ctl文件参数
characterset :字符集, 一般使用字符集 AL32UTF8,如果出现中文字符集乱码时,改成
ZHS16GBK。
fields terminated by ‘string’:文本列分隔符。当为tab键时,改成’\t’,或者
X’09’;空格分隔符 whitespace,换行分隔符 ‘\n’ 或者 X’0A’;回车分隔符 ‘\r’ 或者
X’0D’;默认为’\t’。
optionally enclosed by ‘char’:字段包括符。当为 ’ ’
时,不把字段包括在任何引号符号中;当为 “’”
时,字段包括在单引号中;当为’"'时,字段在包括双引号中;默认不使用引用符。
fields escaped by ‘char’:转义字符,默认为’\’。
trailing nullcols:表字段没有对应的值时,允许为空。
append into table "T_USERS " – 操作类型
– 1) insert into --为缺省方式,在数据装载开始时要求表为空
– 2) append into --在表中追加新记录
– 3) replace into --删除旧记录(相当于delete from table
语句),替换成新装载的记录
– 4) truncate into --删除旧记录(相当于 truncate table
语句),替换成新装载的记录skip=1
:表示插入数据时,跳过第一行(标题),从第二行开始导入;
3、sqluldr 导入处理
3.1、基本的导入语句
sqlldr userid=hxj/hxj control=h:\sqluldr\mv_xlsymx1_sqlldr.ctl data=h:\mx.csv
rows=1000
3.2、带有日志log参数
sqlldr userid=hxj/hxj control=h:\sqluldr\mv_xlsymx1_sqlldr.ctl data=h:\mx.csv
log=h:\log\mx.log rows=1000
注意:这里的log的路径不能写“+”;
4、虚拟列处理
sqluldr2导出数据的时候,如果该表中含有虚拟列,你导出的时候没有过滤掉虚拟列,比如:select
* from 带有虚拟列的表,那么你要对这些虚拟列进行处理,否则导入的时候会报错。
我发现了三种处理方法:
4.1、在虚拟列后面加上filler,将这一列过滤掉。
4.2、将.ctl文件中的虚拟列删除掉就可以了
4.3、在导出的时候,不导出虚拟列
5、使用并行处理
5.1 未使用并行处理
sqlldr userid=hxj/hxj control=h:\ctl\qsddlqymx1_cyqs.ctl
data=h:\qsddlqymx1_cyqs.dmp log=h:\log\qsddlqymx1_cyqs.log
5.2、使用并行处理数据
需要在导入语句中加入 direct=true parallel=true,如下所示:
sqlldr userid=hxj/hxj control=h:\ctl\qsddlqymx1_cyqs.ctl
data=h:\qsddlqymx1_cyqs.dmp log=h:\log\qsddlqymx1_cyqs.log direct=true
parallel=true
(1):首先.ctl文件必须是append into table 表名;
(2):需要导入的表不能有索引。
附录:
导出SQL数据示例:编辑SQL文件
vi sql.file
SELECT A.* FROM TEST.T_TEST_TA A
LEFT JOIN TEST.T_TEST_TF F
ON F.KN = A.ID
AND F.S_DT BETWEEN ‘20180501’ AND ‘20180531’
WHERE A.T_DT BETWEEN ‘20180501’ AND ‘20180531’
AND D.RY = ‘01’;
—执行命令
–生产N个40M 的文件
sqluldr2 user=test/123456 sql=sql.file field=0x2c record=0x0d0x0a size=40M
text=CSV safe=Yes file=./data/csv201805_%b.csv fast=yes log=csv.log
charset=ZHS16GBK
—生成一个文件
sqluldr2 user=test/123456 sql=sql.file field=0x2c record=0x0d0x0a text=CSV
safe=Yes file=./data/csv201805.csv fast=yes log=csv.log charset=ZHS16GBK
主要参数说明
user=用户名/密码@ip地址:1521/服务
query=”sql查询语句”
head=yes|no 是否导出表头
file=文件存放路径(该文件可以写很多后缀: .txt .csv .dmp
等等,我发现,导出.dmp文件速度快)
table=查询的表名 有这句话,sqluldr2会自动生成一个.ctl文件,导入的时候会用到;
Field:分隔符,指定字段分隔符,默认为逗号; 比如:field=#
在选择分隔符时,一定不能选择会在字段值中出现的字符组合,如常见的单词等,很多次导入时报错,回过头来找原因时,都发现是因为分隔符出现在字段值中了。
charset:字符集,执行导出时的字符集,一般有UTF8、GBK等;
record 分隔符 指定记录分隔符,默认为回车换行,Windows下的换行
quote 引号符 指定非数字字段前后的引号符
例如现在要改变默认的字段分隔符,用“#”来分隔记录,导出的命令如下所示:
sqluldr2 test/test sql=tmp.sql field=#
在指定分隔符时,可以用字符的ASCII代码(0xXX,大写的XX为16进制的ASCII码值)来指定一个字符,常用的字符的ASCII代码如下:
回车=0x0d,换行=0x0a,TAB键=0x09,|=0x7c,&=0x26,双引号=0x22,单引号=0x27
在选择分隔符时,一定不能选择会在字段值中出现的字符




