这对我来说是新的。我一直在网上搜索但没有结果。
我有一台服务器Server A已经运行了几周,它是一台新服务器。我为此服务器设置了 FDW,以访问public
来自 2 个数据库(db B1 和 db B2)的模式中的所有表,我们称它为Server B。所有表都“存储”在服务器 A 上 3 个不同数据库(db A1、A2、A3)上的特定模式中。这个服务器和服务器C之间也有streaming replication
这是我做的 FDW 的总结:
设置服务器 B:添加条目
pg_hba
以接受所有连接create user fdwuser
,重新加载配置文件设置服务器 A:
在db A1、A2、A3上创建这些模式以保存来自服务器 B的数据:
CREATE SCHEMA reference; CREATE SCHEMA profile; GRANT USAGE ON SCHEMA profile TO jhon, bon; GRANT USAGE ON SCHEMA reference TO jhon, bon;
为 db A1、A2、A3 上的每个数据库创建 FDW 扩展:
CREATE EXTENSION IF NOT EXISTS postgres_fdw;
创建外国服务器:
CREATE SERVER foreign_profile FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '10.10.8.40', port '5432', dbname 'db_profile'); ` CREATE SERVER foreign_referensi FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '10.10.8.40', port '5432', dbname 'db_reference');`
创建用户映射:
CREATE USER MAPPING FOR jhon SERVER foreign_reference OPTIONS (user fdwuser, password 'secret'); CREATE USER MAPPING FOR bon SERVER foreign_profile OPTIONS (user fdwuser, password 'secret'); CREATE USER MAPPING FOR jhon SERVER foreign_reference OPTIONS (user fdwuser, password 'secret'); CREATE USER MAPPING FOR bon SERVER foreign_profile OPTIONS (user fdwuser, password 'secret'); CREATE USER MAPPING FOR jhon SERVER foreign_reference OPTIONS (user fdwuser, password 'secret'); CREATE USER MAPPING FOR bon SERVER foreign_profile OPTIONS (user referensi, password 'secret');
将外部模式导入数据库 A1、A2、A3:
IMPORT FOREIGN SCHEMA public FROM SERVER foreign_profile INTO profile; IMPORT FOREIGN SCHEMA public FROM SERVER foreign_referencd INTO reference;
整个过程是成功的。我可以从 Server A 访问 Server B 上的外部表。很好,没问题。
现在,我使用SELECT COUNT(*) FROM pg_ls_dir('pg_wal') WHERE pg_ls_dir ~ '^[0-9A-F]{24}';
. 它显示了大约 2100 多个文件。这令人担忧。
这是服务器A上的设置:
archive_command cd .
archive_mode on
checkpoint_completion_target 0.9
checkpoint_flush_after 32
checkpoint_timeout 300
wal_level replica
wal_keep_segments 8
max_wal_senders 10
max_wal_size 8192
hot_standby on
然后我做一些检查:
select * from pg_catalog.pg_stat_activity
共有 250 个条目,以
backend_type
=parallel worker
或client backend
select * from pg_catalog.pg_stat_archiver
Failed_count = 0; Archived_count = 71;
几分钟后,我又跑
select * from pg_catalog.pg_stat_archiver
了。它现在说:Failed_count = 0; Archived_count = 3; -- it seems to be reset for some reasons
检查复制:
select * from pg_catalog.pg_stat_replication
。结果 :state = streaming
sync_state = async
我认为这台服务器似乎很忙。
问题:
- 为什么 WAL 不断增加?这是正常的吗?如果不是,我应该减少它们吗?
- 为什么是
archived_count
复位? - 这个命令是做什么的
archive_command cd .
:
导入外部模式需要生成 WAL,因为它需要将这些表的描述输入到系统目录中。但它不应该产生大量的 WAL,除非那些外部模式有大量的表(重要的是表和列的数量,而不是表中的行数。因为只记录了表的描述,而不是内容)。
所以很可能,FDW 与此无关。是其他东西生成了 WAL,还有其他东西(可能是复制槽)导致 WAL 被保留。
您可以
pg_waldump
在保留的 WAL 上运行以尝试找出造成这么多问题的原因。这不容易解释,所以最好先想想你的系统在做什么而不是 FDW 来首先提出理论。