使用SQL*Loader导入含多行CLOB列的CSV至Oracle表报错
故障原因
- 现有控制文件未配置双引号字段识别规则,会把INFO字段(双引号包裹的多行日志)里的内嵌逗号、换行符误判为字段/行分隔符,直接触发字段错位、类型不匹配、长度超限类报错
- 未配置跳过CSV首行表头,会把
server_name,database_name...这类表头文本当成数据写入,触发日期、CLOB字段类型校验错误 - CLOB字段未指定读取缓冲区规则,无法正确加载长文本多行内容
- TIMESTAMP字段配置末尾多余的
:timestamp绑定变量写法会导致字段映射逻辑异常
修正后可用的SQL*Loader控制文件
OPTIONS (SKIP=1, READSIZE=10485760, STREAMSIZE=10485760) load data infile '/tmp/daily_hot_backup.csv' append into table BACKUP_POSTGRESQL_LOGS fields terminated by "," OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( SERVER_NAME CHAR(120), DATABASE_NAME CHAR(52), TIMESTAMP DATE "DD-MON-YYYY HH24:MI:SS", INFO CHAR(32767) CLOB, BACKUP_ERROR CHAR(1) );
配置说明
SKIP=1:跳过CSV第一行表头,避免表头文本作为数据加载触发类型错误READSIZE=10485760、STREAMSIZE=10485760:将读缓冲区、流加载缓冲区调整为10MB,适配pg_basebackup长日志的加载需求,避免字段截断OPTIONALLY ENCLOSED BY '"':识别双引号包裹的字段边界,双引号内部的逗号、换行符不会被判定为字段/行分隔符,从根源解决多行INFO字段解析错位的问题INFO CHAR(32767) CLOB:指定INFO字段先按最长32KB字符串读取,再写入CLOB类型字段,兼容多行文本加载逻辑- 移除了TIMESTAMP字段后多余的
:timestamp绑定配置,避免字段映射错误。如果实际数据中存在仅带日期、不带时分秒的时间值,可以将日期格式掩码调整为DD-MON-YYYY HH24:MI:SS,搭配TIMESTAMP DEFAULTIF TIMESTAMP=BLANKS配置默认时间值,避免日期解析报错
加载注意事项
- 执行sqlldr命令前,确认Oracle运行用户对
/tmp/daily_hot_backup.csv有可读权限,避免文件读取失败 - 如果单条备份日志长度超过32KB,可以同步调大
INFO CHAR()括号内的长度值,以及READSIZE、STREAMSIZE参数值,最大支持到2GB - 加载完成后检查同目录下生成的
.bad、.log文件,排查是否存在个别行格式异常导致加载失败的问题
内容的提问来源于stack exchange,提问作者vinoth kumar
相关产品推荐
相关产品推荐

