sqlloader运行环境
DOS环境下加载
在DOS环境中利用oracle工具sql loader来进行加载文本文件 ,既然是oracle工具,而且是将文本导入到数据
库中,那么数据库服务于监听是要提前已经启动的。
通常在unix下命令一般为sqlldr/sqlload。
sqlldr命令常用关键字说明:
userid: 数据库用户名/密码@服务器名
control: 控制文件名
log: 日志文件名
bad: 错误日志名
data: 数据文件
skip: 导入数据跳过的记录行数(默认0)
load: 导入数据记录数(默认全部)
errors: 允许导入数据错误行数(默认50)
terminated: 结束制表符(导入数据按照什么符号来分割导入)
optionally: 可选择行过滤符(如果导入数据含有符号,可以把一些符号过滤就不会把符号当作数据导入数据库)
数据加载到数据库有两种模式:
1.传统路径(conventional path): 利用sql插入为我们加载数据。
2.直接路径(direct path): 不使用sql,而是直接格式化数据库块。利用直接路径加载,能从一个外部文件读取数据并导入
至格式化的数据库块中。可以绕过sql引擎和undo解析(记录事务控制数据),并且避开redo日志(记录所有被改变的
数据)生成。效率和速率上都要好很多。
加载数据的步骤:
1.准备好数据文件。(可以是任意格式的数据文件。通常有.txt,.del,.csv,....)
2.手动编写控制文件。
3.进入DOS系统执行命令行,加载数据。
4.进入数据库查询,验证加载是否成功。
**********说明:
通常这些都是用存储过程来进行写好的,调用存储过程或者触发器来进行自动完成。数据文件则为我们的元数据,通常我
们工作时有公司提供,大部分我们要编写逻辑代码对元数据文件进行检查判断是否为ok_file(正确性文件:数据格式,制表符,
数据完整性........),控制文件通常也会用逻辑代码来实现针对不同格式,不同制表符等来实现不同的控制文件,同时也会把其生
成的日志文件,错误文件,废弃文件加载到数据库进行记录。进入DOS系统执行命令都是用逻辑代码来拼接字符串拼接命令来执
行。加载前数据量与导入后数据库数据量对比验证加载是否成功。所以这些过程所需要的一些常量值都会用一个数据表进行保存,
在用存储过程封装sql语句获取。
1.数据文件:
存在数据源为test.aaa的数据文件,(.aaa为任意数据格式),数据如下:
1 X&agec X&sewoj X&2015-21-05 16:20:32
2 X&vvgecX&fepoj X&2015-21-05 12:30:32
3 X& aeecX&pfwoj X&2015-21-05 08:40:32
4 X& akecX&fewwoj X&2015-21-05 19:20:32 (X&为任意制表符)。
2.控制文件
result.ctl内容: (.ctl为文件格式,可以是任意格式)
①.
load data
infile 'test.aaa'
into table tabletest
( testid char terminated by 'X&',
str1 char terminated by 'X&',
str2 char terminated by 'X&',
str3 date terminated "yyyy-mm-dd hh24:mi" by whitespace)
说明:
infile 指数据源文件, 这里我们省略了默认的 discardfile result.dsc badfile result.bad
into table tabletest默认是INSERT,
tabletest为数据表名
terminated by 'X&' 指用逗号分隔 (制表符)
terminated by whitespace 结尾以空白分隔
testid,str1,str2,str3为数据库数据表字段名
日期格式要进行格式化。
②.
load data
infile 'test.aaa'
truncate into table testloader
Fields terminated by 'X&'
Optionally enclosed by ' " ' (如果有数据有双引号可去掉导入数据库)
(
a,
b,
c,
d date "YYYY-MM-DD HH24:MI:SS"
)
3.DOS下执行命令
cmd--->cd \ 回到根目录 --->D: 进入D盘 --->
sqlldr userid=数据库用户名/密码 control=result.ctl log =test.log bad=test.bad
我这次测试的数据文件以及控制文件都在D盘根目录下,所以只需进入D盘,即为数据文件和控制文件的路径下执行命令行。
或者在控制文件中infile 'D:\test\file\test.aaa' 数据文件写绝对路径。
-------------------说明:
通常我们都是加载大量数据时我们可以进行优化:
加载大量数据(超过10GB)时,采用直接路径模式进行加载,并且抑制redo日志文件的产生,提高效率。
这样不产生REDO LOG,可以提高效率。然后在CONTROL文件中load data上面加一行:unrecoverable (不可恢复)此选项必须要与DIRECT共同应用(在命令行最后加上direct=true)。