zoukankan      html  css  js  c++  java
  • Oracle--大数据迁移--sqlldr技术的应用

    1. 让表不产生REDO LOG
    SQL> ALTER TABLE  table_name   nologging;

    2.编写控制文件 *.ctl (重点)

    如 0120.ctl

    3.准备数据文件 

    如 0120.csv

    4. 在装有oracle服务的Linux服务器上执行

    sqlldr    db_user/db_pwd@//url:port/orcl   control=0120.ctl   direct=true ; 注意这里的数据库连接串是oracle 18c的写法。

    5. 执行结果

    先使用 echo $?  回车,结果为0是成功;它也会生成日志文件查看具体情况的

     

    详解0120.ctl的文件内容(以下表字段是原表的缩略版,删除了不少字段,但不影响使用)

    OPTIONS (skip=1,rows=5000,errors=0) -- sqlldr 命令显示的选项可以写到这里边来,skip=1 用来跳过数据中的第一行(第一行往往是表头)
    unrecoverable                    -- 此选项必须要与DIRECT共同应用  
    LOAD DATA 
    CHARACTERSET 'UTF8'             --设置编码
    INFILE "0120.csv"                 --指定外部数据文件  
    --INFILE "0121.csv"              --若有多个数据文件要以前执行,则按照本行的写法继续写
                                    --这里还可以使 用 BADFILE、DISCARDFILE 来指定坏数据和丢弃数据的文件,  
    truncate                         --操作类型,truncate会清空表,还可以有 append 追加数据 
    INTO TABLE table_name             -- 要插入记录的表  
    Fields terminated by ","         -- 数据中每行记录用 "," 分隔  
    Optionally enclosed by '"'         -- 数据中每个字段用 '"' 框起,比如字段中有 "," 分隔符时  
    trailing nullcols                 --表的字段没有对应的值时允许为空  
    (  
    --  virtual_column FILLER,         --这是一个虚拟字段,用来跳 过由 PL/SQL Developer 生成的第一列序号,若有则需要跳过该列,否则注释掉  
      oid "sys_guid()"        ,          -- 第一个主键字段使用 oracle的uuid函数生成
      instcode                       ,-- 默认是varchar类型的,默认最大支持255的长度,如果超长的自己要手动设长度  如 instcode char(1024),
      instname                       ,   
      name                           , 
      idcard                       ,  
      phone                           , 
      dayavginsuranceassets           NULLIF (dayavginsuranceassets="") "to_number(:dayavginsuranceassets)"    ,  --表字段number类型,手动调用oracle的to_number函数转,当字段为""时就是 NULL  
      banktimepointassets           NULLIF (banktimepointassets="") "to_number(:banktimepointassets)"    ,          --表字段number类型,手动调用oracle的to_number函数转,当字段为""时就是 NULL 
      enterpriseassetsratio                    , 
      systime            "sysdate"  , --这里使用系统默认生产时间,日期字段也可以参考number类型,使用to_date("yyyy-MM-dd",:systime)
      updatetime        "sysdate"  , --这里使用系统默认生产时间,日期字段也可以参考number类型,使用to_date("yyyy-MM-dd",:updatetime)
      dayavgcurrentassets_total      NULLIF (dayavgcurrentassets_total="") "to_number(:dayavgcurrentassets_total)"     , --表字段number类型,手动调用oracle的to_number函数转,当字段为""时就是 NULL 
      stat_date                            ,
      stat_dd                              , 
      city_code                
    ) 

    csv文件,因保密原因只能截图部分字段

     

    输出日志

     

    经验之谈:

    1. 如果分成几个csv格式的文件插入到同一个表完成数据的导入,第一个用truncate,后面的几个请使用append;

    2. 如果把多个文件让一个ctl执行时,切记后面的文件不能有表头第一行;

    我参考了两篇文章

    sqlldr的用法 (这个最完整)

    sqlldr使用详解

  • 相关阅读:
    利用条件变量实现生产者消费者模型
    加密算法
    brk mmap malloc使用
    c++中的RTTI机制
    std::array vector 数组联系和区别
    Intent基本使用
    [WPF]DataGrid C#添加右键弹出选择菜单
    c# 通过解析mp3规范命名并上传服务器
    自定义ComboBox,简简单单实现
    自定义窗体,简简单单实现
  • 原文地址:https://www.cnblogs.com/xin1006/p/14306309.html
Copyright © 2011-2022 走看看