我想解决运行 AWS Database Migration Service (AWS DMS) 更改数据捕获 (CDC) 任务时出现的源 PostgreSQL 数据库的存储空间占用过高的问题。
简短描述
当您使用 PostgreSQL 作为 CDC 任务的源时,AWS DMS 使用 PostgreSQL 逻辑复制槽从源数据库获取更改。这些槽会保留 AWS DMS 所需的预写日志 (WAL),即使您没有将 WAL 连接到 PostgreSQL 源也是如此。AWS DMS 仅在从复制槽中提取所需的更改并推进该复制槽的 restart_lsn 后,才会从 PostgreSQL 中移除 WAL。
有关详细信息,请参阅 PostgreSQL 网站上的 Logical decoding concepts(逻辑解码概念)。
出现存储卷问题的原因可能如下:
- 您停止了 AWS DMS CDC 任务很长时间。如果您不将 AWS DMS 连接到源数据库,则它不会消耗源上复制槽中的更改。因此,PostgreSQL 会持续保留 WAL。
- 您的工作负载繁重,会导致 WAL 生成过多。当您使用逻辑复制槽时,如果复制槽需要日志序列号 (LSN),PostgreSQL 会保留 WAL。
- 您有空闲的复制槽。即使复制槽处于非活动状态,复制槽保留的 WAL 仍包含有关表、架构或数据库的信息。即使表中没有事务,这也会填满源上的存储空间。
解决方法
检查复制槽是否导致 PostgreSQL 源上的磁盘空间使用率过高
要检查复制槽是否导致 PostgreSQL 数据库中的磁盘空间使用率过高,请运行以下查询之一:
对于 PostgreSQL v9:
psql=> SELECT slot_name, pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;
PostgreSQL v10 及更高版本:
psql=> SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;
输出示例:
slot_name | replicationslotlag | active---------------------------------------------------------------+--------------------+--------
xc36ujql35djp_00013322_907c1e0a_9f8b_4c13_89ea_ef0ea1cf143d | 129 GB | f
7pajuy7htthd7sqn_00013322_a27bcebf_7d0f_4124_b336_92d0fb9f5130 | 704 MB | t
zp2tkfo4ejw3dtlw_00013322_03e77862_689d_41c5_99ba_021c8a3f851a | 624 MB | t
如果复制槽的活动状态设置为 f (false),则您的数据库不会消耗该槽。
要删除未使用的槽,请运行以下查询:
psql=> SELECT pg_drop_replication_slot('YOUR_SLOTNAME');
**注意:**请将 YOUR_SLOTNAME 替换为槽名称。
有关详细信息,请参阅为什么我在 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 上收到“No space left on device”或“DiskFull”错误?
启用 WAL 检测信号功能
要减少 PostgreSQL 源数据库的存储消耗,请启用 heartbeatEnable 额外连接属性 (ECA)。此属性有助于防止在 PostgreSQL 源上出现存储空间已满的情况。
要启用 WAL 检测信号功能,请将以下 ECA 添加到 PostgreSQL 源端点:
heartbeatEnable=Y;
**注意:**只有在 AWS DMS 任务正在运行时,检测信号事务才会在源上运行。如果您停止 AWS DMS 任务,则 WAL 检测信号功能不起作用。
您还可以指定以下 ECA:
heartbeatFrequency=frequency;heartbeatSchema=schemaname;
heartbeatFrequency 属性决定检测信号事务在 PostgreSQL 源上运行的频率(以分钟为单位)。将 frequency 替换为您希望事务运行的频率。例如,如果您将 heartbeatFrequency 的值设置为 15,则 AWS DMS 每 15 分钟在源上运行一次检测信号事务。
heartbeatSchema 属性指定 AWS DMS 在哪个数据库架构中创建数据库对象来生成检测信号事务。将 schemaname 替换为您的数据库架构。
在 PostgreSQL 中设置槽的最大大小
在 PostgreSQL 版本 13 及更高版本中,您可以在源数据库上应用 max_slot_wal_keep_size。这会设置复制槽可以保留的最大 WAL 量。有关详细信息,请参阅 PostgreSQL 网站上的 max_slot_wal_keep_size。
**注意:**max_slot_wal_keep_size 设置可帮助您避免 PostgreSQL 源上出现存储空间已满的问题。但是,它可能会导致 PostgreSQL 源数据库在 AWS DMS CDC 任务从复制槽读取更改之前清除 WAL。这可能会导致任务失败。
相关信息
Hevo 网站上的 Types of PostgreSQL replication slots(PostgreSQL 复制槽的类型)