使用带postgres_fdw扩展的Postgres 9.6 ,有没有办法使本地模式中的表与远程数据库中的表保持同步?我经常需要在远程数据库的包装模式中添加新表,并希望通过FDW在本地访问它们,而不必删除和重新导入我的外部模式或单个表.
我正在寻找像这样的命令REFRESH FOREIGN SCHEMA schema_name.
我对最近添加的一些Postgres功能感到非常兴奋,比如外国数据包装器.我不知道有任何其他RDBMS有这个功能,但在我尝试向我的主客户端说明他们应该开始更喜欢Postgres而不是他们当前的RDBMS鸡尾酒,并且在我的情况下包括没有其他数据库可以做到这一点,我想验证一下.
我一直无法找到支持SQL/MED的任何其他数据库的证据,并且这样的简短说明表明Oracle不支持SQL/MED.
让我怀疑的主要问题是http://wiki.postgresql.org/wiki/SQL/MED上的声明:
SQL/MED是外部数据管理,是SQL标准的一部分,用于处理数据库管理系统如何集成存储在数据库外部的数据.
如果FDW基于SQL/MED,并且SQL/MED是开放标准,那么其他RDBMS似乎也可以实现它.
Postgres之外的任何数据库是否都支持SQL/MED?
我有一个外表(使用postgresql_fdw外部数据包装器),我需要找到最大ID来复制所有记录.当我运行SELECT MAX(id) FROM foreign_table它似乎没有使用索引:
Aggregate (cost=205.06..205.07 rows=1 width=4) (actual time=13999.535..13999.535 rows=1 loops=1)
-> Foreign Scan on foreign_table (cost=100.00..197.75 rows=2925 width=4) (actual time=1.288..13632.768 rows=1849305 loops=1)
Planning time: 0.087 ms
Execution time: 14019.179 ms
Run Code Online (Sandbox Code Playgroud)
当我SELECT MAX(id) FROM table在"真实"表上运行相同的query()时,它使用索引:
Result (cost=0.45..0.46 rows=1 width=0) (actual time=0.164..0.165 rows=1 loops=1)
InitPlan 1 (returns $0)
-> Limit (cost=0.43..0.45 rows=1 width=4) (actual time=0.152..0.153 rows=1 loops=1)
-> Index Only Scan Backward using table_pkey on table (cost=0.43..46102.55 rows=1821907 width=4) (actual time=0.143..0.143 rows=1 loops=1)
Index …Run Code Online (Sandbox Code Playgroud) t_user我创建了一个名为into的外部数据包装表mySchema。
IMPORT FOREIGN SCHEMA public LIMIT TO (t_user)
FROM SERVER myServer INTO mySchema;
Run Code Online (Sandbox Code Playgroud)这边添加了一些列,myServer但是t_user外表没有相应更新。
我尝试删除外部表t_user,但它被我的视图和物化视图使用t_user,因此删除失败。
关于如何更新此表有什么想法吗?
假设我想查询一个带有几个WHERE过滤器的大表。我正在使用 Postgres 11 和外部表;外部数据包装器 (FDW) 是clickhouse_fdw. 但我也对通用解决方案感兴趣。
我可以这样做:
SELECT id,c1,c2,c3 from big_table where id=3 and c1=2
Run Code Online (Sandbox Code Playgroud)
我的 FDW 能够对远程外部数据源进行过滤,确保上述查询快速并且不会拉取太多数据。
如果我写的话上面的效果是一样的:
SELECT id,c1,c2,c3 from big_table where id IN (3,4,5) and c1=2
Run Code Online (Sandbox Code Playgroud)
即所有的过滤都被发送到下游。
但是,如果我尝试执行的过滤稍微复杂一些:
SELECT bt.id,bt.c1,bt.c2,bt.c3
from big_table bt
join lookup_table l on bt.id=l.id
where c1=2 and l.x=5
Run Code Online (Sandbox Code Playgroud)
然后查询规划器决定远程过滤c1=2,但在本地应用另一个过滤器。
在我的用例中,先计算哪些ids 有l.x=5,然后将其发送出去进行远程过滤会快得多,所以我尝试按以下方式编写:
SELECT id,c1,c2,c3
from big_table
where c1=2
and id IN (select id from lookup_table where x=5)
Run Code Online (Sandbox Code Playgroud)
big_table然而,查询规划器仍然决定在本地对satisfy的所有结果执行第二个过滤器c1=2,这非常慢。
有什么方法可以“强制”(select …
sql postgresql sql-execution-plan postgresql-performance foreign-data-wrapper
我的想法是,我有一个名为的本地数据库northwind,并且postgres_fdw我想与另一个test在localhost上命名的数据库连接(远程连接模拟,例如在数据库中的表被更新时,在其他数据库中执行某些操作,例如保存到历史记录等。 )。所以我打开了psql控制台并输入:
CREATE SERVER app_db
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (dbname 'test', host 'localhost:5432');
Run Code Online (Sandbox Code Playgroud)
正如我在“查看外部数据包装器”链接中所发现的。接下来,我还将按照本教程进行操作:
CREATE USER MAPPING for postgres
SERVER app_db
OPTIONS (user 'postgres', password 'postgres');
Run Code Online (Sandbox Code Playgroud)
(我假设用户名和密码应该与我在Hibernate中访问数据库时所使用的密码相同,并且在本current_user教程中postgres,就本教程而言,这是我的PgAdmin III中存在的唯一角色)。然后我创建了外表:
CREATE FOREIGN TABLE groups
(
id serial NOT NULL,
name character varying(255) NOT NULL,
version integer DEFAULT 0
)
SERVER app_db OPTIONS (table_name 'groups')
Run Code Online (Sandbox Code Playgroud)
没关系,我可以schema/foreign tables在PgAdmin III中找到它。但是当我尝试时,SELECT * FROM groups我得到了:
********** ERROR**********
ERROR: could not …Run Code Online (Sandbox Code Playgroud) database postgresql pgadmin foreign-data-wrapper postgresql-9.3
我有两个数据库设置为同一个 Postgresql 9.4 数据库集群的一部分,我正在尝试使用 postgres_fdw 从另一个访问其中一个中的表。我以超级用户身份进行了所有设置和工作,但是当我尝试以普通用户身份访问外部表时,出现以下错误:
ERROR: password is required
DETAIL: Non-superuser cannot connect if the server does not request a password.
HINT: Target server's authentication method must be changed.
Run Code Online (Sandbox Code Playgroud)
现在我明白这是因为我为某些子网(包括它自己的子网)设置了信任身份验证的服务器。但是,在USER MAPPING我创建的 1 中,我确实指定了密码,希望这样做会强制它使用密码身份验证。显然没有这样的运气。
因此,我的问题是是否有办法解决这个有点繁重的要求?有没有办法强制此连接或特定用户或类似的人使用密码身份验证?或者某种方法来禁用该要求?或者我唯一的选择是更改配置以要求密码,并处理任何破坏?
我有一个外国表,例如:
CREATE FOREIGN TABLE film (
id varchar(40) NOT NULL,
title varchar(40) NOT NULL,
did integer NOT NULL,
date_prod date,
kind varchar(10),
len interval hour to minute
)
SERVER film_server;
Run Code Online (Sandbox Code Playgroud)
ID为该表的主键(在远程数据库中设置)。我想让本地表引用外表,并在本地表上设置外键约束-例如:
CREATE TABLE actor (
id varchar(40) NOT NULL,
name varchar(40) NOT NULL,
film_id varchar(40) NOT NULL,
)
ALTER TABLE actor ADD CONSTRAINT actor_film_fkey FOREIGN KEY (film_id)
REFERENCES film(id);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试添加外键约束时,出现错误:
ERROR: referenced relation "film" is not a table
Run Code Online (Sandbox Code Playgroud)
是否可以向外表添加外键约束?
我正在尝试使用来自 Azure DB for PostgreSQL 实例的 PostgreSQL 外部数据包装器 (postgres_fdw) 扩展。如 Azure DB for PostgreSQL 中所述,应支持外部数据包装器:https : //docs.microsoft.com/en-us/azure/postgresql/concepts-extensions
我设法为用户创建了服务器和映射,但是当我尝试导入表或架构时,出现以下错误:
ERROR: could not connect to server "<server with public hostname on AWS>"
DETAIL: could not translate host name "<server with public hostname on AWS>" to address: Unknown host
Run Code Online (Sandbox Code Playgroud)
当用公共 IP 替换主机名时,我得到以下信息:
ERROR: could not connect to server "<SERVER NAME>"
DETAIL: could not connect to server: Network is down (0x00002742/10050)
Is the server running on host "<public IP of the server" and …Run Code Online (Sandbox Code Playgroud) 我正在foo_tabledatabase_a 中创建一个外部表 ( )。foo_table住在 database_b 中。 foo_table将枚举 ( bar_type) 作为其列之一。因为这个枚举在database_b 中,所以在database_a 中创建外部表失败。database_a 不了解列类型。在 database_a 中运行以下命令
CREATE FOREIGN TABLE foo_table (id integer NOT NULL, bar bar_type) SERVER database_b
一个得到错误:
ERROR: type "bar_type" does not exist
我可以bar_type在 database_a 中创建一个副本,但这感觉重复,并且可能是未来不一致的原因。有人会对处理的最佳实践有什么想法吗?