最近遇到一个问题,需要将一个服务器上的oracle数据库中的表格的数据,导入到另外一个服务器上的mysql数据库中。由于两个服务器上使用的是Linux系统,并且对此系统不是很熟悉,解决起来很是艰难,下面将我想到的其中一个办法写下来,跟大家分享一下:
第一步:在oracle服务器上,创建一个目录。以后就是在此目录下进行操作:
1.创建一个文件 tabname,此文件内容为所有需要导的表的表名。
cat tabname | while read name
do
sqlplus 数据库名 -c "select * from $name" > $name_data
done
第二步:将oracle中生成的数据文件,导入到mysql的服务器上,下面的操作在装有mysql的目标服务器上操作:
lftp -u 用户名,密码 sftp://oracle服务器ip <<EOF
cd 目录(文件所在目录)
lcd 目录(mysql文件所放目录)
myget -c 条件(目录中那个文件,可模糊匹配,例如如果访问一个文件,文件名为cn开头的,条件可写成cn*.)
bye
EOF
以上实现的是把oracle生成的文件,导入到mysql所在服务器上。
第三步:下面所面对的就是将导入进来的文件,写入到mysql数据库中。由于直接导入,数据量太大时,对性能影响会很大,所以想到的解决办法,就是先创建一个外部表,然后在进行数据导入。
(一)、批量生成可读外部表:
cat tabname | while read name
do
echo "mysql 当前数据库名 -c \"drop table ${name}_ext;\"" > ${name}_ext.sh
echo "mysql 当前数据库名 -c \"create table ${name}_ext" >> ${name}_ext.sh
echo "(" >>${name}_ext.sh
mysql 当前数据库名 -c ''\d $name " | grep "|" | sed -n '2,$p' | awk '{print $1,$2,$3,","}' | sed '$s/,$//g' >> ${name}_ext.sh
echo ")" >> ${name}_ext.sh
echo "LOCATION ('gpfdist://当前服务器ip:端口号/${name}_data')" >>
echo "FORMAT 'TEXT'(DELIMITER '|' " >>
echo "ESCAP 'OFF' " >>
ECHO "null ")" >>
echo "LOG ERRORS INTO errtab SEGMENT REIECT LIMIT 5000 row ;\" ">>
done
(二)、插入数据库中
insert into 表名(表列名) select (表列名) from 外部表表名
以上都是目前的理解,欢迎大家提意见和建议。相互促进,共同进步。