我在位置A(LA-MySQL)有一个使用MySQL数据库的应用程序;另一个使用PostgreSQL数据库的位置B(LB-PSQL)的应用程序。 (按地点我的意思是物理上遥远的地方和不同的网络,如果重要的话)
我需要在LB-PSQL上更新一个表以与LA-MySQL同步,但我不确切知道这个领域的最佳实践是什么。
此外,我需要在LB-PSQL上更新的表不一定具有与LA-MySQL相同的结构。 (但我认为这不是问题,因为我需要在LB-PSQL上更新的字段能够容纳来自LA-MySQL字段的数据)
鉴于这些数据,这是最佳实践,通常的方法或参考来做这种事情?
提前感谢您的任何反馈!
答案 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。