考虑这样的情况:N台机器每台都有一个postgres数据库,有一个具有相同模式和含义的表a。出于性能方面的原因,我确实需要坚持使用这种体系结构,但使用所有集合数据的联合刷新每个数据库是一种痛苦。
我能够自动化的程度是一个shell脚本:
mycopy=tableA_`hostname`.pg
pg_dump -t tableA -d $database | sed "s/tableA/$mycopy" > $mycopy
for host in host_x host_y host_z; do
scp $mycopy host:~/
done
然后是sql脚本:
BEGIN;
\i tableA_hostx.pg
\i tableA_hosty.pg
\i tableA_hostz.pg
CREATE TABLE new_tableA AS
(select * from tableA)
UNION DISTINCT (select * from tableA_hostx)
UNION DISTINCT (select * from tableA_hosty)
UNION DISTINCT (select * from tableA_hostz);
DROP TABLE tableA;
DROP TABLE table_hostx;
DROP TABLE table_hosty;
DROP TABLE table_hostz;
ALTER TABLE new_tableA rename to tableA;
COMMIT;
但这是一个很好定义的普通的事情,我觉得我正在做,所以我想知道是否有一些先进的更高层次的接口,为这样的所有对所有的沟通。在the postgres wiki中描述了一些分布式数据库方法,但是它们中的任何一种都能做到这一点吗?否则就不会迫使我重新思考或重新设计我的数据库吗?
最佳答案
我会用外国桌子来做。
为每个远程主机创建一个外部表。然后创建包含union
查询的物化视图。
当你想刷新所有内容时,你所需要做的就是refresh materialized view tablea_combined
。无需倾倒或恢复。
当然,这假设您将所有可以连接到所有其他服务器的服务器合并在一起。
如果您只是想要一个方便的方法来选择所有这些表,那么一个简单的视图可能就足够了—这取决于如果性能足够好,您将如何处理它。
如果您使用9.5或更高版本,您可以创建一个分区表,该表uses inheritance将外部表合并到“主”服务器上的一个表中。为了提高效率,这需要有一个列来标识“源”服务器,因此可以用作分区键。
关于postgresql - 做Postgres数据库表的全部到全部的最简单方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40535119/