千家信息网

PostgreSQL如何利用FDW实现简易dblink

发表于:2024-11-30 作者:千家信息网编辑
千家信息网最后更新 2024年11月30日,这篇文章主要讲解了"PostgreSQL如何利用FDW实现简易dblink",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"PostgreSQL如何利用F
千家信息网最后更新 2024年11月30日PostgreSQL如何利用FDW实现简易dblink

这篇文章主要讲解了"PostgreSQL如何利用FDW实现简易dblink",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"PostgreSQL如何利用FDW实现简易dblink"吧!

1、介绍

Oracle DATABASE LINK可以访问其他数据库(实例)的对象,使用简单而且方便,很多现有应用会涉及到它。

2、常见用法

远程表

SELECT col_list FROM table_remote@dblink;程序列

远程序列

SELECT seq_remote.nextval@dblink FROM dual;

如果应用中不少地方用到它,或者说面临很多这类应用,而我们又希望尽量少的改动应用,这里给大家展示一个简单修改PG的办法应对,简化起见先说说表。

3、远程表语法table_remote@dblink

这个格式有一个明显的问题:@是PG里常见的操作符(或者部分),搜一下:

SELECT oprname FROM pg_operator WHERE oprname like '%@%';

多少个?60,直接是 @ 本身的就有17个之多。

4、表访问FROM子句

我们来看FROM子句语法(节选自gram.y)

from_clause:      FROM from_list              { $$ = $2; }      | /*EMPTY*/               { $$ = NIL; }    ;from_list:      table_ref               { $$ = list_make1($1); }      | from_list ',' table_ref       { $$ = lappend($1, $3); }    ;/* * table_ref is where an alias clause can be attached. */table_ref:  relation_expr opt_alias_clause        {          $1->alias = $2;          $$ = (Node *) $1;        }...(略)relation_expr:      qualified_name        {          /* inheritance query, implicitly */          $$ = $1;          $$->inh = true;          $$->alias = NULL;        }

这里的语法还会影响到INSERT、CURSOR 等等,因为只是演示,我们就不去评估对它们的影响。

5、创建FDW

CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw  OPTIONS (host 'foo', dbname 'foodb', port '5432');CREATE SCHEMA myserver;CREATE FOREIGN TABLE myserver.films (    code        char(5) NOT NULL,    title       varchar(40) NOT NULL,    did         integer NOT NULL,    date_prod   date,    kind        varchar(10),    len         interval hour to minute)SERVER myserver;

这里只是举个例子,实际上采用什么样的命名规则完全可以随意选择,只要跟当前应用要求的数据结构不冲突即可。

6、把语法映射成为外部表访问

relation_expr:      qualified_name        {          /* inheritance query, implicitly */          $$ = $1;          $$->inh = true;          $$->alias = NULL;        }      | qualified_name Op IDENT        {          /* inheritance query, implicitly */          $$ = $1;          $$->inh = true;          $$->schemaname = $3;          $$->alias = NULL;        }

这里应该检查 Op 是不是 @,不然任何操作符都可以。

7、访问

SELECT * FROM films@myserver;

其实它相当于:

SELECT * FROM myserver.films;

这样小小的改动,可能给应用开发人员减少一些修改代码的苦处。

8、其它

修改语法的麻烦在于,我们需要确认它的影响范围,简单办法是回归测试,如果可以通过,至少证明我们没有影响PG原有功能。上边我们提到了远程序列,它要更麻烦些,因为只是演示,也就不一一说明。并且我们也只是考虑了FROM子句中的实现,其他部分呢?

此外显而易见,DBA的维护工作会增多。

9、增强

如果只是某些表需要远程访问,这种方式无疑还是可以接受的,如果某个系统需要访问几百张远程表,就算可以用脚本自动创建,显然也不是件美妙的事情。如果表结构发生修改呢?所以这里自动创建是个好的选择,如果每次访问自动创建,又会面临系统空间膨胀问题(跟临时表一个道理),定义一个刷新策略可以缓解。根本解决办法是用临时数据源,这个改动很有趣。

感谢各位的阅读,以上就是"PostgreSQL如何利用FDW实现简易dblink"的内容了,经过本文的学习后,相信大家对PostgreSQL如何利用FDW实现简易dblink这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0