使用postgres_fdw

时间:2017-09-07 21:32:22

标签: postgresql-9.6 foreign-data-wrapper postgres-fdw

编辑:我已经解决了这个问题。 Spoiler,它与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...

1 个答案:

答案 0 :(得分:0)

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

在我的情况下,原因是因为我们有独立的应用程序服务器和数据库服务器。我们的数据库服务器还需要能够解析我指定的域。在将域映射到数据库服务器上的/ etc / hosts中并重新启动数据库服务后,便能够将域用作主机,并且连接正常。