---
title: PostgreSQL 逻辑复制冲突与恢复演练(冲突检测、比对与回放)
date: 2025-11-26
keywords:
- 逻辑复制
- 冲突检测
- 复制槽
- 回放
- 比对校验
description: 在逻辑复制场景下模拟唯一约束冲突与数据漂移,给出检测、比对与恢复流程,包括暂停订阅、对齐数据与回放验证,确保一致性与可追踪。
tags:
- PostgreSQL
- 冲突检测
- 回放
- 复制槽
- 数据与存储
- 数据库
- 比对校验
- 逻辑复制
categories:
- 文章资讯
- 编程技术
---
概述
逻辑复制依赖主库变更日志在订阅端回放。数据漂移或唯一约束冲突会导致订阅应用失败。通过暂停订阅、比对校验与对齐数据,然后恢复并回放,可保证一致性与可审计。
关键实践与参数
- 参数:
wal_level=logicalmax_replication_slotsmax_wal_senders - 发布/订阅: 选择性表复制,控制
copy_data - 冲突检测: 通过
pg_stat_subscription与日志识别错误 - 恢复流程: 暂停 → 对齐数据 → 刷新发布 → 恢复订阅
示例/配置/实现
ALTER SYSTEM SET wal_level = 'logical';
SELECT pg_reload_conf();
CREATE PUBLICATION pub_orders FOR TABLE orders;
CREATE SUBSCRIPTION sub_orders CONNECTION 'host=primary port=5432 dbname=shop user=replicator password=secret' PUBLICATION pub_orders WITH (copy_data = true);
-- 模拟冲突: 在订阅端预先存在主键重复行
INSERT INTO orders(id, amount) VALUES (1001, 12.3);
-- 主库写入同主键但不同数据
INSERT INTO orders(id, amount) VALUES (1001, 15.0);
-- 检测与暂停
SELECT subname, latest_end_time, last_msg_send_time, last_msg_receipt_time FROM pg_stat_subscription;
ALTER SUBSCRIPTION sub_orders DISABLE;
-- 比对与对齐(示例: 以主库为准)
DELETE FROM orders WHERE id = 1001; -- 清理冲突数据
-- 或重新同步目标表数据
ALTER SUBSCRIPTION sub_orders REFRESH PUBLICATION WITH (copy_data = true);
-- 恢复并回放
ALTER SUBSCRIPTION sub_orders ENABLE;
验证
- 订阅状态:
pg_stat_subscription恢复正常,滞后时间下降 - 数据一致: 比对主从关键字段哈希或计数一致
- 回放完成: 新写入在订阅端可见且无冲突
- 审计记录: 保留暂停、比对与恢复操作日志
注意事项
- DDL不复制,需保持两端Schema一致
- 大批量对齐需在维护窗口执行并监控资源
- 复制用户权限最小化,槽位需回收
- 故障演练定期执行,完善SOP与回滚策略

发表评论 取消回复