2011-01-12 20 views
1

私は、MySQLデータベースを使用する場所A(LA-MySQL)にアプリケーションを持っています。また、PostgreSQLデータベースを使用する場所B(LB-PSQL)の別のアプリケーションです。 (場所によっては、物理的に遠い場所や問題の場合は別のネットワークを意味します)postgresqlデータベースとmysqlデータベースのデータを同期させるには?

LA-MySQLと同期させるためにLB-PSQLの1つのテーブルを更新する必要がありますが、これはベストプラクティスエリア。

また、LB-PSQLで更新する必要があるテーブルは、必ずしもLA-MySQLと同じ構造になっているとは限りません。 (しかし、LB-PSQLで更新する必要のあるフィールドはLA-MySQLフィールドのデータに対応できるため、これは問題ではないと思います)

このデータは、ベストプラクティス、通常の方法またはこの種のことをするための参照?

フィードバックをいただきありがとうございます。

+0

同期が必要ですか(スロー、マスターコミットの瞬間にレプリカに表示される変更)または非同期(高速ですが、レプリカの変更は少し遅れて表示されます)。非同期の場合、どのような種類の遅延を生かすことができますか:2,3秒、数時間、1日? – Tometzky

+0

@Tometzky、それは完全に非同期タスクになることができます。遅延については、私は1日/週の間に何かで生きることができます。 – acm

答えて

2

両方のサーバが異なるネットワークに接続されている場合は、データをMySQLからフラットファイルにエクスポートすることしかできません。

そして、PostgreSQLサーバに(例えばFTPまたは似たような)ファイルを転送し、私はステージング表にフラット・ファイルをインポートすることをお勧めしますCOPY

を使用して、そこにインポートします。そこから、SQLを使用して適切なターゲット表にデータを移動できます。そうすれば、データ変換や既存の行の更新が可能になります。

変換が複雑な場合は、ETLツール(例:ケトル)を使用してターゲットサーバーで移行を行うことを考えてください。

+0

ありがとうございますが、私は何らかの "自動プロセス"ソリューション、エクスポート、FTP経由での転送、およびインポートは理想的ではないと考えていました。 – acm

+1

前もって入れていない100%の自動プロセスはありません。あなたは何かする必要があります。あなたはこのタイプのタスクのために設計されているので、ETLツール(Pentahoかもしれない)を見ることができますが、ETLプロセスを作成するための開発作業がまだ必要です。 – Kuberchaun

1

はちょうどこの(bashのサンプル)のようなものを行いますLAのスクリプト作成:

TMPFILE=`mktemp` || (echo "mktemp failed" 1>&2; exit 1) 
pg_dump --column-inserts --data-only --no-password \ 
    --host="LB_hostname" --username="username" \ 
    --table="tablename" "databasename" \ 
    awk '/^INSERT/ {i=1} {if(i) print} # ignore everything to first INSERT' \ 
    > "$TMPFILE" \ 
    || (echo "pg_dump failed" 1>&2; exit 1) 
(echo "begin; truncate tablename;"; cat "$TMPFILE"; echo 'commit;') \ 
    | mysql "databasename" < "$TMPFILE" \ 
    || (echo "mysql failed" 1>&2; exit 1) \ 
rm "$TMPFILE" 

をとcronで一日一回、たとえば実行するように設定します。 postgresqlのパスワードには '.pgpass'、mysqlのパスワードにはmysqlのオプションファイルが必要です。

これは、100万行未満で十分に高速でなければなりません。

+0

awkをどうか説明できますか? – DrColossos

+0

コメントがあります。「最初のINSERTをすべて無視してください」というコメントがあります。 pg_dumpは他のデータベースと互換性のないいくつかの行を生成します。このawkは "INSERT"で始まる行が現れるまですべてを無視します。 – Tometzky

+0

私はこのコメントを読んだ;)なぜ私は興味があった( "pg_dumpは[...]のためにいくつかの行を生成する")。 – DrColossos

0

ターンキーソリューションではありませんが、これはトリガーを使用してこのタスクを支援するいくつかのコードです。以下では、簡潔にするために削除や更新を行わないものとします。ニーズPG> = 9.1

1)2つの新しいテーブルを準備します。 mytable_a、およびmytable_b。ソース表と同じ列を複製する:

-- move data from mytable_a -> mytable_b without stopping trigger 
WITH d_rows AS (DELETE FROM mytable_a RETURNING *) INSERT INTO mytable_b SELECT * FROM d_rows; 

-- export data from mytable_b -> file 
\copy mytable_b to '/tmp/data.csv' WITH DELIMITER ',' csv; 

-- empty table 
TRUNCATE mytable_b; 

は、その後、あなたがMySQLへdata.csvをインポートすることがあります。

CREATE TABLE mytable_a AS TABLE mytable WITH NO DATA; 
CREATE TABLE mytable_b AS TABLE mytable WITH NO DATA; 

-- trigger function which copies data from mytable to mytable_a on each insert 
CREATE OR REPLACE FUNCTION data_copy_a() RETURNS trigger AS $data_copy_a$ 
    BEGIN 
    INSERT INTO mytable_a SELECT NEW.*; 
     RETURN NEW; 
    END; 
$data_copy_a$ LANGUAGE plpgsql; 

-- start trigger 
CREATE TRIGGER data_copy_a AFTER INSERT ON mytable FOR EACH ROW EXECUTE PROCEDURE data_copy_a(); 

が次にエクスポートする必要がある場合。

関連する問題