2017.9.15 postgres使用postgres_fdw实现跨库查询
postgres_fdw的使用参考来自:https://my.oschina.net/Kenyon/blog/214953
postgres跨库查询可以通过dblink或者postgres_fdw来完成,二者的比较可以参看文档:https://my.oschina.net/u/270810/blog/174791
1.安装fdw扩展
1 create extension postgres_fdw;
查询postgres的所有拓展,验证fdw安装成功:
1 select * from pg_available_extensions;
2.创建远程server
server_remote是给这个远程server取得名字。options中是连接远程server需要的信息,包括地址、端口和需要连接的数据库名。
1 create server server_remote 2 FOREIGN data wrapper postgres_fdw 3 OPTIONS(host '168.2.237.207', port '5432', dbname 'aasccs');
查看所有远程连接,验证server创建成功。
1 SELECT * from pg_foreign_server;
3.创建用户匹配信息
表示在server_remote下为角色postgres创建一个用户匹配信息,options里是用户名和密码。
1 create user mapping for postgres server server_remote options(user 'postgres',password 'yourpassword');
4.在本地创建外部表
现在远程连接中需要连接的数据库为aasccs,需要用到的表为t_resource和t_permission,因此在完成上述创建后,就可以在本地创建外部表,表中的记录则完全和远程表中一样。
注:本地t_resource表中字段列数可以少于远程t_resource表,但是字段名必须完成一致,否则会提示错误。
1 CREATE FOREIGN TABLE t_resource 2 ( fd_resid SERIAL, 3 fd_res_name TEXT, 4 fd_res_desc TEXT, 5 fd_tenantid INTEGER, 6 fd_service TEXT, 7 fd_display_name TEXT, 8 fd_modify_date TEXT, 9 fd_modify_person_id INTEGER 10 ) 11 server server_remote 12 options (table_name 't_resource'); 13 14 CREATE FOREIGN TABLE t_permission 15 ( id SERIAL, 16 fd_groupid INTEGER, 17 fd_res_name TEXT, 18 fd_resid INTEGER, 19 fd_get BOOLEAN, 20 fd_post BOOLEAN, 21 fd_put BOOLEAN, 22 fd_delete BOOLEAN, 23 fd_modify_date TEXT, 24 fd_modify_person_id INTEGER 25 ) 26 server server_remote 27 options (table_name 't_permission');
创建完后,可以看到本地也生成了t_resource表和t_permission表。
5.测试
(1)在本地数据库中运行查询sql
1 select * from t_resource;
结果:跨库查询成功。
(2)在远程t_resource表中插入一条记录
结果:本地t_resource表中同步多了一条记录。
(3)在本地t_resource表中插入一条记录,使其自动生成id
结果:主键报异常。原因是虽然本地t_resource表中拥有了远程表中一样的数据,但是新增时,主键却依然从1开始自增。而不是接着原来的id顺序。(使用sql新增也同样)
在创建本地t_resource表时尝试加入主键信息,但是创建时候报错了。因为跨库的时候,创建如果使用自增id,会报错。
(4)在本地t_resource表中插入一条记录,其依赖的外键t_tenantid不存在
结果:新增失败,提示外键不存在。所以可见本地表仍然保持了远程表的外键信息。
(5)在本地t_resource表中插入一条记录,唯一键冲突
结果:新增失败,提示唯一键冲突。所以可见本地表仍然保持了远程表的唯一键信息。
(6)在本地t_resource表中插入一条数据,避开前面几个冲突,成功插入
结果:远程t_resource表同步多了一条数据。
(7)测试的结论
跨库查询成功;
主键、外键和唯一键都保留了下来。但是新增时主键自增是从本地表的1开始,而不是接着远程表的id,造成新增时id冲突;
远程t_resource和本地t_resource的新增都会同步对方。