数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle数据库备份与恢复之二:SQL*Loader


发布日期:2021年10月05日
 
Oracle数据库备份与恢复之二:SQL*Loader

基本知识

Oracle 的 SQL* LOADER 可以将外部格式化的文本数据加载到数据库表中通常 与 SPOOL导出文本数据方法配合使用

命令格式

SQLLDR keyword=value [keyword=value……]

$ sqlldr user/pwd control=empctl data=empdat bad=empbad log=emplog

控制文件

SQL*LOADER 根据控制文件可以找到需要加载的数据并且分析和解释这些数据

控制文件由三个部分组成具体参数参考帮助文档 全局选件跳过的记录数等 INFILE 子句指定的输入数据 数据特性说明

comment ——注释

load data infile *

append ——除了 append外还有 insertreplacetruncate等方式

into table emp fields terminated b y |

no float external name char(

age integer external

duty char(salary float external

upd_ts date(YYYYMMDDHHMISS

begindata

|Mulder||||

|Scully||||

控制文件中infile选项跟sqlldr 命令行中data 选项含义相同如使用infile *则表明数据在本控制文件以 begin data 开头的区域内 一些选项FIELDS TERMINATED BY WHITESPACE FIELDS TERMINATED BY x FILLER_ FILLER // 指定某一列将不会被装载

DEPTNO position( DNAME position(* // 指定列的位置SEQNO RECNUM //载入每行的行号

SKIP n // 指定导入时可以跳过多少行数据

数据文件

按控制文件数据格式定义的数据行集

|Tom||||

|Jerry||||

固定格式可变格式流记录格式

固定格式

当数据固定的格式(长度一样)时且是在文件中得到时要用 INFILE fix n

load data

infile exampledat fix

into table example

fields terminated b y optionally enclosed by

(col char( col char()) exampledat

cd fghi

lmn

pqrs

uvwx

可变格式

当数据是可变格式(长度不一样)时且是在文件中得到时要用 INFILE var n

load data

infile exampledat var

into table example

fields terminated b y optionally enclosed by

(col char( col char()) exampledat

hellocdworldim

myname is

流记录格式 // Streamrecored formatload data infile xxdat str |\n

into table xx field terminated b y optionally enclosed by

(col char( col char())

exampledat

hello ccd|

world bb|

坏文件

bad=empbad坏文件包含那些被 SQL*Loader拒绝的记录被拒绝的记录可能是不符合要求的记录

日志文件及日志信息

log=emplog当 SQL*Loader 开始执行后它就自动建立 日志文件日志文件包含有加载的总 结加载中的错误信息等

高级选项

Conventional Path Load与Direct Path Load

Conventionalpath Load通过常规通道方式上载

特点commit always gen redo logs enforce all constraints fire insert triggers can load into cluster other user can make change

rows每次提交的记录数

bindsize每次提交记录的缓沖区

readsize与 bindsize 成对使用其中较小者会自动调整到较大者

sqlldr 先计算单条记录长度乘以 rows如小于 bindsize不会试图扩张rows以填充 bindsize如超出则以 bindsize 为准 命令为

$ sqlldr dbuser/oracle control=empctl log=emplog rows= bindsize=

DirectPath Load

通过直通方式上载可以跳过数据库的相关逻辑不进行 SQL解析而直接将数 据导入到数据文件中

特点save conditionly gen redo logs enforce PK UK NN not fire triggers can not load into cluster other user can not make change命令为

$ sqlldr dbuser/oracle control=empctl log=emplog direct=true

SPOOL导出文本数据方法

导入的数据文件可以用 SPOOL导出文本数据方法生成

SQL*PLUS环境设置

SET NEWPAGE NONE HEADING OFF SPACE

PAGESIZE SET TRIMOUT ON TRIMSPOOL ON LINESIZE

LINESIZE 要稍微设置大些免得数据被截断它应和相应的 TRIMSPOOL结合使用防止导出的文本有太多的尾部空格

但是如果 LINESIZE 设置太大会大大降低导出的速度另外在 WINDOWS下导 出最好不要用 PLSQL导出速度比较慢直接用 COMMEND 下的 SQLPLUS命令最 小化窗口执行对于字段内包含很多回车换行符的应该给与过滤形成比较规矩的文本 文件

通常情况下我们使用 SPOOL方法将数据库中的表导出为文本文件如下述

set trimspool on

set linesize pagesize newpage heading off term off spool 路径+文件名

select col||||col||||col||||col||…… from tablename

spool off

脚本

将表中数据记录导出为字段值用分隔符|分开的dat文件

#!/bin/ksh

##################################################################

## 名称 unloadtable

## 功能 本 shell 用于将表中数据记录导出

## 导出为字段值用分隔符|分开的dat文件

## 编者

## 日期

##################################################################

if [ $# ne ]

then echo usageunloadtable tablename username password

exit

fi

##准备工作

echo set heading off >/tmp/$l

echo set pagesize >>/tmp/$l

echo set linesize >>/tmp/$l

echo set feedback off >>/tmp/$l

echo set tab off >>/tmp/$l

echo select column_name|| from user_tab_columns where lower(table_name)=$ order by

column_id >> /tmp/$l

##产生 select 语句

echo set heading off >/tmp/$sel

echo set pagesize >>/tmp/$sel

echo set linesize >>/tmp/$sel

echo set feedback off >>/tmp/$sel

echo set tab off >>/tmp/$sel

echo select >>/tmp/$sel

echo `sqlplus s $/$ < /tmp/$l` |sed s//|||||/g |sed s/||$//g|sed s/date/\date\/g

>>/tmp/$sel

##生成 dat文件

#echo from $\n/ >>/tmp/$sel 由于 / 导致多执行一次 select

echo from $\n >>/tmp/$sel

sqlplus s $/$ < /tmp/$sel >$_tmpdat

#awk {if(FNR!=) print $} $_tmpdat >$dat FNR 选项使得第一条记录选不出

awk {print $} $_tmpdat >$dat

rm f $_tmpdat

将数据导入到相应表中

#!/bin/ksh

##################################################################

## 名称loadtable

## 功能本 shell 用于将已经准备好的dat数据文件导入相应的表中

## dat 文件各个字段值用分隔符|分开

## 编者

## 日期

##################################################################

if [ $# ne ]

then

echo usageloadtable tablename username password exit fi

##准备工作

echo set heading off >/tmp/$lsql

echo set pagesize >>/tmp/$lsql

echo set linesize >>/tmp/$lsql

echo set feedback off >>/tmp/$lsql

echo set tab off >>/tmp/$lsql

echo select column_name|| from user_tab_columns where lower(table_name)=$ order by

column_id >> /tmp/$lsql

##产生 ctl文件

echo load data >/tmp/$ctl

echo infile * >>/tmp/$ctl

echo into table $ >>/tmp/$ctl

echo fields terminated by | >>/tmp/$ctl

echo `sqlplus s $/$ < /tmp/$lsql` |sed s/$/)/g |sed s/^/(/g >>/tmp/$ctl

##开始导入数据

echo truncate table $ >/tmp/$sql

sqlplus $/$ < /tmp/$sql

sqlldr $/$ data=$dat control=/tmp/$ctl log=/tmp/$log

               

上一篇:oracle网络配置相关概念

下一篇:Oracle 全球解答的最hot的21个问题