前言
在报表统计项目中,经常需要从生产库导出大数量明细数据,但在日常的图形化客户端导出明细通常都需要比较长时间才能全量导出或者在导出过程中容易出现内存溢出,通过使用 SQLULDR2,可实现高效导出数据。SQLULDR2 是一款轻量级的 SQL 数据导出工具,全称为 SQL UnLoader。与 Oracle 的传统数据导出工具(如 SQLLoader 和 Data Pump)相比,它更小巧高效,尤其适用于大规模导出 Oracle 数据到文件系统中,比如 CSV、TXT 或自定义格式。
相关工具
sqluldr2 解压后,文件夹内容如下:
- sqluldr2_rhel6_110201.bin(Linux)
- sqluldr264.exe(Windows)
sqluldr2 特点:
- 高性能:直接利用 OCI(Oracle Call Interface)进行数据提取,性能优于传统工具。
- 轻量化:单个可执行文件,无需复杂配置。
- 灵活性强:支持 SQL 查询结果导出,支持字段分隔符和文件编码的自定义。
适用场景:
- 数据迁移:从 Oracle 数据库导出大表到文件,再导入到其他数据库或系统中。
- 报表生成:快速提取符合报表要求的数据并生成 CSV 或 TXT 格式。
- 备份与归档:定期将历史表的数据导出为本地文件归档。
环境配置
如果使用的运行环境中没有安装oracle,sqluldr2不能运行,则需要单独安装 Oracle 客户端(Instant Client)。
详细配置步骤可参考文章:在 Linux 服务器中连接Oracle Instant Client
安装完成 Instant Client 后将 sqluldr2_rhel6_110201.bin 上传到相应目录下,并将文件重命名为:sqluldr2,修改相应权限:
[root@pc01:/soft]$ chmod 775 sqluldr2_rhel6_110201.bin [root@pc01:/soft]$ mv sqluldr2_rhel6_110201.bin sqluldr2
测试sqluldr2 是否能成功运行,如正常配置则会输出如下:
[oracle@pc01:/soft]$ ./sqluldr2
SQL*UnLoader: Fast Oracle Text Unloader (GZIP, Parallel), Release 5.0.1
(@) Copyright Lou Fangxin (AnySQL.net) 2004 - 2023, 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_%p.txt)
lobfile = output file name for lob LLS storage (default: none)
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
数据导出
单一文件导出
以下演示从数据库中导出一份格式为 txt 格式的文件。
sqluldr2 user=dbuer/passwd@192.168.0.10:1521/orcl query="select * from dbuer.test_table" field="|" batch=no file=/soft/test_table.txt log=/soft/test_table_txt.log
导出完成后可在相应目录看到输出文件,查看日志文件内容如下:
[root@pc01:/soft]$ cat 1.log 0 rows exported at 2024-11-16 23:44:15, size 0 MB. 267 rows exported at 2024-11-16 23:44:15, size 0 MB. output file /soft/test_table.txt closed at 267 rows, size 0 MB.
分批导出
当表的数据量太大,单一文件导出后,如果记录数超出单个 excel 工作表的数量,则 excel 打开查看时会提示超出最大行数限制,不便于进行数据查看,此时可以设置每个文件的记录数大小,将数据分多文件导出,设置的文件名需要加上 %B
sqluldr2 user=dbuer/passwd@192.168.0.10:1521/orcl sql="test_table.sql" field="|" batch=yes rows=500000 file=/soft/test_table_%B.csv log=/soft/test_table_csv.log
💡如果导出的语句涉及到多表关联等复杂查询,这时可将语句放到一个 sql 文件中,sql 指向文件路径即可。
常用参数:
| 参数名称 | 描述 |
|---|---|
| userid | 用户名、密码和数据库连接信息(与 SQL*Plus 的连接方式一致) |
| query | 需要执行导出的查询语句 |
| sql | 指定需要执行的 sql 文件 |
| file | 导出数据的目标文件路径及名称 |
| field | 字段分隔符(如逗号为默认值 ,、制表符 \t、自定义符号等) |
| batch | 如需要分多文件导出则 bath = yes,否则 batch = no |
| rows | 当 batch = yes 时,对应每个文件最多导出行数 |
| log | 日志文件路径,可记录运行中的信息 |
| head | 当 head=yes 时表示输出表头 |
| quote | 引号符 指定非数字字段前后的引号符 |
| record | 记录分隔符,通常用作行尾符号(如换行符 \n) |
| arraysize | 每次提取数据的行数,默认值较小,适当调整可提升性能 |
| charset | 数据文件的字符集编码 |
💡在指定分隔符时,可以用字符的ASCII代码。常用的字符的ASCII代码如下:
回车=0x0d,换行=0x0a,TAB键=0x09,|=0x7c,&=0x26,双引号=0x22,单引号=0x27
当我们在选择分隔符的时候,要留意数据内容是否会包含分隔符,要保证分隔符不能出现在数据内容中。
总结
SQLULDR2 是一款轻量级、高性能的 Oracle 数据导出工具,特别适合大规模数据提取和格式化导出任务,但需结合脚本和其他工具实现更多扩展功能(如结合脚本定时自动备份表数据,并将数据文件进行压缩)。
工具对比:
| 工具 | 优势 | 劣势 |
|---|---|---|
| SQLULDR2 | 高性能、轻量级、灵活导出 | 非官方工具,功能单一,缺乏导入、增量同步等功能 |
| Data Pump | 全量导出和导入,支持分区、大量并发 | 配置复杂,权限要求高 |
| SQL*Plus | 自带工具,简单易用 | 性能较低,导出功能有限 |
| 图形化客户端 | 可视化,多种导出方式 | 大数据量表导出性能较低 |
使用建议:
- 使用合适的
arraysize参数,(如 5000-10000),提高导出速度 - 导出完成后通过管道实时压缩(如
gzip)




