大数跨境

MySQL、Oracle、SQL Server数据怎么同步?一套方案搞定异构数据库集成

MySQL、Oracle、SQL Server数据怎么同步?一套方案搞定异构数据库集成 商业智能研究
2026-09-18
5
导读:企业的数据环境,很少像架构图里那么整齐。
企业的数据环境,很少像架构图里那么整齐。

CRM可能跑在 MySQL,ERP还是 Oracle,生产、供应链或者历史业务系统长期运行在 SQL Server;

等企业开始建设数仓、经营分析平台,又要把订单、客户、库存、财务等数据统一汇总起来。

于是一个很现实的问题出现了:

MySQL、Oracle、SQL Server的数据,到底应该怎么同步?

乍一看,无非是“从A库读出来,再写到B库”。

真正落地以后却会发现,难点远不止连接数据库。

日志机制不同、数据类型不同、事务处理不同、主键设计不同、DDL变化不同、异常恢复方式也不同。

如果这些问题没有在架构阶段处理清楚,任务即使每天显示“成功”,下游数据也可能已经悄悄出现偏差。

正式展开之前,先说一下这类异构数据库同步通常怎么处理。

FineDataLink 5.0 可以把 MySQL、Oracle、SQL Server 等不同数据库统一接入,再根据数据量、时效要求和业务场景分别配置批量同步、增量同步或者实时管道。

这样后面面对的就不再是“三种数据库分别怎么写同步脚本”,而是怎么用一套统一的集成逻辑,把不同来源的数据稳定接进同一个数据体系。

FineDataLink 5.0 需要自取:
https://s.fanruan.com/ns1l9


接下来我们就从最关键的问题开始拆:MySQL、Oracle、SQL Server,到底应该怎么同步?


图片
一、异构数据库同步,第一步不是连数据库,而是判断同步场景
图片


很多项目一开始就问:

MySQL怎么同步Oracle?Oracle怎么同步SQL Server?

其实这个问题问早了。


因为同样是“数据库同步”,背后可能完全是三种需求。

第一种是周期性离线同步

例如每天凌晨把ERP、CRM、财务系统的数据抽到数仓,第二天给经营分析、财务报表使用。

这种场景通常允许小时级延迟,更关注任务能否稳定执行、失败后能不能补跑。

第二种是实时或准实时同步

订单创建、支付完成、库存扣减之后,希望几秒钟内进入下游。

如果继续每隔10分钟扫描一次业务表,不仅时效有限,还会持续消耗生产数据库的CPU、IO和网络资源。


第三种是数据库迁移或整库复制

系统上云、数据库国产化、数仓迁移时,需要一次搬几百甚至几千张表,同时源系统还不能停机。

