sql load的初体验

      今天第一次使用oracle的sql toad,感觉挺好的,我们在使用imp或是impdp的时候可以备份,恢复维护我们的数据库,尽管她在不同版本之前有version这个参数(在小版本之间可以来回迁移,在大的版本之间尚未测试),还是感觉不是太好的;如果想在不同版本之间的做迁移我们可以使用oracle load它可以把一些以文本格式存放的数据顺利的导入到oracle数据库中,是一种在不同数据库之间进行数据迁移的非常方便而且通用的工具。缺点就速度比较慢,另外对blob等类型的数据就有点麻烦了。 

oracle自己带了很多的工具可以用来进行数据的迁移、备份和恢复等工作。但是每个工具都有自己的特点。比如说exp和imp可以对数据库中的数据进行导出和导出的工作,是一种很好的数据库备份和恢复的工具,因此主要用在数据库的热备份和恢复方面。有着速度快,使用简单,快捷的优点;同时也有一些缺点,比如在不同版本数据库之间的导出、导入的过程之中,总会出现这样或者那样的问题,这个也许是oracle公司自己产品的兼容性的问题吧。  
我们可以在dos下面或是linus上面查看sqlldr的帮助:

         在dos下面直接执行sqlldr就可以查看:

C:\>sqlldr


SQL*Loader: Release 10.2.0.3.0 - Production on 星期五 12月 16 11:29:08 2011


Copyright (c) 1982, 2005, Oracle.  All rights reserved.




用法: SQLLDR keyword=value [,keyword=value,...]


有效的关键字:


    userid -- ORACLE 用户名/口令
   control -- 控制文件名
       log -- 日志文件名
       bad -- 错误文件名
      data -- 数据文件名
   discard -- 废弃文件名
discardmax -- 允许废弃的文件的数目         (全部默认)
      skip -- 要跳过的逻辑记录的数目  (默认 0)
      load -- 要加载的逻辑记录的数目  (全部默认)
    errors -- 允许的错误的数目         (默认 50)
      rows -- 常规路径绑定数组中或直接路径保存数据间的行数
               (默认: 常规路径 64, 所有直接路径)
  bindsize -- 常规路径绑定数组的大小 (以字节计)  (默认 256000)
    silent -- 运行过程中隐藏消息 (标题,反馈,错误,废弃,分区)
    direct -- 使用直接路径                     (默认 FALSE)
   parfile -- 参数文件: 包含参数说明的文件的名称
  parallel -- 执行并行加载                    (默认 FALSE)
      file -- 要从以下对象中分配区的文件
skip_unusable_indexes -- 不允许/允许使用无用的索引或索引分区  (默认 FALSE)
skip_index_maintenance -- 没有维护索引, 将受到影响的索引标记为无用  (默认 FALSE)
commit_discontinued -- 提交加载中断时已加载的行  (默认 FALSE)
  readsize -- 读取缓冲区的大小               (默认 1048576)
external_table -- 使用外部表进行加载; NOT_USED, GENERATE_ONLY, EXECUTE  (默认 NOT_USED)
columnarrayrows -- 直接路径列数组的行数  (默认 5000)
streamsize -- 直接路径流缓冲区的大小 (以字节计)  (默认 256000)
multithreading -- 在直接路径中使用多线程
 resumable -- 启用或禁用当前的可恢复会话  (默认 FALSE)
resumable_name -- 有助于标识可恢复语句的文本字符串
resumable_timeout -- RESUMABLE 的等待时间 (以秒计)  (默认 7200)
date_cache -- 日期转换高速缓存的大小 (以条目计)  (默认 1000)


PLEASE NOTE: 命令行参数可以由位置或关键字指定
。前者的例子是 'sqlload
scott/tiger foo'; 后一种情况的一个示例是 'sqlldr control=foo
userid=scott/tiger'.位置指定参数的时间必须早于
但不可迟于由关键字指定的参数。例如,
允许 'sqlldr scott/tiger control=foo logfile=log', 但是
不允许 'sqlldr scott/tiger control=foo log', 即使
参数 'log' 的位置正确。


C:\>

在使用sqlldr的时候使用到的文件包括:

 数据文件Data File:数据源[文本文件]
控制文件Control File:导入数据规则此控制文件非彼控制文件,是定义导如的规则!
日志文件Log File:导入数据记录情况
坏文件Bad File:插入记录出错,如违反唯一约束,非空约束...
卡片文件Discard File:没有被选择的记录

依次是我们要导入的内容,我们执行的代码,我们导入的日志,在导入过程中出现的插入记录错误,没有被选择的记录(这个我还不太理解是没有插入的记录还是上面?)

t.txt

这个是我要插入的内容:

a,b,c
a,b,c
a,b,c
a,b,c
a,b,c
a,b,c
a,b,c
a,b,c
a,b,c

我们需要根据我们要插入的内容在数据库中创建相应的表,以便我可以插入内容

这是我的表结构

SQL> desc s
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------
 S_I                                                VARCHAR2(10)
 S_E                                                VARCHAR2(10)
 S_N                                                VARCHAR2(10)

t.ctl

这个是我的执行脚本

options (errors=-1)
load data
infile 'c:\t.txt'
badfile 'c:\error.bad'
discardfile 'c:\discard.txt'
truncate into table s  --这里有几个参数分别是insert ,append,truncate,replace分别表示,插入到空表中;追加到表中;删除表中的内容在插入;替代表中的内容跟truncate一致
fields terminated by ',' TRAILING NULLCOLS
(s_i,s_e,s_n)


下面我们可以执行:

C:\>sqlldr scott/tiger control=c:\c.ctl log='c:\cc.log'
在日志中会记录我们插入的过程,甚至包括使用的cpu,使用的时间等

在使用工程中有几个参数我们需要注意一下:

如果表中没有索引,可以加上 direct=y 这样更快

skip_index_maintenance=no 维护索引
skip_index_maintenance=yes 不维护索引
parallel =false 非并行处理
当parallel =true and skip_index_maintenance=no 则不可用 原因: 并行插数时 索引无法维护 访问资源冲突


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值