You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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=31418
    
    将31418改为其他未被占用的端口(如31419),保存后重启服务:
    sudo systemctl restart SymmetricDS.service
    
  • 验证服务状态:
    bin/sym_service status
    sudo systemctl status SymmetricDS.service
    
    同时检查PgAdmin是否出现数据库连接活动。

二、解决PostgreSQL未创建系统表的问题

SymmetricDS启动成功后会自动创建系统表,未创建时按以下排查:

  1. 确认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_001
    
    注意:group.id和external.id需自定义,后续SQL Server节点配置要对应。
  2. 检查logs/symmetric.log,确认是否有数据库连接错误(如密码错误、数据库不存在)。
  3. 手动初始化系统表(替换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(手动处理冲突)。

四、验证同步效果

  1. 重启SymmetricDS服务,确保两个节点正常运行。
  2. 在PostgreSQL的customer表插入/修改数据,检查SQL Server端是否同步。
  3. 在SQL Server的customer表插入/修改数据,检查PostgreSQL端是否同步。
  4. 若同步失败,查看logs/symmetric.log排查具体错误。

内容的提问来源于stack exchange,提问作者Mohamed Elmeslmaney

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:23:22