1.老数据库数据写出
脚本命名- export.sql
通过spool将数据写到txt文档中
WHENEVER OSERROR EXIT 9;
set line 10000
set echo off;
set pagesize 0
set feedback off
set heading off
set trimspool on
set termout off
set trimout on;
set trims on
set serveroutput off
set arraysize 5000
set long 100000;
alter session force parallel query parallel 8;
spool export.txt
select CIF_SEQ||'|'||ID_NUM||'|'||NAME||'|'||ADDR||'|'||LAST_TIME FORM PAYEE_NOTE_INFO;
spool off
2.准备控制转换文件
load data
append into table PAYEE_INFO
fields terminated by '|'
trailing nullcols
(
ID,
CIF_SEQ,
AC_NO,
NAME char(600),
ADDR char(800), #varchar2两倍大小
UPDATE_TIME date'YYYYMMMDDHH24MISS',
CREATE_TIME "sysdate"
)
3.准备导入脚本
#!/bin/sh
source ~/.bash_profile
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK";
filename=export.txt
importData=import.txt
OLD_IFS=$IFS
i=0
IFS="|"
while read line
do
let i++
arr=($line)
str="${i}|${arr[0]}|${arr[1]}|${arr[2]}|${arr[3]}|${arr[4]}"
echo "$str" >>${importData};
done < $filename
rm -rf $filename
file_date=`date +%Y%m%d`
start_time=`date +%Y%m%d%H%M%S`
echo "请输入导入数据源:"
read DATA_SOURCE_CONN_IMPORT
#DATA_SOURCE_CONN_IMPORT=USERNAME/PASSWORD/IP:PORT/SID
echo "-------------connect to $DATA_SOURCE_CONN_IMPORT and import data to oracle start time=$start_time..."
sqlldr ${DATA_SOURCE_CONN_IMPORT} control=importCtl.ctl data=${importData}
end_time=`date +%Y%m%d%H%M%S`
IFS=$OLD_IFS
echo "----------------import finsh--end time $end_time"
4.执行步骤
通过sqlplus连接远程服务器
sqlplus USERNAME/PASSWORD/IP:PORT/SID
sql< 命令行执行
@export.sql
输出数据到export.txt文档
回到linux服务器执行
import.sh脚本
sh import.sh
数据写进新的数据库的表里
5.案例场景
1. 老项目改造,表数据迁移,新表部分字段类型不一样(如老表lastTime为varchar2类型 新表为timestamp 需要转换) 新表有自增主键,老表没有这个主键,在导入时生成插入新表中。
2.刚开始准备了一个sh脚本处理导出导入,由于老生产服务器不能执行sh脚本,就改成通过sqlplus登录执行sql脚本。