PostgreSQL数据库中的外部数据包装器(postgres_fdw和dblink)

PostgreSQL数据库中的外部数据包装器(postgres_fdw和dblink)

💡 原文英文,约3500词,阅读约需13分钟。
📝

内容提要

外部数据包装器(FDW)是数据库管理系统中的功能,允许在不移动数据的情况下访问外部数据源。PostgreSQL实现了SQL/MED规范,通过常规SQL查询实现对外部数据的访问。文章讨论了PostgreSQL中的两个FDW:dblink和postgres_fdw。dblink用于管理数据库会话和在远程数据库中执行查询,而postgres_fdw提供更好的性能并使用更现代的基础架构。文章还解释了使用dblink和postgres_fdw设置和访问远程数据库的步骤。文章以限制和提到Percona Distribution for PostgreSQL作为可靠的解决方案。

🔎

延伸解读

dblink 与 postgres_fdw 的选型考量

文章指出 postgres_fdw 提供比 dblink 更好的性能,并基于更现代、符合标准的基础设施。dblink 通过函数调用管理连接和执行查询,适合临时性、细粒度的远程操作;而 postgres_fdw 通过外部服务器、用户映射和外部表等对象进行声明式配置,更利于长期、结构化的跨库访问。若追求性能与标准化,postgres_fdw 是更优选择。

外部表定义必须与远程表结构匹配

使用 postgres_fdw 创建外部表时,文章强调列的数据类型和其他属性必须与远程实际表一致。若类型不匹配,查询可能失败或返回意外结果。此外,用户需要拥有外部服务器的 USAGE 权限才能创建外部表。因此,在定义外部表前,应仔细核对远程表的列定义,避免因结构差异导致访问异常。

IMPORT FOREIGN SCHEMA 的灵活导入方式

文章介绍了 IMPORT FOREIGN SCHEMA 命令,可将远程模式中的表定义批量导入本地。通过 LIMIT TO 可仅导入指定表,通过 EXCEPT 可排除特定表后导入其余表。这为按需同步远程表结构提供了便利,无需手动逐一定义外部表。导入后,可查询外部表验证数据行数与远程源是否一致。

postgres_fdw 的已知限制

文章提到 postgres_fdw 目前存在一些限制:在 SELECT、UPDATE、DELETE 或 TRUNCATE 中指定 ONLY 选项对远程表无效;此外,尚不支持带有 ON CONFLICT DO UPDATE 子句的 INSERT 语句,但支持 ON CONFLICT DO NOTHING。在使用这些特性时,需留意其行为可能与本地表不同,避免依赖未支持的功能。

❓

Q&A

什么是外部数据包装器(FDW)?

外部数据包装器(FDW)是一种数据库管理系统功能,允许在不移动数据的情况下访问外部数据源。

PostgreSQL中有哪些外部数据包装器?

PostgreSQL中有多种外部数据包装器,包括dblink和postgres_fdw等。

如何使用dblink访问远程数据库?

使用dblink访问远程数据库的步骤包括创建连接、执行查询和管理错误。

postgres_fdw与dblink有什么区别?

postgres_fdw提供更好的性能和现代化的基础架构,而dblink主要用于管理数据库会话。

如何在PostgreSQL中创建外部表?

在PostgreSQL中创建外部表需要使用CREATE FOREIGN TABLE命令,并确保数据类型匹配。

使用postgres_fdw时有哪些限制?

postgres_fdw对INSERT语句的某些支持缺失,例如不支持ON CONFLICT DO UPDATE。

🏷️

标签

➡️

继续阅读