续上次对oracle中sqlload数据加载的一个说明,由于在工作中实际运用中,遇到一些详细问题,在不断的探索中并得到解决,在此做个总结,对sqlload加载数据所能遇到的一些问题及解决方法:
上次对oracle数据加载工具做了一些详细介绍:sql loader应用
常见错误:
说明:无权限错误。
解决方法:
1.检查当前用户是否存在对文件的创建及其修改权限。
2.检查加载数据文件中所要创建文件的目录在哪个用户下,与当前用户是否一致。
eg:
sqlldr userid=username/passwordd@服务监听对象 control=XXXX.ctl log=xxx.log bad=xxx.bad
direct =true
这个命令即为导入数据文件命令行,其中有log日志文件的生成,bad日志在导入有错误时才会创建提示错误,而log日志是在一开始导入就会进行创建,则通常情况下会指定创建目录,这时就要注意,log日志所在目录,当前登入用户是否有权限进行创建文件。
还有一个快速的方法:就是在命令中把log=xxx.log去掉,就是不创建日志文件,就避免权限问题。
在上次文章中也说明到,通常工作中都是会写成脚本对控制文件进行自动生成的。
如下例子:在/home/use/ftpshell/dir_shell下有如下脚本:
p21_control.sql 所需参数(表名,文件名,生成控制文件目录,文件所在目录)
注意: 通常脚本是以.sql脚本结尾
说明: 不能创建输出文件
通常解决方法:
1. 在生成控制文件的脚本中避免(在逻辑代码中转义\或者多加一个.)
sqlplus username/password@服务监听对象(13.1.26.193:1521/ftpdb) @脚本(p21_control.sql)
表名 文件名 生成控制文件目录 数据文件所在目录
例如:
sqlplus mtb/[email protected]:1521/ftbdb @/home/user/ftpshell/dir_shell/p21_control.sql c_test_table test_data.dat /home/data/dir_ctl/ /home/data/20170517/
注意: 1.别漏写 / ,不然路径会错误。
2.此处要生成控制文件,即对该目录下当前用户是否有权限创建,避免出现错误。
2.在命令中加转义或.
@/home/user/ftpshell/dir_shell/p21_control..sql
或者: @/home/user/ftpshell/dir_shell/p21_control\.sql
为了确保分割符的正确性。一般对分割符采用十六进制来运行的。
意思就是说对于数据文件我们首先得看一下该文件采用的是什么分割符,然后对其转为十六进制,修改 控制文件。
eg: 分割符为: 口
获取其十进制编码:
select ascii('口') from dual; 结果为: 3
转为十六进制后:03 X代表十六进制。
即为: 控制文件进行修改:
fields terminated by X'03'
这样就确保了分割符的正确性。
通常就是会出现中文乱码问题。通常就是数据文件的字符集编码格式与oracle字符集编码不一致导致中文乱码问题。
解决方法:
可以先在IDE编辑器中查看数据文件的字符集编码。然后对控制文件进行进行设置字符集编码。
如:数据文件编码格式为UTF-8,则控制文件编码格式设置为: characterset AL32UTF8
通常能遇到加载数据有部分数据加载失败。则对该类问题进行分析(仅供参考):
1.查看bad日志,看是哪些字段导入错误,查看数据库,查看该字段数据类型与要导入的数据文件数据是否
一致。
2.日期格式数据导入错误。
就是说有些数据是日期格式的,通常对于这类数据都是要在控制文件中对这类数据的数据格式进行加
工后再导入: DATA "YYYY-MM-DD HH24 MI SS"
3.其他异常。
有些异常比较奇怪,就是在查看数据发现不了什么问题,没有解决思路。
这时可以把未导入的bad日志修改成要导入的数据文件再次进行导入,这时导入后再次查看日志文件。
如果还是没有导入成功的话,就对bad日志文件进行分析。查看是否有数据导入还是全部未导入。如果 有部分导入成功,可以对剩下的重复之前操作。 如果未全部导入,则进行修改控制文件,对所有字段的
数据类型改成char 类型,即全部当成字符串处理强行导入。然后再次对导入的数据进行分析。有中文乱
码或其他问题即可发现。发现后对其解决,然后再清除数据,对问题进行解决后再次导入。
以上仅是个人工作中所发现问题及其解决方法的思路,仅供参考!