SymmetricDS配置:基于唯一键而非主键同步冲突数据
基于唯一键配置SymmetricDS同步MySQL数据
场景说明
现有MySQL表结构如下:
id BINARY PRIMARY KEY, -- 实际为GUID position INT NOT NULL UNIQUE some_value VARCHAR(200)
两个节点分别创建了position=5的不同条目:
id=0x01 position=5 some_value = "first node entry" id=0x02 position=5 some_value = "second node entry"
需要通过唯一键position而非主键id进行数据同步,最终保留任意一条条目即可。
配置步骤
1. 指定同步用的唯一键
需要让SymmetricDS知道使用position作为同步匹配的唯一键,而非默认主键,有两种配置方式:
方式一:XML配置(symmetric.xml)
在配置文件的<tables>节点下添加目标表的配置,明确指定syncKeyColumns为position,并配置冲突解决策略:
<table name="your_table_name" catalog="your_db_catalog" schema="your_db_schema"> <column name="id" type="BINARY"/> <column name="position" type="INT"/> <column name="some_value" type="VARCHAR"/> <!-- 设置同步匹配的唯一键 --> <syncKeyColumns>position</syncKeyColumns> <!-- 配置冲突解决策略,选任意符合需求的即可 --> <conflictResolver> <!-- LAST_UPDATE_WINS:保留最后更新的条目;FIRST_UPDATE_WINS:保留先同步的条目;IGNORE:忽略后续冲突条目 --> <resolverType>LAST_UPDATE_WINS</resolverType> </conflictResolver> </table>
方式二:数据库元数据表配置
直接操作SymmetricDS的元数据表:
- 配置触发器使用唯一键:
UPDATE sym_trigger SET sync_on_insert = 1, sync_on_update = 1, sync_on_delete = 1, unique_key_columns = 'position' WHERE target_table_name = 'your_table_name';
- 添加冲突解决策略:
INSERT INTO sym_conflict (conflict_id, target_table_name, detect_type, resolve_type, create_time, last_update_time) VALUES ('table_position_conflict', 'your_table_name', 'USE_UNIQUE_KEYS', 'LAST_UPDATE_WINS', NOW(), NOW());
resolve_type可选值:LAST_UPDATE_WINS、FIRST_UPDATE_WINS、IGNORE,均满足“保留任意条目”的需求。
2. 生效配置
重启SymmetricDS节点,或者执行命令重载配置:
symadmin reload -n 你的节点ID
这会重新生成同步触发器,确保同步逻辑使用position作为匹配字段。
3. 优化冲突处理(可选)
如果选择LAST_UPDATE_WINS策略,建议给表添加更新时间字段,让冲突判断更精准:
ALTER TABLE your_table_name ADD COLUMN last_update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
并在同步配置的<column>节点中添加该字段,让SymmetricDS跟踪其变化。
内容的提问来源于stack exchange,提问作者Predrag Manojlovic
相关产品推荐
相关产品推荐

