SymmetricDS同步异常:Agency→HQ路由出现外键缺失报错
关于SymmetricDS Agency→HQ同步外键报错的排查与解决
问题概述
现有HQ(节点1)和Agency(节点2)两个节点,仅Agency→HQ方向同步出现异常,HQ→Agency方向正常。
初始两数据库完全一致(镜像、外键约束、数据均匹配),双向同步稳定运行数月。客户执行网络中断测试(数据库写入期间拔网线)后,恢复连接出现问题:Agency可成功推送数据至HQ,但HQ因外键约束无法完成行的新增/更新。已确认HQ数据库中存在报错提示的外键对应记录7090efee-379d-44f7-bb58-4ca4e596c62f,且外键约束本身正常。该问题仅出现在预生产环境,开发环境无异常。
报错信息
[sede-000] [DefaultDatabaseWriterConflictResolver] [sede-000-dataloader-1665] Detected losing row for batch preagencia002-680 for missing foreign key parent agencias:7090efee-379d-44f7-bb58-4ca4e596c62f
注:事务中存在部分行丢失,但批次数据写入SymmetricDS批次表时无报错。
排查方向
- 检查批次执行顺序:网络中断可能导致批次乱序,子表数据先于父表数据到达HQ。即使父表最终存在,同步时父表数据未完成写入就处理子表,会触发外键报错。查看
sym_batch表中批次的create_time和status,确认preagencia002-680批次前后,包含父表agencias:7090efee-379d-44f7-bb58-4ca4e596c62f数据的批次是否正常执行。 - 验证数据加载器事务隔离级别:HQ节点的数据加载器可能因隔离级别过高,读取父表数据时未看到已提交的记录,导致误判外键不存在。检查节点配置中的
db.read.isolation.level参数。 - 查看日志细节:在HQ节点开启DEBUG级日志,重点查看
DefaultDatabaseWriterConflictResolver相关输出,确认检测外键时的查询语句和返回结果,排查是否存在查询条件错误或索引失效。 - 检查数据库索引与缓存:HQ数据库的外键字段索引可能因网络中断出现异常,导致查询父表记录时无法命中。手动执行报错涉及的外键查询语句,确认是否能快速返回结果。
解决办法
- 重排异常批次:确认批次乱序后,暂停Agency→HQ的同步路由,找到包含父表目标记录的批次,先手动执行该批次,再执行报错的preagencia002-680批次,最后恢复同步。
- 调整事务隔离级别:将HQ节点的
db.read.isolation.level设置为READ_COMMITTED,确保数据加载器能读取到已提交的父表记录。 - 重建数据库索引:针对
agencias表的主键字段重建索引,消除索引异常导致的查询问题。 - 重置节点同步状态:若上述方法无效,可在HQ节点删除
sym_batch、sym_data中与异常批次相关的记录,然后重新初始化Agency节点的同步操作(操作前务必备份数据)。
强制处理方案
如果已确认父表记录确实存在,可采用以下临时方案跳过报错:
- 修改冲突 resolver配置:在HQ节点的
sym_conflict表中,针对报错涉及的子表,将conflict_resolver_type设置为ignore;或修改DefaultDatabaseWriterConflictResolver的配置参数foreign.key.check.enabled为false,执行完异常批次后恢复原配置。 - 手动执行批次SQL:从
sym_data表中提取preagencia002-680批次对应的SQL语句,直接在HQ数据库执行,之后更新sym_batch表中该批次的status为OK,标记为已完成。
内容的提问来源于stack exchange,提问作者RedNet
相关产品推荐
相关产品推荐

