您的位置:首页 > 数据库 > Oracle

Oracle自动导入数据文件(类似bcp的功能)及问题记录SQL*LOADER-704,ORA-12504

2016-07-15 12:23 816 查看
工作需求:将unl文件利用shell脚本导入到oracle数据库,这样就可以定期执行shell来导入数据库。

背景:unl文件大小700M,数据量125万条。因为数据量太大,所以不能全部insert,另外,要分开提交,不能一次全部提交,参数用rows来控制,后面会有解释。

数据格式:103096653999363@|#@|#04@|#4240@|#1426@|#翼城县德荣副食部(万村千乡)

oracle表格式与数据格式字段完全对齐

oracle需要写控制文件。

oracle控制文件sql.ctl

load data
infile '/home/nice/data.txt'
append
into table TABLE_TEST_INFO
fields terminated by '@|#'
trailing nullcols
(
MERCH_ID,
AREA,
CODE,
TEST1,
TEST2,
ADDRESS
)
其中append可以替换为

1) insert     --为缺省方式,在数据装载开始时要求表为空

2) append  --在表中追加新记录

3) replace  --删除旧记录(用 delete from table 语句),替换成新装载的记录

4) truncate --删除旧记录(用 truncate table 语句),替换成新装载的记录

fields terminated 表示分隔符

trailing nullcols在参考博客的解释中说:表示代表的字段没有值时,允许为空,但经过实践,意思应该不是这个。实践中,数据会插入到trailing nullcols的参数中,如果没有在参数中显示表明,会直接设置为null值,比如如果不写AREA这一列,那么所有的数据中,AREA值均为null。

然后可以先不写shell,先尝试一下命令。这里采用Windows下的cmd(Linux的shell应该也可以,目前在测试,还未在Linux下应用)。打开cmd,路径进入ctl和data.txt所在的路径,运行

sqlldr system/123456@orcl control=sql.ctl log=log.log bad=bad.log errors=5000 rows=500


我的oracle参数,Database Server是localhost,Port 1521,Service ORCL,注意sqlldr的参数,@前面的参数是用户名和密码,后面的参数是Service,如果写localhost是会出错的,后面会有出错的情况。另外,log里面可以看到运行时的log错误,bad里面会保存出错的数据,errors表示出错数据量达到5000时停止,这里可以改小一些,因为我的数据量很大,所以调的高了。rows表示500行提交一次,因为Undo的空间是有限的,数据量太大的话,会提示内存不足。

控制文件大概介绍到这里为止。125万条数据,本地运行9分50秒结束,远程数据库待测试,因为目前出了问题,后面在来补充。

然后介绍出现的问题及修改方式:

1.环境搭建问题:

因为一开始需要Linux和oracle同时存在的环境,单位里只有远程的oracle,对于一个刚接触oracle的人来说,不可避免的想去搭建一个Linux+oracle的本地测试环境。但我只有Linux虚拟机,而虚拟机在联网的时候又出现了问题(不管桥接模式还是NAT模式都不行),后来发现oracle只要安装好了以后,是可以直接在本地用shell脚本访问远程数据库的。所以直接在cmd下用命令访问了,因为sqlldr命令是与系统无关的,只要有oracle就可以。

2.oracle安装好后无法用初始用户名账号登录的问题:

网上给了很多初始用户名和密码,sys/sys,scott/tiger,system/任意字符之类的,但是我一个没登录上去,后来好像是在oracle自带的工具里面发现了账户管理,但那时候已经登录上去了。

解决方法:命令行里输入

sqlplus /nolog
SQL > conn /as sysdba
SQL > alter user system identified by password;
SQL > alter user sys indentified by password;
SQL > alter user system identified by manager;
SQL > alter user system account unlock;

3.SQL*LOADER-704,ORA-12504的问题:

在解决问题2的时候,我尝试过重新安装oracle,但是不小心把oracle升级了,所以产生了两个oracle,oracle-OraDB12HOME1和oracle-OraDB12HOME2(我并不知道区别),所以可能是产生了上面两个错误。

解决方法:将两个oracle的tnsnames.ora文件设为一致,OraDBHOME1的tnsnames.ora文件内容配置更多一些,所以我就将HOME2的tnsnames.ora也设置为和HOME1的tnsnames.ora完全一致的了。问题解决。

另外一个,在插入测试数据的时候,产生了乱码,只插入了第一行,后面在插入的时候就产生了ORA-12504错误,解决乱码的问题,试试将数据转换为其他编码方式,最后我转为ANSI编码就好,不一定是UTF-8,插入后乱码问题得到了解决,ORA-12504也没有了,当然ORA-12504并不一定是乱码的问题,只是其中一个因素,我们在解决的时候,可以将乱码问题优先解决,再去看配置问题。

参考:http://www.cnblogs.com/wingsless/archive/2012/08/04/2622824.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: