You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何同步本地与云端物理隔离的Odoo(PostgreSQL)数据库?

针对你这种本地(A)+云端(B)双库切换的Odoo同步需求,我整理了几个实用的方案,结合不同的场景和技术复杂度,你可以按需选择:

核心思路

首先得明确:我们要解决的是物理分离数据库的双向/单向数据一致性,核心要区分两种同步模式:

  • 全量同步:定期将整个数据库从一端复制到另一端,适合初始化或数据量不大的场景
  • 增量同步:只同步新增/修改的数据,适合日常频繁切换使用的场景,能减少网络传输量
具体同步方案

1. 手动导出/导入(适合小数据量、低频率同步)

这是最直接的原生方法,不需要额外开发,适合数据量不大、同步频率不高(比如每天/每周一次)的情况:

  • 操作步骤:
    • 在本地库A中,进入对应模块(比如客户、销售订单),点击「导出」,选择CSV/Excel格式,勾选需要同步的字段(建议包含external_id或唯一标识字段,避免重复)
    • 把导出的文件传到云端,在库B中进入对应模块,点击「导入」,选择文件后设置匹配规则(比如用external_id匹配现有记录,自动更新而非重复创建)
  • 进阶技巧:用Odoo命令行工具导出更灵活,比如导出客户和订单数据:
    odoo-bin -d local_db --export-all --format=csv --models=res.partner,sale.order
    

2. 基于Odoo API的自动化增量同步(适合日常高频同步)

如果需要自动同步两地的新增/修改数据,可以用Odoo的XML-RPC/JSON-RPC API写脚本,实现增量同步:

  • 核心逻辑:
    1. 监听或定期查询A/B库中最近修改的记录(通过write_date字段筛选)
    2. 用API将变更数据同步到另一端,通过唯一标识(比如external_id)判断是创建还是更新记录
  • 示例Python脚本片段(同步最近1小时的客户数据):
    import xmlrpc.client
    from datetime import datetime, timedelta
    
    # 连接Odoo数据库的通用函数
    def connect_odoo(url, db, username, password):
        common = xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/common')
        uid = common.authenticate(db, username, password, {})
        models = xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/object')
        return uid, models
    
    # 连接本地库A和云端库B
    uid_a, models_a = connect_odoo('http://localhost:8069', 'local_db', 'admin', 'admin')
    uid_b, models_b = connect_odoo('https://your-cloud-odoo.com', 'cloud_db', 'admin', 'admin')
    
    # 筛选最近1小时修改的客户记录
    since_date = (datetime.now() - timedelta(hours=1)).strftime('%Y-%m-%d %H:%M:%S')
    partners = models_a.execute_kw(
        'local_db', uid_a, 'admin',
        'res.partner', 'search_read',
        [[['write_date', '>=', since_date]]],
        {'fields': ['name', 'email', 'phone', 'external_id']}
    )
    
    # 同步到云端库B
    for partner in partners:
        existing_ids = models_b.execute_kw(
            'cloud_db', uid_b, 'admin',
            'res.partner', 'search',
            [[['external_id', '=', partner['external_id']]]]
        )
        if existing_ids:
            # 更新已有记录
            models_b.execute_kw(
                'cloud_db', uid_b, 'admin',
                'res.partner', 'write',
                [existing_ids, {k: v for k, v in partner.items() if k != 'id'}]
            )
        else:
            # 创建新记录
            models_b.execute_kw(
                'cloud_db', uid_b, 'admin',
                'res.partner', 'create',
                [partner]
            )
    
  • 优化点:可以给脚本加重试机制、本地缓存(网络不好时暂存变更,恢复后再同步),以及冲突处理逻辑(比如对比write_date保留最新版本)

3. 数据库级同步(适合全量/大规模数据同步)

因为Odoo基于PostgreSQL,直接用数据库工具同步效率最高,但要注意版本一致性:

  • 全量同步:
    1. 在本地执行pg_dump备份数据库:
      pg_dump -d local_db -F c -b -v -f local_backup.dump
      
    2. 将备份文件传到云端,然后用pg_restore恢复到云端库:
      pg_restore -d cloud_db -c -v local_backup.dump
      
      注意:-c参数会先清空云端库,适合初始化或定期全量覆盖的场景
  • 增量同步:
    可以用PostgreSQL的WAL日志备份工具(比如wal-g),定期备份本地库的WAL日志,传到云端恢复,实现增量同步。但配置稍复杂,需要两地网络连通时先设置基础备份。
关键注意事项
  • 版本一致性:本地和云端的Odoo版本、安装的模块(包括模块版本)必须完全一致,否则数据库 schema 不同会导致同步失败
  • 冲突处理:双向同步时,同一记录在两地都修改的情况,必须制定规则(比如「以最后修改时间为准」),或在脚本中加入冲突检测和手动审核逻辑
  • 网络适配:如果网络不稳定,同步脚本要加入重试、断点续传或本地缓存机制,避免数据丢失
  • 数据安全:同步时用HTTPS传输API请求,数据库备份文件要加密,避免敏感数据泄露
  • 测试验证:先在测试环境验证同步流程,确保数据一致后再应用到生产环境

内容的提问来源于stack exchange,提问作者Abdul Waheed

火山引擎 最新活动