Oracle Csv格式文件导入SQLLDR

背景

  最近工作需要把Mysql数据导入到Oracle,于是想到了SQLLDR(SQLLDR是Oracle服务端自带的工具)。趁这次机会整理份操作文档方便后续查看。

SQL*Loader支持3种数据加载方式:

  • 传统路径加载(direct=false):等同于insert语句(默认)
  • 直接路径加载(direct=true):绕过SGA,把数据直接导入高水位线(HWM)以上,可设置并行加载,性能比传统路径加载更高,但限制也更多;
    no_index_errors:默认为false,如果为true表示在加载过程中不会把index设为unusable(在此方式可用);
  • 外部表加载:先为数据文件上创建一个外部表,然后再把数据从外部表insert到目标表中

常用参数介绍:

  • errors:最大允许错误的记录数
  • discardmax :最大允许丢弃的记录数
  • parallel:默认为false,如果为true表示启用并行加载
  • skip_index_maintenance:默认为false,如果为true表示在加载过程中停止索引的维护
  • rows:表示达到多少行将提交,默认(传统路径加载64,直接路径加载all)
  • skip:省略最前面的记录数
  • CHARACTERSET UTF8 :导出文件的字符集,以及导入目标字符集

数据加载对目标表处理方式:

  • SQL*Loader是以INSERT方式加载数据,目标表必须是空表,否则会报错;(默认)
  • APPEND:添加数据至源数据的后面
  • REPLACE:在添加数据之前,先执行DELETE FROM TABLE把表清空,注意:这里的REPLACE是表级别的替代,而不是行级别
  • TRUNCATE:在添加数据之前,先执行TRUNCATE TABLE table_name REUSE STORAGE

注:SQL*Loader不支持对已存在的行更新,如果你想更新已存在的行,则必须先把数据加载至一个空的中间表,然后在原表和中间表进行关联update

示例:
环境准备
  • 准备CSV数据:t.csv

"status","amt","create_time" "A","90","2024-02-26 13:37:28" "B","100","2024-03-26 13:37:28" "B","123","2023-01-26 13:37:28" "A","10","2024-01-26 13:37:28" "A","1","2024-03-26 13:37:28"