1. 程式人生 > >Linux實現兩個伺服器上兩個資料庫的表同步

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 外部表表名

 

以上都是目前的理解,歡迎大家提意見和建議。相互促進,共同進步。