这时候真正应该先判断的是:

    • 数据规模有多大;
    • 允许多长延迟;
    • 是否需要捕获DELETE;
    • 是否需要保存事务顺序;
    • 源库可以承受多大读取压力;
    • 数据最终是做分析,还是继续支撑业务系统。

    不同答案,对应完全不同的同步方式。

    而多数据库环境还有一个常见问题:

    MySQL写一套脚本、Oracle再写一套、SQL Server继续单独维护,时间久了,同一个“订单同步”可能拥有三套调度、三套错误处理和三套监控逻辑。

    在 FineDataLink 5.0 里,可以先把这些异构数据库统一接入,再按照数据特点分别配置批量任务、增量同步或者实时管道。

    这样统一的其实不只是“连接入口”,还包括后面的任务开发和运维方式,避免数据库每增加一种,同步体系就跟着再复制一遍。



    图片
    二、MySQL、Oracle、SQL Server,真正的差异在“变化怎么产生”
    图片


    如果只是执行一次:

    SELECT * FROM order

    三种数据库看起来差别并不大。

    真正拉开差距的是:

    一条数据发生变化以后,你怎么知道?

    MySQL实时同步通常关注 Binlog。

    订单新增、状态修改、数据删除之后,对应变化会被记录在日志中。同步系统读取日志,就不需要不断扫描整张订单表。


    Oracle则要围绕 Redo Log 处理变化。

    这里除了“能不能解析”,还要考虑一个重要问题:

    日志产生速度和消费速度是否匹配。

    假设业务高峰期每秒产生5万条变化,但同步链路只能稳定处理3万条,那么任务并不会马上失败。

    它更可能表现为:

    延迟从10秒慢慢增长到1分钟、10分钟,最后形成持续积压。

    SQL Server同样存在自己的CDC环境和日志处理机制。

    所以异构同步真正难的地方,并不是三种数据库语法不同,而是必须把三种不同的变化机制最终转换成统一事件:


    哪条记录新增、哪条修改、哪条删除,以及这些变化发生的先后顺序。

    如果连这一层都没有统一,下游就很难真正做到实时一致。


    图片
    三、真正稳定的方案,必须解决“存量和增量在哪接上”
    图片


    假设Oracle订单表已经有5亿条历史数据。

    现在准备同步到新的数仓。

    如果直接从今天开始监听日志,过去5亿条数据没有进去。

    那就先跑全量。

    问题又来了。

    假设5亿条历史数据需要8个小时才能同步完成,而这8个小时里,业务系统一直在运行:

    用户继续下单,订单继续退款,库存继续变化。

    所以迁移实际上存在两条时间线:

    一条在搬历史,一条在不断产生新变化。

    成熟方案必须把二者接起来:

    历史存量 → 记录增量起点 → 完成存量 → 接续增量 → 持续实时同步。


    这里真正关键的不是“全量+增量”这几个字,而是中间那个切换点

    MySQL可能对应 Binlog 位点或者GTID;

    Oracle会涉及自己的日志位置与SCN;

    不同数据库各有自己的机制。

    如果切换点往前了一段,数据就可能重复。

    如果切换点往后了一段,数据就可能丢失。

    因此迁移系统真正需要保证的是:

    全量快照和后续日志变化之间不能出现空档。

    另外还有一个问题经常被忽略:

    重复数据怎么办?

    任务网络中断以后重新发送一批数据,如果目标端没有主键或者无法正确执行幂等写入,同一条订单就可能被插入两次。

    所以同步架构里还要同时设计:

    唯一键、更新策略、冲突处理和重试机制。

    在 FineDataLink 5.0 的实时管道里,存量和后续变化可以放进同一条管道考虑;

    全量结束后继续从断点衔接增量,已经完成全量的任务再次恢复时也可以从断点继续,而不用每次从头搬数据。真正减少的是迁移过程中最难人工控制的那段“全量结束和实时开始之间的缝隙”。



    图片
    四、异构数据库最容易被低估的,是字段“看起来一样”
    图片


    很多同步事故并不是数据没过去。

    而是:

    数据过去了,但含义已经变了。

    例如Oracle里:

    NUMBER(20,6)

    到了其他数据库,如果目标字段精度只有两位小数,100.123456最终可能变成100.12。

    任务依然成功。

    但是财务金额已经错了。

    时间字段同样如此。

    Oracle DATE、MySQL DATETIME/TIMESTAMP、SQL Server DATETIME2,在精度和处理方式上都存在差异。

    还有:

      • VARCHAR / VARCHAR2 / NVARCHAR
      • TEXT / CLOB
      • BLOB / VARBINARY
      • NUMBER / DECIMAL / NUMERIC

      如果简单按照字段名称机械映射,很容易出现:

      精度损失、字符截断、大字段失败、时间偏移。

      再往深一层,还有两个问题。

      一个是NULL语义

      NULL、空字符串 ''、数字0,看起来都像“没有值”,但业务含义可能完全不同。


      另一个是主键语义

      源端没有主键,目标端却需要根据主键执行UPDATE;或者源端用了联合主键,下游只保留其中一个字段,都可能让CDC更新无法正确定位原来的记录。

      所以真正成熟的异构集成,最好建立:

      源数据库类型 → 企业标准类型 → 目标数据库类型

      三层映射。

      而不是每增加一种数据库,就重新维护一次A到B的转换关系。

      在 FineDataLink 5.0 的任务配置里,字段映射可以继续处理源端字段和目标结构之间的对应关系。

      但真正上线前,最好把金额、日期、大文本、主键和高精度数字单独列成测试清单。同步工具负责“怎么传”,项目方案还必须确认:

      传到目标库以后,它是不是还是原来那条业务数据。



      图片
      五、为什么更新时间增量,迟早会遇到边界?
      图片


      很多企业最开始做增量同步,都会使用:

      WHERE update_time > 上一次同步时间

      数据量不大时,这种方式完全够用。

      但它有几个隐藏条件。

      第一,所有业务更新必须正确修改 update_time。

      只要某段程序漏掉一次,这条变化就可能永远无法进入下游。

      第二,会存在时间边界。

      假设上一次任务处理到:

      10:00:00

      下一批从:

      10:00:00

      开始。

      同一秒如果有很多条记录,边界处理不当就可能产生漏数。


      有些项目会通过:

      更新时间 + 主键

      组合确定增量位置,就是为了进一步降低这种风险。

      第三个问题更明显:DELETE。

      数据已经从表里物理删除,下一次再查:

      WHERE update_time > xxx

      根本找不到它。

      所以查询式增量,本质上是在问:

      “现在表里有哪些新数据?”

      CDC问的是:

      “数据库刚刚发生了哪些变化?”

      前者适合大量普通离线场景,后者更适合高频交易、实时数仓和需要准确捕获删除的数据。

      关键不是哪种技术更高级。

      而是数据变化方式不同,同步机制也应该不同。



      图片
      六、Schema Change的问题,不在第一次建表,而在半年以后
      图片


      上线第一天,订单表30个字段。

      一个月后新增:

      coupon_amount

      半年后再新增:

      member_level

      后来业务量上涨,又把某个字段:

      VARCHAR(50)

      扩展成:

      VARCHAR(200)

      这就是Schema Change。

      如果源数据库改完结构以后,下游完全不知道,就会出现非常典型的情况:

      任务每天正常运行,但新字段从来没有进入数仓。

      等业务一个月以后开始分析优惠券成本,才发现所有历史数据都缺字段。
      接下来只能:

      改表结构、改同步任务、补历史、重跑模型、重算报表。

      真正的大型环境,还不能只关心“新增字段”。

      因为DDL可能包括:

      增加字段、删除字段、修改字段名称、调整字段类型、删除表、TRUNCATE。


      这些动作风险并不一样。

        • 新增字段通常相对安全;
        • 字段改名可能直接影响下游SQL;
        • 字段类型变化可能造成数据转换失败;

        • 删除字段如果自动向下游传播,甚至可能直接破坏已有报表。


        所以成熟的Schema Change机制还要回答:

        哪些DDL可以自动同步,哪些必须人工确认?

        FineDataLink 5.0 的实时管道已经可以处理多类源表结构变化,并提供针对字段删除、TRUNCATE等场景的处理策略;

        MySQL、Oracle、SQL Server也都在其DDL同步支持范围内,但不同数据库仍然存在各自边界,例如SQL Server来源端新增字段需要按照对应机制处理。


        这也是为什么DDL同步不能理解成简单的“自动跟着改表”。

        更稳妥的做法,是先给DDL做风险分级:

        低风险自动执行,高风险先审批再传播。


        图片
        七、任务成功,只能说明链路没有显式失败
        图片


        数据同步项目里最容易制造安全感的一个词就是:

        成功。

        任务变绿,只能说明程序正常结束。

        它无法回答:

        源库有100万条,目标库是不是也是100万条?

        甚至两边都是100万条,也不能证明数据正确。

        因为可能:

        一边少了100条,另一边恰好又重复了100条。

        所以真正的数据一致性,至少应该做三层检查。

        一层是技术对账

        比较总行数、增量行数、最大主键、最大更新时间。

        第二层是数据对账

        对关键记录做主键级抽样,比较金额、状态、时间等核心字段。

        第三层是业务对账

        例如源系统当天订单金额是1000万元,下游数仓汇总以后是不是仍然是1000万元。

        因为技术字段全部一致,并不代表最终业务指标一定正确。

        除此之外,还要持续关注几个运行指标:

        同步延迟、日志积压、失败记录、消费速度、断点位置。

        如果数据产生速度持续高于目标端写入速度,即使任务完全没有报错,延迟也会越来越高。

        这种问题本质上已经不是“任务成功还是失败”,而是同步链路有没有出现背压

        如果所有排查还要靠人每天翻数据库、查脚本、找调度日志,系统规模一大就很难持续。

        放到 FineDataLink 5.0 里,可以顺着同步任务继续查看运行状态、执行记录和异常情况;

        出现延迟或者写入问题时,排查可以直接回到对应任务和数据流转环节。其产品能力也包括任务状态监控、运行记录以及断点续传等机制。



        八、一套真正能长期运行的异构同步方案,至少要有这九层


        如果企业同时存在 MySQL、Oracle、SQL Server,可以把整个异构数据库集成拆成九层。

        第一层:连接层

        统一管理数据库地址、账号、权限和连接信息。

        第二层:数据分类

        维表、交易表、日志表、历史表不要全部采用同一种同步策略。

        第三层:采集方式

        小表可以全量,普通业务表可以增量,高频核心交易再使用CDC。

        第四层:初始化机制

        解决历史存量和持续增量之间的衔接。

        第五层:数据映射

        统一数据类型、字段规则、主键和NULL语义。

        第六层:变化管理

        Schema Change发生以后,明确哪些自动传播、哪些需要审核。

        第七层:可靠传输

        保存断点、支持重试,同时保证同一批数据重复执行不会制造重复结果。

        第八层:一致性校验

        从行数校验继续做到字段校验和业务指标校验。

        第九层:链路监控

        持续观察延迟、积压、错误和资源瓶颈。


        做到这里就会发现:

        所谓“MySQL、Oracle、SQL Server怎么同步”,其实只是表面问题。

        企业真正需要解决的是:

        不同数据库的数据变化,如何经过一套统一机制,可靠地进入下游。

        数据库可以越来越多。

        来源系统也可以越来越复杂。

        但全量怎么做、增量怎么接、字段怎么映射、变化怎么处理、失败怎么恢复、结果怎么验证,这些规则应该越来越统一。

        只有到了这一层,异构数据库集成才不再是一堆“能跑的数据搬运任务”,而真正变成企业可以长期维护的数据基础设施。


        图片


        点击【阅读原文】,体验文中同款数据集成工具


        图片

        【声明】内容源于网络
        0
        0
        商业智能研究
        帆软旗下机构「帆软数据应用研究院」 专注于企业数据化应用、大数据BI技术和理论观点研究,向业界输出前沿的研究与洞察,帮助企业把握商业智能趋势,提升管理与商业战略认知,让数据成为生产力。
        内容 1136
        粉丝 0
        商业智能研究 帆软旗下机构「帆软数据应用研究院」 专注于企业数据化应用、大数据BI技术和理论观点研究,向业界输出前沿的研究与洞察,帮助企业把握商业智能趋势,提升管理与商业战略认知,让数据成为生产力。
        总阅读15.6k
        粉丝0
        内容1.1k