我尝试使用 pglogical 在 2 个 PG 服务器之间复制数据,在此过程中发现巨大的磁盘占用。这是详细信息
环境:
来源 PG:
- 服务器名称:pg-publisher。
- IP地址:10.0.0.1
- 整盘空间:3.5T
- PG数据文件夹大小:2.2T
- 最大桌子尺寸:
- 表名 ->
my_schema.logs
。 - pg_table_size('logs') = 1.4T
- 表名 ->
- PG正在运行,新数据不断进入并插入到包括表在内的
logs
表中。
目的地PG:
- 服务器名称:pg-subscriber
- IP地址:10.0.0.2
- 整盘空间:3T
我是如何设置复制的:
在 pg-publisher 上
创建节点:
SELECT pglogical.create_node( node_name := 'publisher', dsn := 'host=10.0.0.1 port=5432 dbname=mydb user=pguser password=pgpassword' );
创建复制集
SELECT pglogical.create_replication_set('my_replication_set'); SELECT pglogical.replication_set_add_all_tables('my_replication_set', ARRAY['my_schema']);
在 pg 订阅者上
创建节点
SELECT pglogical.create_node( node_name := 'subscriber', dsn := 'host=10.0.0.2 port=5432 dbname=mydb user=pguser password=pgpassword' );
创建订阅
SELECT pglogical.create_subscription( subscription_name := 'pg_subscriber', provider_dsn := 'host=10.0.0.1 port=5432 dbname=mydb user=pguser password=pgpassword', replication_sets := ARRAY['my_replication_set'], synchronize_structure := false, synchronize_data := true
); ```
确认
经过上述操作。我检查了两台服务器上的状态:
- 在 pg 订阅者上。pglogical 复制处于
initializing
状态(来自pglogical.show_subscription_status()
) - 在 pg-publisher 上。复制槽已创建且未处于活动状态。这是意料之中的,因为有很多数据需要初始化。在达到状态之前它不会处于活动
replicating
状态
我的困惑
所有操作似乎都按预期工作。但 4 天后,我收到警报,发现可用磁盘空间pg-publisher
减少了很多(减少了 20% 以上)。然后这是我发现的:
pglogical
复制仍处于initializing
状态 onpg-subscriber
。在 pg-publisher 上,我检查了pg_stat_activity
它,发现pglogical
事件正在使用COPY
命令复制最大的表my_schema.logs
。PG数据的文件夹大小
pg-publisher
从2.2T增加到2.7T
我知道发布服务器会在达到replicating
状态之前保留复制所需的 WAL 文件,这将占用磁盘空间。但我检查了pg_wal
文件夹大小pg-publisher
,发现它只有不到 20GB。但base
文件夹增加到2.7T。我可以知道为什么会这样。命令是否COPY
占用磁盘空间(我不这么认为,因为我发现它会复制到标准输出)还是有其他事情会导致它?