SymmDS初始加载完成后重复建表致复制失败的解决咨询
解决SymmDS初始加载后重复创建表导致复制失败的问题
问题背景
使用SymmDS 3.15.6配置SQL Server到MySQL的复制,通过auto.reload=true和initial.load.create.first=true完成初始加载后,SymmDS反复尝试创建已存在的表,导致复制失败并产生日志错误。
之前的操作步骤:
- 创建Sym系统表
D:\replication\bin\symadmin --engine mssql-000 create-sym-tables
- 插入复制配置
insert into sym_node (node_id,node_group_id,external_id,sync_enabled,sync_url,schema_version,symmetric_version, database_type,database_version,batch_to_send_count, batch_in_error_count,created_at_node_id) values ('002','azure','002',1,null,null,null,null,null,0,0,'000'); insert into sym_node_security (node_id,node_password,registration_enabled,registration_time,initial_load_enabled,initial_load_time, created_at_node_id) values ('002','5d1c92bbacbe2edb9e1ca5dbb0e481',1,null,1,current_timestamp,'000'); insert into sym_node_group (node_group_id) values ('azure'); insert into sym_node_group_link (source_node_group_id, target_node_group_id, data_event_action) values ('mssql', 'azure', 'W'); insert into sym_channel (channel_id, processing_order, max_batch_size, enabled, description) values('oe_transaction', 1, 100000, 1, 'convert transaction'); insert into sym_trigger (trigger_id, source_table_name, channel_id, last_update_time, create_time) values ('mssql_outbound', '*','oe_transaction',current_timestamp,current_timestamp); insert into sym_router (router_id,source_node_group_id,target_node_group_id,router_type,create_time,last_update_time) values('mssql_2_azure', 'mssql', 'azure', 'default',current_timestamp, current_timestamp); insert into sym_trigger_router (trigger_id,router_id,initial_load_order,last_update_time,create_time) values('mssql_outbound','mssql_2_azure', 100, current_timestamp, current_timestamp); commit;
执行配置导入:
D:\replication\bin\dbimport --engine mssql-000 D:\replication\samples\insert_config_azure.sql
- 开启节点注册
D:\replication\bin\symadmin --engine mssql-000 open-registration mysql 001
- 启动SymmDS服务
问题根源
initial.load.create.first=true会触发SymmDS在初始加载阶段创建目标表;- 触发器配置中
source_table_name='*'匹配所有表,包括已创建的业务表; auto.reload=true触发配置重载时,SymmDS会再次执行表创建逻辑,与已存在的表冲突。
修复与恢复步骤
1. 调整触发器范围,排除重复创建
修改触发器配置,要么指定具体同步表,要么排除Sym系统表:
方式一:指定具体同步表
UPDATE sym_trigger SET source_table_name = '表名1,表名2,表名3' WHERE trigger_id = 'mssql_outbound'; COMMIT;
方式二:排除系统表(保留全表匹配但避免重复创建Sym表)
UPDATE sym_trigger SET exclude_table_name = 'sym_%' WHERE trigger_id = 'mssql_outbound'; COMMIT;
执行后刷新配置:
D:\replication\bin\symadmin --engine mssql-000 reload-config
2. 关闭目标节点的初始加载开关
更新节点安全配置,防止后续再次触发初始加载:
UPDATE sym_node_security SET initial_load_enabled = 0 WHERE node_id = '002'; COMMIT;
3. 清理失败批次
查看所有错误批次:
D:\replication\bin\symadmin --engine mssql-000 list-batches --error
标记错误批次为完成状态:
D:\replication\bin\symadmin --engine mssql-000 mark-batch complete [失败批次ID]
4. 调整长期配置(可选)
在目标节点的symmetric.properties文件中修改参数,避免后续重复触发表创建:
# 初始加载完成后关闭自动创建表 initial.load.create.first=false
5. 重启SymmDS服务
停止源端和目标端的SymmDS进程,重新启动后验证复制是否正常运行。
内容的提问来源于stack exchange,提问作者Jeetendra Nigam
相关产品推荐
相关产品推荐

