使用 postgres_fdw 创建外部表时翻译主机名时出错

Posted

技术标签:

【中文标题】使用 postgres_fdw 创建外部表时翻译主机名时出错【英文标题】:Error translating host name when creating a foreign table with postgres_fdw 【发布时间】:2017-09-07 21:32:22 【问题描述】:

编辑:我已经解决了这个问题。剧透,它与 psql 或 fdw 无关。这是一个 DNS 问题,因为我在未配置内部 DNS 服务器的 docker 机器上运行本地数据库。

我正在尝试在我的数据库中创建一个外部表(来自另一个 postgres 数据库)。但是,当我运行 select 语句时,外部数据包装器说它无法翻译提供的主机名:

ERROR:  could not connect to server "pgs3"
DETAIL:  could not translate host name "db7.ap.int.unavco.org" to address: Name or service not known

那么我的主机名有什么问题?我可以使用psql -U myuser -W -h db7.ap.int.unavco.org -d pgs3 连接到 pgs3 数据库。我创建外部表的脚本非常简单,并且以文档 here 为蓝本。

-- Drop everything if the fdw exists already
DROP EXTENSION IF EXISTS postgres_fdw CASCADE;

-- Add the postgres_fwd extension
CREATE EXTENSION postgres_fdw WITH SCHEMA public;

-- Create foreign server object
CREATE SERVER pgs3 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'db7.ap.int.unavco.org', dbname 'pgs3', port '5432');

-- Create user mapping object to authenticate
CREATE USER MAPPING FOR postgres SERVER pgs3 OPTIONS (user 'afakeuser', password 'afakepassword');

-- Create the foreign table, ensuring the types and NOT NULL rules match the target table
-- The target table only has two columns to keep things simple
CREATE FOREIGN TABLE analysis_type (
    type_id smallint,
    type varchar NOT NULL
)
SERVER pgs3;

-- Try a select
SELECT
*
FROM
analysis_type;

-- Get an error...

【问题讨论】:

你是在服务器还是客户端运行psql -U myuser -W -h db7.ap.int.unavco.org -d pgs3?...客户端可能只使用/etc/hosts左右... 我认为这是一个 DNS 问题。我可以从我的主机操作系统 (Ubuntu) ping 我的内部服务器,但不能使用 docker exec 【参考方案1】:

作为最近遇到此问题的人,这就是我发现的。这是一个 DNS 问题,因为我能够输入原始服务器 IP 地址并且连接正常工作。我能够从我的应用服务器 ping 域,但创建连接仍然会失败。

就我而言,原因是我们有单独的应用程序和数据库服务器。我们的数据库服务器还需要能够解析我指定的域。一旦我将域映射到数据库服务器上的 /etc/hosts 并重新启动数据库服务,我就能够将该域用作主机并且连接正常。

【讨论】:

以上是关于使用 postgres_fdw 创建外部表时翻译主机名时出错的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql 外部表插件postgres_fdw的安装和使用

通过postgres_fdw实现跨库访问

通过postgres_fdw实现跨库访问

通过postgres_fdw实现跨库访问

当您在 Hive 中使用 S3 位置创建外部表时,数据何时传输?

在 gcs 上使用 parquet 文件创建新的大查询外部表时。显示错误