将CSV文件导入Oracle数据库失败,日志文件为空求助
CSV导入Oracle失败且日志为空的排查方案
问题背景
尝试将CSV文件导入Oracle数据库表,但操作失败,且日志文件始终为空。相关文件如下:
CSV示例
SendingFri,LoggingTime,RenewalNumber,TransactionType,Status,Duration 22997186945,2023-07-25-00:05:56.301,23900032093333,Payment,SUCCESS,null 22951547347,2023-07-25-00:04:12.794,23900336289912,Payment,SUCCESS,null
Shell脚本
#!/bin/bash # Oracle Database Connection Details USERNAME='abc' PASSWORD="abc" HOST="myip" PORT="1521" SERVICE_NAME="abc" # CSV File Details CSV_FILE="/home/hdegboevi/modified5.csv" TABLE_NAME="myCANALINFORMATION" # Control File CONTROL_FILE="my_control_file.ctl" # Create a control file cat <<EOF > $CONTROL_FILE LOAD DATA INFILE '$CSV_FILE' APPEND INTO TABLE $TABLE_NAME FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( SENDINGFRI, LOGGINGTIME, RENEWALNUMBER, TRANSACTIONTYPE, STATUS, DURATON ) EOF # Run SQL*Loader sqlldr $USERNAME/$PASSWORD@$HOST:$PORT/$SERVICE_NAME control=$CONTROL_FILE log=/home/hdegboevi/sqlldr.log /home/hdegboevi # Check the log for errors if grep "ORA-" sqlldr.log; then echo "Error occurred during data load. Please check sqlldr.log for details." else echo "Data loaded successfully." fi
排查要点
- sqlldr命令参数错误:原命令末尾多余的
/home/hdegboevi会被当作无效参数,导致sqlldr无法正常启动,甚至无法生成日志。需删除该多余路径,修正后的命令:sqlldr $USERNAME/$PASSWORD@$HOST:$PORT/$SERVICE_NAME control=$CONTROL_FILE log=/home/hdegboevi/sqlldr.log - 控制文件字段拼写错误:CSV中的字段为
Duration,但控制文件中误写为DURATON(缺少字母i),这会导致字段映射失败,需修正为DURATION。 - 日志文件权限问题:检查
/home/hdegboevi/sqlldr.log所在目录的读写权限,确保当前用户拥有写入权限,避免sqlldr无法生成日志。 - 数据库连接验证:手动使用sqlplus测试连接:
确认连接正常,排除因连接失败导致无日志输出的情况。sqlplus $USERNAME/$PASSWORD@$HOST:$PORT/$SERVICE_NAME - 控制文件路径问题:当前脚本生成的控制文件在执行脚本的当前目录,若执行目录不是
/home/hdegboevi,sqlldr可能找不到控制文件。建议指定控制文件的绝对路径:CONTROL_FILE="/home/hdegboevi/my_control_file.ctl" - 跳过CSV表头:当前控制文件会将CSV的第一行表头当作数据导入,需在控制文件中添加
SKIP=1跳过表头,修改后的控制文件片段:LOAD DATA INFILE '$CSV_FILE' APPEND INTO TABLE $TABLE_NAME FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS SKIP 1 ( SENDINGFRI, LOGGINGTIME, RENEWALNUMBER, TRANSACTIONTYPE, STATUS, DURATION ) - sqlldr命令可用性:执行
which sqlldr确认命令存在,且当前用户有权限调用。
内容的提问来源于stack exchange,提问作者Godwin
相关产品推荐
相关产品推荐

