1.SQL*Loader (sqlldr)
1.1 概述
作用:Oracle 官方工具,用于将外部数据文件(如 CSV、文本文件)高效加载到数据库表中。
特点:
支持多种数据格式(定长、变长、CSV)。
支持直接路径加载(Direct Path Load),绕过 SQL 引擎,提升性能。
提供错误记录和丢弃无效数据的功能。
1.2 核心组件
控制文件 (Control File):定义数据加载规则,包括数据文件路径、目标表、字段映射等。
数据文件 (Data File):存储待加载的原始数据。
日志文件 (Log File):记录加载过程的详细信息。
错误文件 (Bad File):存储无法加载的数据。
废弃文件 (Discard File):存储因条件过滤被丢弃的数据。
1.3 使用步骤
步骤 1:编写控制文件
-- 示例:加载 CSV 文件到 EMP 表
OPTIONS (SKIP=1) -- 跳过 CSV 文件标题行
LOAD DATA
INFILE 'emp_data.csv' -- 数据文件路径
BADFILE 'emp_bad.bad' -- 错误文件
DISCARDFILE 'emp_discard.dsc' -- 废弃文件
APPEND INTO TABLE EMP -- 目标表,APPEND 表示追加数据
FIELDS TERMINATED BY ',' -- 字段分隔符
TRAILING NULLCOLS -- 允许末尾空列
(
EMPNO,
ENAME,
JOB,
MGR,
HIREDATE DATE "YYYY-MM-DD", -- 日期格式转换
SAL,
COMM,
DEPTNO
)
步骤 2:执行 SQL*Loader 命令
sqlldr userid=scott/tiger@orcl control=loader.ctl log=loader.log
1.4 高级功能
并行加载:使用 PARALLEL 参数加速大数据加载。
直接路径加载:通过 DIRECT=TRUE 提升性能(需注意表锁定)。
条件过滤:使用 WHEN 子句过滤数据。
数据转换:在控制文件中使用 SQL 函数(如 TO_DATE, SUBSTR)。
2.SQLULDR2 (SQLLDR 的增强工具)
2.1 概述
作用:第三方工具(非 Oracle 官方),用于从 Oracle 数据库高效导出数据到文件。
特点:
性能远超传统 UTL_FILE 或 SPOOL。
支持多线程导出。
输出格式灵活(CSV、定长、自定义分隔符)。
支持压缩和拆分文件。
2.2 安装与使用
下载:从第三方网站(如 www.sqluldr2.com)获取二进制文件。
基本命令:
sqluldr2 user=scott/tiger@orcl query="SELECT * FROM EMP" file=emp_data.csv
2.3 常用参数
参数 说明
user 数据库连接字符串
query 导出数据的 SQL 查询
file 输出文件路径
head 是否包含列标题(默认为 yes)
field 字段分隔符(默认 ,)
charset 输出文件字符集(如 UTF8)
thread 多线程导出(提升性能)
split 拆分文件大小(如 100M)
2.4 示例
#导出数据为 CSV,使用 4 线程,文件拆分为 100MB
sqluldr2 user=scott/tiger@orcl query="SELECT * FROM EMP" \
file=emp_data.csv head=yes field=, charset=UTF8 thread=4 split=100M
3.常见问题与解决
3.1 SQL*Loader
错误 ORA-00942:检查用户是否有目标表的权限。
日期格式错误:确保控制文件中的日期格式与数据文件匹配。
性能慢:尝试启用 DIRECT=TRUE 或调整 READSIZE/BINDSIZE。
3.2 SQLULDR2
中文乱码:指定正确的字符集(如 charset=ZHS16GBK)。
内存不足:减少线程数(thread)或增加 rows 参数。
权限问题:确保导出目录有写入权限。
4.学习资源
官方文档:
SQL*Loader Documentation
SQLULDR2 需参考第三方文档或 README。
书籍推荐:
《Oracle Database Utilities 19c》
《Oracle SQL*Loader: The Definitive Guide》
社区资源:
Oracle Forums (community.oracle.com)
Stack Overflow (stackoverflow.com)