Docker化SymmetricDS双活PostgreSQL环境数据不跨节点复制问题
解决SymmetricDS双活PostgreSQL环境数据不复制的问题
从你的配置来看,节点注册已经完成,但数据未同步的核心原因是缺少同步规则、触发器及双向路由的关键配置,SymmetricDS不会自动同步所有表,必须明确指定同步范围与流转规则。以下是针对性的修复步骤:
1. 配置同步表与变更捕获触发器
首先需要明确指定要同步的表,并创建触发器捕获数据变更:
在任意一个节点的PostgreSQL库中执行以下SQL(配置会自动同步到另一节点):
-- 配置要同步的表(示例为public schema下所有表,可根据业务调整匹配规则) INSERT INTO sym_table (table_name, node_group_id, sync_on_insert, sync_on_update, sync_on_delete) VALUES ('public.%', 'primary', 1, 1, 1); -- 创建PostgreSQL触发器模板 INSERT INTO sym_trigger_template (trigger_template_name, trigger_type, sync_on_insert, sync_on_update, sync_on_delete, handle_old_data, channel_id) VALUES ('default_postgres', 'postgres', 1, 1, 1, 1, 'default'); -- 为同步表生成触发器 INSERT INTO sym_trigger (trigger_id, table_name, node_group_id, trigger_template_name) SELECT 'trigger_' || REPLACE(table_name, '.', '_'), table_name, node_group_id, 'default_postgres' FROM sym_table WHERE node_group_id = 'primary';
2. 配置双活双向同步路由
Active-Active环境需要让两个节点的变更能互相流转,需添加同组内的路由规则:
-- 创建primary组到自身的路由规则(允许同组节点互相同步) INSERT INTO sym_router (router_id, source_node_group_id, target_node_group_id, router_type, create_time, last_update_time) VALUES ('primary_to_primary', 'primary', 'primary', 'default', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -- 关联触发器与路由规则 INSERT INTO sym_trigger_router (trigger_id, router_id, initial_load_order, create_time, last_update_time) SELECT trigger_id, 'primary_to_primary', 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP FROM sym_trigger WHERE node_group_id = 'primary';
3. 刷新触发器并激活配置
手动触发SymmetricDS加载新配置:
# 进入SymmetricDS容器 docker exec -it <你的symmetricds容器ID> bash # 刷新触发器(分别在两个节点执行,替换对应引擎名) ./bin/symadmin --engine symmetricdsmwdb0 reload-triggers ./bin/symadmin --engine symmetricdsmwdb1 reload-triggers
4. 补全双活节点的引擎配置
当前从节点(VM2)缺少双活必备的自动注册与重载配置,修改其引擎配置文件,添加:
auto.registration=true auto.reload=true
重启SymmetricDS容器生效。
5. 日志排查(若仍未同步)
查看SymmetricDS容器日志定位问题:
docker logs <你的symmetricds容器ID>
重点关注:
- 触发器创建失败(如数据库权限不足)
sym_data表是否有新增的变更记录sym_incoming_batch表是否有接收的同步批次
内容的提问来源于stack exchange,提问作者Yonoss
相关产品推荐
相关产品推荐

