在Linux环境下,SQLLoader(sqlldr)是Oracle数据库提供的一个强大的数据加载工具,它允许用户将大量数据从外部文件(如文本文件、CSV文件等)高效地导入到Oracle数据库表中,SQLLoader通过控制文件(Control File)来定义数据格式、目标表、加载方式等信息,支持多种数据加载模式,包括常规路径加载和直接路径加载,适用于数据迁移、批量数据导入等场景,本文将详细介绍Linux环境下sqlldr命令的使用方法、核心参数、控制文件语法及常见应用场景。

sqlldr命令基本语法
sqlldr命令的基本语法结构如下:
sqlldr username/password@control_file=ctl_file_path [options]
username/password是Oracle数据库的登录凭据,control_file指定控制文件的路径,options为可选参数,用于覆盖控制文件中的默认设置或指定额外行为。sqlldr scott/tiger@orcl control=loader.ctl log=loader.log bad=loader.bad表示使用scott/tiger用户连接orcl实例,通过loader.ctl控制文件加载数据,并生成日志文件loader.log和坏文件loader.bad。
核心参数详解
sqlldr命令支持多种参数,以下为常用参数及其功能说明:
| 参数 | 说明 | 示例 |
|---|---|---|
userid |
数据库用户名/密码@连接标识 | userid=scott/tiger@orcl |
control |
控制文件路径 | control=/path/to/loader.ctl |
log |
日志文件路径 | log=/path/to/loader.log |
bad |
坏文件路径(存储格式错误的数据) | bad=/path/to/loader.bad |
data |
数据文件路径(若未在控制文件中指定) | data=/path/to/data.txt |
discardmax |
最大丢弃记录数(默认全部保留) | discardmax=100 |
rows |
常规路径下的提交批大小(默认常规路径为300) | rows=500 |
direct |
使用直接路径加载(TRUE/FALSE,默认FALSE) | direct=true |
parallel |
并行加载模式(需配合load参数) |
parallel=4 |
skip_index |
直接路径加载时是否跳过索引构建(TRUE/FALSE) | skip_index=true |
控制文件(Control File)结构
控制文件是sqlldr的核心,定义了数据加载的完整逻辑,一个典型的控制文件包含以下部分:

- 选项部分(OPTIONS):设置全局参数,如
ROWS=1000、DIRECT=TRUE等。 - 加载部分(LOAD DATA):指定加载模式(
INFILE、INTO TABLE等)。 - 字段定义部分(FIELDS):描述数据文件中的字段分隔符、数据类型、转换规则等。
控制文件示例:
OPTIONS (DIRECT=TRUE, ROWS=500)
INFILE '/data/employee.dat'
INTO TABLE employees
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
employee_id INTEGER EXTERNAL,
employee_name CHAR(50),
hire_date DATE 'YYYY-MM-DD',
salary DECIMAL(10,2),
department_id INTEGER
)
OPTIONS:启用直接路径加载,设置批提交大小为500行。INFILE:指定数据文件路径。INTO TABLE:目标表为employees。FIELDS TERMINATED BY ',':字段以逗号分隔。OPTIONALLY ENCLOSED BY '"':字段可能被双引号包围。- 字段定义:
INTEGER EXTERNAL表示外部字符串转换为整数,DATE 'YYYY-MM-DD'指定日期格式。
数据文件格式要求
数据文件需严格遵循控制文件定义的格式,上述控制文件对应的数据文件示例:
1,"John Doe",2023-01-15,5000.00,10
2,"Jane Smith",2023-02-20,6000.00,20
- 换行符:Linux环境下需使用
\n作为换行符。 - 空值处理:若某字段为空,需留空或使用控制文件定义的NULL值(如
NULL字符串)。 - 特殊字符:字段分隔符、 enclosure字符需与控制文件一致,避免转义问题。
常规路径与直接路径加载
-
常规路径加载(Conventional Path):
- 通过SQL引擎逐行插入数据,支持触发器、约束检查,但速度较慢。
- 适用场景:数据量小、需严格验证数据完整性。
- 参数:
DIRECT=FALSE(默认)。
-
直接路径加载(Direct Path):
- 绕过SQL引擎,直接将数据写入数据文件,速度更快,但会禁用触发器和部分约束。
- 适用场景:大批量数据加载,对数据完整性要求较低。
- 注意事项:需确保目标表无未提交的DML操作,且
nologging模式可提升性能。
错误处理与日志分析
sqlldr会生成三类文件:

- 日志文件(.log):记录加载过程、统计信息(如成功/失败行数)。
- 坏文件(.bad):存储因格式错误无法加载的数据。
- 丢弃文件(.dsc):若定义
DISCARD子句,存储被逻辑过滤的数据。
通过分析日志文件中的错误信息(如“列类型转换失败”),可调整数据文件格式或控制字段定义。
高级应用场景
-
数据转换与过滤:
- 控制文件中可使用
WHEN子句过滤数据,如WHEN (department_id = 30)。 - 使用
NULLIF和DEFAULTIF处理空值,如NULLIF (salary = 0)。
- 控制文件中可使用
-
并行加载:
- 通过
PARALLEL参数和多数据文件实现并行加载,提升效率,需确保表已分区或启用并行DML。
- 通过
-
加载到多个表:
- 单个控制文件可加载到多个表,通过
INTO TABLE多次定义,并使用POSITION指定字段映射。
- 单个控制文件可加载到多个表,通过
常见问题与解决方案
-
字符编码问题:
- 确保数据文件与数据库字符集一致,可通过
NLS_LANG环境变量指定,如export NLS_LANG=AMERICAN_AMERICA.AL32UTF8。
- 确保数据文件与数据库字符集一致,可通过
-
权限不足:
确保用户有目标表的INSERT权限,直接路径加载还需ALTER TABLE权限。
相关问答FAQs
Q1: sqlldr加载时出现“记录1:拒绝 - 未找到字段”错误,如何解决?
A1:通常因数据文件字段数量与控制文件定义不匹配,检查数据文件每行的字段数是否与控制文件FIELDS子句一致,尤其注意末尾字段是否遗漏分隔符,若控制文件定义5个字段,数据文件某行仅4个字段,需补充逗号或检查字段分隔符是否正确。
Q2: 如何在sqlldr加载时跳过重复键值错误(ORA-00001)?
A2:可通过以下方式处理:
- 使用
SKIP_UNUSABLE_INDEXES参数:sqlldr ... SKIP_UNUSABLE_INDEXES=TRUE,但需确保索引已标记为不可用。 - 预处理数据:通过唯一键去重后再加载。
- 直接路径加载+
APPEND:若允许覆盖,使用LOAD DATA APPEND,但需确保无主键冲突。
推荐结合业务逻辑选择合适方案,避免数据丢失。
