Linux实现两个服务器上两个数据库的表同步

最近遇到一个问题,需要将一个服务器上的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 外部表表名

以上都是目前的理解,欢迎大家提意见和建议。相互促进,共同进步。

猜你喜欢

转载自blog.csdn.net/weixin_42330675/article/details/81773115