SymmetricDS无法从DB2 AS/400同步数据至SQL Server求助
看起来你已经搭好了SymmetricDS的基础引擎配置,但数据没推送大概率是几个关键环节没到位,咱们一步步排查:
1. 确认客户端节点是否启动
你目前只启动了主节点server-000,但客户端节点sqlsvr-001也需要单独启动才能完成注册、拉取配置和接收数据。你需要在另一个终端(或同一机器的不同命令窗口)执行启动命令:
sym --engine sqlsvr-001 -port 8085
(注意用不同端口,避免和主节点的8084端口冲突)
启动后,检查主节点日志,看看有没有包含RegistrationService的条目,确认sqlsvr-001成功完成注册。
2. 配置同步核心规则(触发器+路由)
SymmetricDS不会自动同步所有表,必须手动配置触发器(捕获DB2源表的变更)和路由(指定变更数据要发送到哪个目标节点组)。
连接到主节点的DB2数据库,执行类似以下的SQL(替换成你实际要同步的表信息):
- 创建触发器(以同步
your_schema.your_table为例):
INSERT INTO sym_trigger (trigger_id, source_table_name, channel_id, sync_on_insert, sync_on_update, sync_on_delete) VALUES ('trigger_your_table', 'your_schema.your_table', 'default', 1, 1, 1);
- 创建路由(将
server节点组的变更发送到sqlsvr节点组):
INSERT INTO sym_router (router_id, source_node_group_id, target_node_group_id, router_type) VALUES ('router_server_to_sqlsvr', 'server', 'sqlsvr', 'default');
- 关联触发器与路由:
INSERT INTO sym_trigger_router (trigger_id, router_id) VALUES ('trigger_your_table', 'router_server_to_sqlsvr');
完成这些配置后,RouterService才会开始捕获并路由数据变更。
3. 验证节点注册状态
连接到主节点的DB2数据库,查询sym_node表确认客户端节点是否已注册:
SELECT * FROM sym_node WHERE external_id = '001';
如果没有找到这条记录,说明客户端注册失败,需要检查:
- 客户端的
registration.url是否正确指向主节点的同步地址:http://10.131.44.20:8084/sync/server-000 - 客户端启动日志中是否有网络连接、认证相关的错误信息
4. 触发初始加载(如需同步现有数据)
你在主节点设置了initial.load.create.first=true,但这个配置仅允许创建初始加载请求,还需要手动触发:
在主节点的DB2中执行:
INSERT INTO sym_node_load_request (node_id, create_time, status) SELECT node_id, CURRENT_TIMESTAMP, 'REQUEST' FROM sym_node WHERE external_id = '001';
执行后,主节点会开始将现有数据推送到客户端节点。
5. 开启详细日志排查细节
如果以上步骤都没问题,建议开启DEBUG级别的日志来定位问题。修改主节点的log4j2.xml(或对应日志配置文件),将org.jumpmind.symmetric的日志级别改为DEBUG,这样能看到数据捕获、路由、推送的完整细节,比如是否有数据被捕获、是否尝试向客户端发送数据等。
内容的提问来源于stack exchange,提问作者Raju Rudru

