关于从informix将数据迁移至oracle(内附一键导出脚本)

本文记录了一次在没有DB可视化工具的环境下,使用Linux命令进行Informix数据库到Oracle的数据迁移过程。主要涉及批量脚本导出Informix数据,以及在Oracle中通过ctl文件和sqlldr进行数据导入的步骤。文章提供了详细的脚本示例,并强调了理解脚本以适应不同环境的重要性。
摘要由CSDN通过智能技术生成

一、文章背景

  最近做两个项目的升级与迁移,其中就涉及到了生产环境的informix数据迁移至oracle数据库,但因为生产环境上没有相关的DB可视化操作工具,只能用纯linux命令来操作。
  此文章是为了记录在此次迁移的过程中,我个人遇到的问题及解决办法,因为是第一次写博客,所以内容会写得比较详细,觉得麻烦的朋友可以直接copy脚本使用。
  最后本人小白,第一次写博客,如有不对的地方大家多多指教!!话不多说,直接进入正题~~

二、informix数据的导出

批量脚本导出

  1. 首先,直接给出导出脚本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
	

想要更高效的使用脚本,还需要自己读懂一下,修改条件以方便更好的满足自己的需求。

逐步单表导出

  1. 接下来是以操作informix数据库的方式,导出某一张表的数据。由于informix算是比较小众的数据库,很多人没有在linux上操作过,接下来我会逐步教你使用。由于此时博主电脑未安装informix数据库,所以没有截图供大家参考,但我尽量用文字来仔细描述。

登陆数据库:dbaccess <数据库名>

此时进入的就是你指定的数据库下,选中Query-language回车

选中Use-editor回车

此时直接vi回车,此步就是vi打开一个文本,在文本里输入sql语句

UPLOAD TO ‘/指定导出的目录/指定文件名.unl’ select * from <想要导出的表名>;

wq保存并退出

直接选中run回车即执行sql语句

此时我们指定的目录下就会有一个我们指定的unl文件,此文件为导入数据源。

三、oracle数据的

批量脚本导入

  1. 直接给出脚本
#!/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_fileecho "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_fileecho)” >> “$control_file”
sed -i -E ‘s/(\bdecimal\b[^,]*),([^,])(,[^,]*)/\3/‘ “$control_file”

sqlldr control=“$control_fileif 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的用户名及密码即可

四、结尾

脚本直接复制是不可用的,因为每个人的环境不同,要想真正领略其中的奥妙,还得仔细阅读脚本内容。
最后有写得不对,或者读者有不懂的地方,欢迎大家一起交流!!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Informix数据库数据迁移Oracle数据库,可以按照以下步骤进行操作: 1. 在Oracle数据库中创建相同的表结构:使用CREATE TABLE语句在Oracle数据库中创建与Informix数据库中相同的表结构,确保两个表的字段、数据类型和长度等相同。 2. 在Informix数据库导出数据:使用UNLOAD命令将Informix数据库中的表数据导出到一个文本文件中。例如,以下命令将table1表的所有数据导出到table1.txt文件中: ``` unload to table1.txt select * from table1; ``` 3. 将数据文件从Informix服务器复制到Oracle服务器:使用scp或sftp等命令将数据文件从Informix服务器复制到Oracle服务器。 4. 在Oracle数据库中导入数据:使用SQL*Loader(SQLLDR)实用程序将数据文件中的数据加载到Oracle数据库中。例如,以下命令将table1.txt文件中的数据加载到table1表中: ``` sqlldr username/password control=load_table1.ctl ``` 在load_table1.ctl文件中指定了数据文件的路径和格式,例如: ``` load data infile '/path/to/table1.txt' into table table1 fields terminated by ',' optionally enclosed by '"' (tran_id, col1, col2, col3, ...) ``` 其中,tran_id是Informix表中的主键或唯一键,需要在Oracle表中进行匹配和插入操作。根据实际情况,您可能需要调整数据文件和控制文件中的格式和字段。 请注意,这只是一个概述,具体操作步骤可能因为版本、环境等原因有所不同。在进行数据迁移前,请务必详细阅读官方文档并进行测试,以确保迁移过程正确无误。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值