SymmetricDS安装异常求助:PostgreSQL未建表+端口占用问题
解决SymmetricDS启动失败(端口占用)+ 双向同步配置指南(SQL Server ↔ PostgreSQL)
一、紧急修复端口占用导致的启动失败
从wrapper.log看,31418端口被占用是服务意外退出的核心原因,按以下步骤处理:
- 查找占用31418端口的进程:
sudo lsof -i :31418 # 或替代命令 sudo netstat -tulpn | grep 31418 - 终止占用进程(替换
<PID>为查到的进程ID):sudo kill -9 <PID> - 若不想终止现有进程,修改SymmetricDS的JMX端口:
编辑conf/wrapper.conf,找到该行:
将wrapper.java.additional.10=-Dcom.sun.management.jmxremote.port=3141831418改为其他未被占用的端口(如31419),保存后重启服务:sudo systemctl restart SymmetricDS.service - 验证服务状态:
同时检查PgAdmin是否出现数据库连接活动。bin/sym_service status sudo systemctl status SymmetricDS.service
二、解决PostgreSQL未创建系统表的问题
SymmetricDS启动成功后会自动创建系统表,未创建时按以下排查:
- 确认
engines/postgres.properties配置正确,核心参数示例:
注意:db.driver=org.postgresql.Driver db.url=jdbc:postgresql://localhost:5432/你的数据库名?currentSchema=public db.user=PG用户名 db.password=PG密码 registration.url=http://localhost:31415/sync/PG_GROUP group.id=PG_GROUP external.id=PG_NODE_001group.id和external.id需自定义,后续SQL Server节点配置要对应。 - 检查
logs/symmetric.log,确认是否有数据库连接错误(如密码错误、数据库不存在)。 - 手动初始化系统表(替换
PG_GROUP为你的group.id):bin/symadmin --engine PG_GROUP create-sym-tables
三、双向实时同步配置(SQL Server ↔ PostgreSQL)
1. 配置SQL Server节点
在SymmetricDS的engines目录新建sqlserver.properties,核心参数示例:
db.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver db.url=jdbc:sqlserver://SQL_SERVER_IP:1433;databaseName=你的SQLServer数据库名 db.user=SQLServer用户名 db.password=SQLServer密码 registration.url=http://SYMMETRICDS_SERVER_IP:31415/sync/PG_GROUP group.id=SQLSERVER_GROUP external.id=SQLSERVER_NODE_001
2. 开放节点注册权限
在PostgreSQL节点所在的SymmetricDS服务器执行:
bin/symadmin --engine PG_GROUP open-registration SQLSERVER_GROUP SQLSERVER_NODE_001
3. 配置表同步、字段映射
以同步customer表为例,在PostgreSQL数据库执行以下SQL:
(1)注册同步表
INSERT INTO sym_table (table_name, source_node_group_id, target_node_group_id) VALUES ('customer', 'PG_GROUP', 'SQLSERVER_GROUP'), ('customer', 'SQLSERVER_GROUP', 'PG_GROUP');
(2)创建同步触发器
INSERT INTO sym_trigger (trigger_id, table_name, source_node_group_id) VALUES ('customer_trigger', 'customer', 'PG_GROUP'), ('customer_trigger', 'customer', 'SQLSERVER_GROUP');
(3)配置同步路由
INSERT INTO sym_router (router_id, source_node_group_id, target_node_group_id, router_type) VALUES ('pg_to_sqlserver', 'PG_GROUP', 'SQLSERVER_GROUP', 'default'), ('sqlserver_to_pg', 'SQLSERVER_GROUP', 'PG_GROUP', 'default');
(4)关联触发器与路由
INSERT INTO sym_trigger_router (trigger_id, router_id) VALUES ('customer_trigger', 'pg_to_sqlserver'), ('customer_trigger', 'sqlserver_to_pg');
(5)字段映射(若两端字段名不同)
INSERT INTO sym_column (trigger_id, source_column_name, target_column_name) VALUES ('customer_trigger', 'pg_cust_id', 'sqlserver_cust_id'), ('customer_trigger', 'pg_cust_name', 'sqlserver_cust_name');
4. 冲突处理配置
以「最后修改时间优先」为例,在PostgreSQL数据库执行:
INSERT INTO sym_conflict (conflict_id, source_node_group_id, target_node_group_id, table_name, detect_type, resolve_type) VALUES ('customer_conflict', 'PG_GROUP', 'SQLSERVER_GROUP', 'customer', 'USE_CHANGED_DATA', 'LAST_UPDATE_WINS'), ('customer_conflict', 'SQLSERVER_GROUP', 'PG_GROUP', 'customer', 'USE_CHANGED_DATA', 'LAST_UPDATE_WINS');
可选策略:TARGET_WINS(目标端数据优先)、MANUAL(手动处理冲突)。
四、验证同步效果
- 重启SymmetricDS服务,确保两个节点正常运行。
- 在PostgreSQL的
customer表插入/修改数据,检查SQL Server端是否同步。 - 在SQL Server的
customer表插入/修改数据,检查PostgreSQL端是否同步。 - 若同步失败,查看
logs/symmetric.log排查具体错误。
内容的提问来源于stack exchange,提问作者Mohamed Elmeslmaney
相关产品推荐
相关产品推荐

