informix数据迁移迁移至oracle
一、文章背景
最近做两个项目的升级与迁移,其中就涉及到了生产环境的informix数据迁移至oracle数据库,但因为生产环境上没有相关的DB可视化操作工具,只能用纯linux命令来操作。
此文章是为了记录在此次迁移的过程中,我个人遇到的问题及解决办法,因为是第一次写博客,所以内容会写得比较详细,觉得麻烦的朋友可以直接copy脚本使用。
最后本人小白,第一次写博客,如有不对的地方大家多多指教!!话不多说,直接进入正题~~
二、informix数据的导出
批量脚本导出
- 首先,直接给出导出脚本mj_unloaddb.sh,执行方式:sh mj_unloaddb.sh <数据库名> <模糊搜索的表名>
#################
# 库表导出脚本 #
################
usage()
{
echo “\n usage: mj_unloaddb.sh donate \n”
exit 1
}
if(($# != 1));then
usage
fi
dbname=$1
#批量获取你想要下载的表名,模糊搜索条件由参数输入
dbaccess $dbname<<!
unload to tab_list.txt delimiter “
” select tabname from systables where (tabname like ‘$2%’);
!
#这里是以传入的数据库名创建一个文件夹
if ! test -d “$1”;then
mkdir -p $1
if(($? -ne 0))
then
echo “$1目录创建失败”
else
echo “$1目录创建成功”
fi
else
echo “$1目录已存在,无需创建”
fi
#逐表dbschema导出表结构、unload表数据
for tabname in `cat tab_list.$dbname`
do
#这一句是为了导出表结构,在oracle中创建相同的表结构,存在上处创建的文件夹内。此处会有多个.sql和.unl文件生成。
dbschema -d $dbname -t $tabname -ss $dbname/$tabname.sql
dbaccess $dbname<<!
unload to $dbname/${tabname}.unl select * from ${tabname} where 1=1;
!
done
想要更高效的使用脚本,还需要自己读懂一下,修改条件以方便更好的满足自己的需求。
逐步单表导出
- 接下来是以操作informix数据库的方式,导出某一张表的数据。由于informix算是比较小众的数据库,很多人没有在linux上操作过,接下来我会逐步教你使用。由于此时博主电脑未安装informix数据库,所以没有截图供大家参考,但我尽量用文字来仔细描述。
登陆数据库:dbaccess <数据库名>
|
此时进入的就是你指定的数据库下,选中Query-language回车
|
选中Use-editor回车
|
此时直接vi回车,此步就是vi打开一个文本,在文本里输入sql语句
|
UPLOAD TO ‘/指定导出的目录/指定文件名.unl’ select * from <想要导出的表名>;
|
wq保存并退出
|
直接选中run回车即执行sql语句
此时我们指定的目录下就会有一个我们指定的unl文件,此文件为导入数据源。
三、oracle数据的
批量脚本导入
- 直接给出脚本
#!/bin/bash
#informix导出文件目录
informix_export_dir=“/数据库名” #sql文件所在目录,注意看上面脚本里自己设置的内容
informix_export_der=“/数据库名” #unl文件所在目录,上述脚本我是设定在一个目录下的
#遍历导出文件目录中所有的.sql文件
for sql_file in “$informix_export_dir”/*.sql;do
echo “sql文件地址:$sql_file”
#提取表名
table_name=$(basename “$sql_file”.sql)
find “$informix_export_der” -type f -name “*$table_name*” -delete
#导出文件目录中所有.unl文件
unl_file=“$informix_export_dir/$table_name.unl”
if test -f “$unl_file”;then
echo “unl文件所在的位置:$unl_file”
#生成控制文件
control_file=“$informix_export_der/$table_name.ctl”
echo "OPTIONS (DIRECT TRUE)" >> "$control_file"
echo "LOAD DATA" >> "$control_file"
echo "INFILE '$unl file'" , >> "$control_file"
echo "APPEND INTO TABLE $table_name" >> "$control_file"
echo "FIELDS TERMINATED BY '|’ OPTIONALLY ENCLOSED BY ‘\\\”’” >> "$control_file”
echo "TRAILING NULLCOLS" >> "$control_file"
awk -v table_name="$table_name" '/create table "gafe"\.'"$table _name"'/,/extent/{
if($0 !~ /create table "gafe"\.'"$table_name"'|extent/){
print $0 >> "’”$control_file"’”
}
}’ “$sql_file”
echo “)” >> “$control_file”
sed -i -E ‘s/(\bdecimal\b[^,]*),([^,])(,[^,]*)/\3/‘ “$control_file”
sqlldr control=“$control_file”
if test $? -eq 0;then
echo “导入$table_name成功”
else
echo “导入$table_name失败”
fi
else
echo “数据库表名:$table_name”
fi
逐步完成
2.得到unl文件后,我们编写sqlldr命令所需要的.ctl文件
LOAD DATA
INFILE ‘/.unl文件所在地址’
APPEND INTO TABLE <表名> #在表末尾添加
FIELDS TERMINATED BY ’|’
(com1,com2,…). #z这里添加表的所有列名
此处的.ctl文件具体明细还可以查相关资料按照自己的需求导入
关于ctl控制文件怎么写可以参考此链接
最后执行sqlldr命令
sqlldr control=/对应表名.ctl
输入oracle的用户名及密码即可
四、结尾
脚本直接复制是不可用的,因为每个人的环境不同,要想真正领略其中的奥妙,还得仔细阅读脚本内容。
最后有写得不对,或者读者有不懂的地方,欢迎大家一起交流!!