如何将postgresql数据库与mysql数据库中的数据同步?

时间:2011-01-12 12:34:29

标签: php mysql database postgresql synchronization

我在位置A(LA-MySQL)有一个使用MySQL数据库的应用程序;另一个使用PostgreSQL数据库的位置B(LB-PSQL)的应用程序。 (按地点我的意思是物理上遥远的地方和不同的网络,如果重要的话)

我需要在LB-PSQL上更新一个表以与LA-MySQL同步,但我不确切知道这个领域的最佳实践是什么。

此外,我需要在LB-PSQL上更新的表不一定具有与LA-MySQL相同的结构。 (但我认为这不是问题,因为我需要在LB-PSQL上更新的字段能够容纳来自LA-MySQL字段的数据)

鉴于这些数据,这是最佳实践,通常的方法或参考来做这种事情?

提前感谢您的任何反馈!

3 个答案:

答案 0 :(得分:2)

如果两个服务器都在不同的网络中,我看到的唯一机会就是将数据导出到MySQL的平面文件中。

然后将文件(例如FTP或类似的东西)传输到PostgreSQL服务器并使用COPY

将其导入

我建议将平面文件导入临时表。从那里,您可以使用SQL将数据移动到approriate目标表。这将使您有机会进行数据转换或对现有行进行更新。

如果转换更复杂,您可能需要考虑使用ETL工具(例如Kettle)在目标服务器上进行迁移。

答案 1 :(得分:1)

只需在洛杉矶创建一个可以执行此操作的脚本(bash示例):

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中运行一次。你需要一个'.pgpass'用于postgresql密码和mysql选项文件用于mysql密码。

对于不到一百万行,这应该足够快。

答案 2 :(得分:1)

不是一个交钥匙解决方案,但这是一些使用触发器帮助完成此任务的代码。以下假设没有删除或更新以简洁。需要PG> = 9.1

1)准备2张新表。 mytable_a和mytable_b。与要复制的源表具有相同的列:

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();

然后当你需要导出时:

-- 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;

然后你可以将data.csv导入mysql。