OGG架构与模式全解:从日志捕获到并行复制,数据同步避坑指南 干这一行这么多年接手过的数据同步项目里OGGOracle GoldenGate出现的频率相当高。无论是做容灾切换、报表库实时同步还是跨机房数据分发很多人第一个想到的方案就是它。但说句实话OGG这工具“能跑起来”很容易照着文档敲几行命令就能通真正要把它用明白搞清它背后的架构设计、运行模式和分类逻辑就不那么简单了。一旦遇到性能瓶颈、数据不一致或者进程异常如果脑子里没有一张清晰的架构图排查起来会非常痛苦。这篇文章我不打算照抄官方文档那个太枯燥了。我结合自己实际维护过的几套OGG环境把架构图、运行模式和分类方式掰开了讲清楚同时会把实操中容易踩的坑一并说出来。无论你是刚接触OGG的入门者还是已经维护了一段时间但总觉得有些概念模糊的工程师这篇内容应该都能给你一些参考。1. 先看整体OGG的架构与核心进程OGG的本质思想其实很朴素就是“日志捕获、队列传输、目标应用”这一套逻辑。它不直接去操作数据库表而是从数据库的在线日志或归档日志中解析出变化数据通过自己的一套队列机制传到目标端再以SQL或专用接口的方式把变化应用进去。这种设计最大的好处是源端负载极低基本不影响业务系统的正常运转。很多新手第一次看OGG架构图会懵因为进程名字太多每一个看起来都像独立的东西。我把这套体系拆开其实就那么几个核心组件和进程把它们各自的分工理清楚整个架构就通了。1.1 核心组件Manager、Extract、Data Pump、ReplicatManager进程它是OGG的总管进程。源端和目标端各有一个负责启停其他进程、动态端口分配、日志维护、参数文件管理等等。可以这么理解Manager就是OGG体系里的“看门老大爷”所有进程的生杀大权都在它手里。比如你要是执行STOP EXTRACT实际是Manager去把Extract停掉的。Extract进程跑在源端负责从数据库日志里抓取变化数据。这是OGG体系里最核心的进程抓取的方式有经典抓取和集成抓取之分具体区别后文展开。抓出来的数据会被写成一个OGG自己的队列文件叫Trail文件。Data Pump进程也是跑在源端但它不是必选的。它的作用是把Extract写出来的本地Trail文件通过网络传输到目标端。为什么要有Data Pump常见的考虑是如果Extract直接做网络传输一旦网络抖动或目标端故障Extract会被阻塞住进而影响源端日志读取进度。但加了Data Pump之后Extract只负责往本地写TrailData Pump负责远程投递两者之间就形成了一个缓冲带。本地Trail写不进去的极端情况很少但网络出问题的概率高得多所以用Data Pump隔离能最大限度保证源端Extract稳定运行。Replicat进程跑在目标端。它读取从源端传过来的Trail文件解析里面的操作记录然后在目标库上执行。执行方式有经典复制和集成复制之分。这里要特别注意Replicat只是负责“执行变化”它不关心数据是怎么来的。1.2 队列文件与检查点机制OGG不丢数据的关键Trail文件是OGG能实现数据不丢不重的基础。简单说Trail文件就是OGG自己的“日志箱”Extract把解析后的变化数据按固定格式写进这个文件Replicat再从这个文件里读出来应用。它不需要依赖数据库的任何机制完全由OGG自己管理。Trail文件是滚动覆盖的默认情况下每个文件大小上限和保留数量都由参数控制。我建议生产环境这个参数不要调得太小太小会导致文件频繁切换增加管理开销也不要无限大否则磁盘占满后OGG会直接夯住。一般取默认的100M或者根据事务量适当放大到200M、500M都是常见做法。Checkpoint机制也是如此重要。OGG通过检查点记录Extract抓取到的日志位置和Replicat应用到的Trail文件位置。只要检查点存在即使进程崩溃、服务器宕机OGG重启后都能从最近一次成功记录的位置继续工作。注意很多数据不一致的问题追根溯源都是检查点配置不合理导致的。建议在配置时开启定期检查点刷新同时留意日志里的检查点警告信息。1.3 网络拓扑与端口交互OGG的通信方式我简单总结一下源端Data Pump和目标端Server进程建立TCP连接传输Trail数据。这个Server进程是OGG目标端的接收进程内部有一个Collector组件负责把网络流写成本地Trail文件然后Replicat读取。在架构图上通常会把Manager进程画在最上面然后用连线把所有进程串起来形成一个“源端Manager - 源端Extract - 本地Trail - 源端Data Pump - 网络 - 目标端Server/Collector - 本地Trail - 目标端Replicat”的链路。理解这条链路比背任何图都重要因为排查延迟、断点、数据异常时走的路径完全一样。网络方面源端目标端要能互通OGG指定的管理端口和数据端口。我见过不少配置没问题但启动失败的案例最后发现是安全组策略拦了端口。建议在做任何网络变更后先检查端口连通性再做OGG测试。2. 运行模式详解抓取模式与复制模式的选择OGG作为一款商业级同步工具它的运行模式设计相当关键。选对了模式性能和兼容性都能兼顾选错了后续维护会让你头大。这一块分两层看抓取模式也就是Extract从日志里拿数的方式复制模式也就是Replicat把数据应用进去的方式。2.1 经典抓取与传统复制经典抓取Classic Capture是OGG最传统的模式。Extract进程直接连接源数据库从重做日志或归档日志里解析数据变化。这种方式兼容性最广在很多老版本数据库上都能运行部署也简单不依赖数据库额外组件。但它的短板也很明显如果源库的日志量特别大Extract解析日志的负载会比较高而且每行数据的解析都是在OGG进程内部完成的一旦目标表结构复杂或者字段特别多抓取效率会受到限制。经典复制Classic Replicat同理是在目标端以普通SQL方式执行变化逐条提交。这种方式直观容易排查问题也适合大多数只需要单线程复制的场景。但性能上限低适合中小规模或对实时性要求不极端的环境。2.2 集成抓取与集成复制集成抓取Integrated Capture是在数据库层面做文章。OGG的Extract进程不再自己去逐条解析日志而是把日志挖掘的工作交给数据库内置的日志挖掘服务器比如Oracle的LogMinerOGG只负责接收数据库提供的变更结果。这个模式最大的优势是利用了数据库自身的日志挖掘能力对大事务、多字段表的处理比经典模式高效得多。特别是源库是Oracle 19c及以后版本时数据库对日志挖掘的优化已经很成熟集成抓取几乎成了事实标准。集成复制Integrated Replicat也是类似思路。它不是像经典复制那样用一条SQL逐条应用而是把变化数据交给目标数据库内部的应用协调器由数据库根据表依赖关系自动拆分并行应用。这个模式下大事务和宽表的复制速度会有质的提升。提示集成复制模式对数据库版本有要求不是所有版本都支持。搭建前务必查清楚目标数据库版本和OGG版本的兼容矩阵别等到配置完才发现数据库根本不支持。2.3 协调复制与并行复制应对高吞吐场景协调复制Coordinated Replicat解决的是经典复制单线程性能不够的问题。它把一个Replicat拆分成多个子线程每个子线程负责一组表通过一个协调器统一管理。这个模式适合表数量多但单个表事务并发不高的场景。并行复制Parallel Replicat比协调复制更进一步它基于表的主键或唯一键自动划分线程每个线程独立处理不同行范围的变化。这种模式在数据量极大、事务并发高的场景下表现最好也是OGG后期版本主推的方向。我接触过一个日增数据量几十GB、高峰期事务并发非常高的项目最初用的经典复制延迟飙到十几分钟Replicat进程像老牛拉车。后来切到并行复制延迟直接降到秒级。这里要提醒一句并行复制对目标库的硬件资源是有要求的CPU核心数不足时反而可能适得其反。所以选并行复制前先评估目标库的并发处理能力不要盲目追求新模式。2.4 如何根据场景选择运行模式这里给出我自己的选型逻辑大家可以参考源库版本老旧、目标库负载低、数据量不大经典抓取经典复制简单可靠排查容易。源库较新Oracle 12c以上或同级别、目标库性能尚可、需要处理较大事务集成抓取集成复制性能和负载表现均衡。表数量多、单表事务不大、希望提升整体吞吐协调复制。数据量极大、并发非常高、目标库有充足硬件资源并行复制或集成复制通常是实际项目里的最优解。跨不同数据库厂商同步比如Oracle到PostgreSQL一般只能走经典抓取经典复制因为集成模式很多特性只支持同构数据库。3. 分类与应用场景OGG在不同业务中的角色OGG的分类其实没有一个绝对标准。传统上大家会说“同构同步”“异构同步”“双向同步”这些但这是基于数据库类型的分类。真要选方案时更实用的是按业务场景来划分。不同场景下OGG部署方式和关注重点完全不同。3.1 同构数据库间的容灾与双活同构容灾是OGG用得最多的场景比如Oracle到Oracle、MySQL到MySQL。这种场景下OGG主要充当数据库层的数据复制工具确保目标库和源库数据保持同步。根据业务对RPO的要求可以选择实时同步或者准实时同步。容灾场景下还有双向同步的部署方式即两个节点互为主备任何一边的变更都会同步到另一边。这种模式需要特别小心冲突处理。虽然OGG提供了冲突检测和解决策略但生产环境中真正敢把双向同步放开写的不多。我见过不少设计上写着“双活”实际只开了单向另一边闲置原因就是冲突处理太复杂风险太高。3.2 异构数据库同步与数据中台建设数仓和数据中台建设带火了OGG的异构同步能力。比如源端是Oracle目标端是Kafka、大数据平台或者云数仓这种场景OGG也支持得很不错。数据从生产库实时流入消息队列再被下游消费整个链路能保持非常低的延迟。这类场景下OGG扮演的角色更像一个“实时数据管道”。这里要注意的是异构同步通常需要用到OGG的格式转换功能比如把数据库字段类型映射成目标端类型或者把行数据转换成消息格式。这个配置比较繁琐建议先把字段映射关系梳理清楚再动手配置否则同步上线后三天两头报转换错误够你喝一壶的。3.3 数据分发、集中汇总与迁移上云OGG的分发模式可以做到“一份数据源多个目标端”。比如源库一个目标端同时有几个不同用途的库或者平台。这种部署方式对源端压力有一定要求但好处是各个目标端互不影响任何一个目标端挂了也不会波及其他链路。集中汇总则相反多个源端的数据汇聚到一个目标库常见于集团型公司把各地分公司数据统一汇总到总部做分析。这种场景要注意不同源端的表结构、字符集和数据格式差异最好在建链前统一定义标准。零停机迁移是OGG另一个非常重要的应用。传统数据库迁移往往需要停机窗口但OGG可以在线抽取增量数据同时配合数据初始化工具完成全量同步最后在业务低峰期切换流量。整个过程几乎不影响业务连续性。我参与过好几次核心系统迁移都是靠OGG加数据初始化工具的组合拳完成的。这种方式比停机迁移稳妥得多风险也可控。3.4 按进程部署结构分类单向、双向、级联、广播除了按业务场景按进程部署结构也可以把OGG方案分成几类单向同步数据只从一个方向流向另一个方向最简单的部署方式。双向同步两边都能写数据相互同步复杂度高适合容灾双活。级联同步数据先到中间节点再从中间节点转发到最终目标。常见于网络不可直达或者需要集中汇聚的场景。广播同步一份数据从源端发往多个目标端。每个目标端独立运行自己的Replicat。集中汇总多个源端发到一个目标端源端各自有Extract和Data Pump目标端有多个Replicat对应不同链路或者用一个Replicat处理多源数据。这些结构在架构图上会看出明显差异但在实际物理部署上其实也就是那些进程参数怎么编排的问题。理清结构后后续扩容新链路或者调整同步关系都会顺手很多。4. 实操配置要点与常见问题排查前面把架构、模式、分类都说了一遍这节进入更实在的部分。OGG配置不难难的是配置完之后的调优和故障排查。我按自己多年的实操经验把最容易出错和容易忽略的地方列出来全是踩过的坑。4.1 核心参数配置参考与初始化步骤OGG配置的核心是几个参数文件源端的Extract参数、Data Pump参数目标端的Replicat参数还有两端的Manager参数。我先给出一套典型的最小配置参考以Oracle源端到Oracle目标端为例经典抓取模式。源端Manager参数示例GLOBALS文件里可以设置一些全局默认值PORT 7809 DYNAMICPORTLIST 7820-7840 AUTORESTART EXTRACT *, RETRIES 5, WAITMINUTES 3 PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPHOURS 24这里PORT是Manager监听端口DYNAMICPORTLIST是动态端口范围AUTORESTART让进程崩溃后自动拉起来PURGEOLDEXTRACTS自动清理旧的Trail文件。Extract参数示例EXTRACT EXT1 USERID ogg_user, PASSWORD ogg_password EXTTRAIL ./dirdat/et TABLE hr.employees; TABLE hr.departments;注意EXTTRAIL指定本地Trail文件路径和前缀。TABLE那几行就是需要同步的表支持通配符但我建议先把表明确列出来避免误同步不必要的对象。Data Pump参数示例EXTRACT DPE1 RMTHOST target_host, MGRPORT 7809 RMTTRAIL ./dirdat/rt PASSTHRU TABLE hr.employees; TABLE hr.departments;RMTHOST指目标端地址MGRPORT是目标端Manager端口RMTTRAIL是目标端接收Trail文件路径前缀。PASSTHRU表示Data Pump只做传输不检查字段映射性能好。目标端Replicat参数示例REPLICAT REP1 USERID ogg_user, PASSWORD ogg_password ASSUMETARGETDEFS DISCARDFILE ./dirrpt/REP1.dsc, PURGE MAP hr.employees, TARGET hr.employees; MAP hr.departments, TARGET hr.departments;ASSUMETARGETDEFS表示源端和目标端表结构一致不用额外传定义文件。如果不一致需要先定义目标表结构文件并传到源端这个步骤很多新手会漏。配置完成后在GGSCI命令行里依次执行这些命令# 源端 dblogin userid ogg_user, password ogg_password add extract ext1, tranlog, begin now add exttrail ./dirdat/et, extract ext1 add extract dpe1, exttrail ./dirdat/et add rmttrail ./dirdat/rt, extract dpe1 start manager start extract ext1 start extract dpe1 # 目标端 dblogin userid ogg_user, password ogg_password add replicat rep1, exttrail ./dirdat/rt, checkpointtable ogg_user.gg_checkpoint start manager start replicat rep1检查点表需要提前创建不创建的话Replicat也能跑但无法记录事务级别的检查点故障恢复时可能丢数据。所以建议正式环境务必创建检查点表。4.2 常见问题与排查思路速查OGG的日志文件在dirrpt目录下进程的报错和统计信息都在里面。排查问题的第一件事就是看这个目录下的日志通常是进程名加后缀的.log文件。我整理了一份常见问题速查表都是实操中反复出现的问题问题现象可能原因排查方向Extract进程启动失败数据库日志挖掘权限不足检查数据库用户是否有权限比如Oracle的DBA角色或者单独权限Extract不断重启源端日志被清理检查数据库日志保留时间需要保证OGG能追上日志生成速度源端Trail文件磁盘占满Trail文件清理不及时检查PURGEOLDEXTRACTS参数手动清理旧的Trail文件Replicat进程挂起目标端死锁或主键冲突查看Replicat日志中具体SQL错误排查目标表约束同步数据出现乱码字符集设置不一致检查源端和目标端数据库字符集两边要匹配网络传输慢导致延迟带宽不足或网络抖动检查网络链路质量考虑压缩传输参数表结构变更后报错源端表定义和OGG缓存不一致需要重新抓取表定义或者重启对应Extract进程大事务导致Replicat积压目标端单线程应用太慢考虑改成集成复制或并行复制这中间最容易忽略的就是字符集问题。很多次同步链路配得好好的跑着跑着出现乱码查了一圈数据库、应用、网络都没问题最后发现是OGG自身进程的字符集设置和数据库不一致。在配置OGG时一定要把源端、目标端数据库字符集确认清楚必要时在OGG参数文件里显式设置字符集。4.3 监控手段与性能调优实践经验OGG自带了一些监控命令和视图比如GGSCI里的STATS命令可以查看进程处理的行数INFO命令可以查看进程运行状态。另外在数据库里也可以查询OGG相关的数据字典视图获取复制状态信息。实际运维中我更推荐把OGG的进程状态、延迟时间、Trail文件写入速度等关键指标采集到监控平台里做成Dashboard。这样的话进程异常、延迟突增这些问题不用等人登录服务器才发现。常用的采集脚本可以基于GGSCI的INFO ALL命令输出去解析逻辑不复杂十几二十行脚本就能满足基本需求。性能调优方面我的经验按优先级排是这样的先保证网络链路通畅带宽够用这是基础。再调整OGG自身的参数比如大事务的缓存大小、Trail文件的写入缓冲。接着优化数据库端的日志归档频率归档太频繁会加大Extract抓取压力。最后才考虑调整表结构、索引这些偏应用层面的东西一般轮不到这一步。还有一个调优细节很多人不知道Extract抓取时如果开启OGG的压缩传输功能数据在网络上传输的体积会明显减小对跨机房、跨地域的同步场景尤其有效。代价是多消耗一点CPU在现代服务器上这点CPU几乎可以忽略。我自己的项目里只要网络链路是跨地域的我都会开启压缩。4.4 双活与多活架构下的注意事项如果你负责的是双活或灾备切换类项目有几个细节必须特别留意。首先是初始化同步与增量同步的衔接。全量初始化期间源库还在持续写入如果不做好衔接初始化完成后会发现缺了一段数据。常见的解决思路是先停应用、做全量初始化、再开启增量同步或者用数据库自带的全量备份配合归档日志补齐。OGG本身也提供了初始化工具的支持可以做到不停机完成全量加载但步骤较多。其次是切换演练。OGG架构设计得再好不演练也白搭。我见过不少项目容灾架构搭得很完善真到切换演练时才发现Replicat进程起不来或者切换后数据有差异。切换预案一定要包含OGG进程的启停顺序、检查点确认、回切流程而且要定期演练。别嫌麻烦这个钱和时间不能省。再一个就是进程命名规范。多套OGG环境、多条链路混杂时如果进程名随意起维护起来会非常混乱。我习惯用一套统一的命名规则比如按“链路类型_方向_序号”来命名例如订单同步的源端抽取进程叫EXT_ORDER01目标端复制进程叫REP_ORDER01。排查问题时一眼就能知道这个进程属于哪条链路效率会高很多。我还建议把每条链路的参数文件、表映射关系、初始化时间、检查点情况统一记录在一份文档或者资产管理工具里。没有文档的OGG环境等维护的人换了一波之后基本就是一座只能靠猜的迷宫别问我怎么知道的。5. 架构规划前必须想清楚的几个问题说实话OGG本身并不难难的是开始之前把需求想清楚。我接过好几个“救火”的项目都是前序团队没想清楚就开始搭建后面数据对不上、进程频繁挂才找到我们这类人来兜底。第一个要想清楚的是同步粒度。是同步整库还是同步部分表是所有列都同步还是只同步部分敏感字段外的列粒度越粗配置越简单但资源消耗和风险也越大。粒度太细后续每次表结构变更都要调整OGG配置维护成本也高。第二个要想清楚的是延迟容忍度。业务到底允许多少秒的延迟这直接决定选型。允许几十秒延迟常规模式就够要求秒级同步那就得考虑集成模式加并行复制同时网络链路和数据库参数都要相应调整。第三个要想清楚的是数据一致性要求。是允许最终一致就行还是任何时间点都要求绝对一致前者常见于报表、分析场景后者常见于交易系统、订单系统。这两个场景下OGG的检查点配置、冲突处理策略、切换流程设计差别非常大。第四个要想清楚的是故障切换后的回切方案。数据同步只是手段业务连续性才是目的。很多团队把注意力全放在同步链路上忽略了切换和回切流程。等到真正发生故障时才发现没有一套完整的指挥方案。这些问题在架构选型和部署规划阶段就该有明确的答案。带着答案去配置OGG跟走一步看一步地配置完全是两种体验。6. 我的实际体会与建议OGG用久了我最大的体会是它是一个可靠性很高、能力很强的工具但对使用者的要求并不低。它不像某些同步软件那样开箱即用需要你对数据库日志机制、网络通信、进程管理都有一定理解才能把它真正用好。有几个亲身经历的小建议想分享给正在用或者准备用OGG的朋友。生产环境上线前一定做一轮完整的故障演练重点验证进程崩溃自动拉起、宕机重启后断点续传这两个环节最容易出幺蛾子。参数文件里能用PURGEOLDEXTRACTS自动清理Trail文件的就不要手工定期去删手工删一旦删了还在使用的文件整条链路就断了。还有一点团队里至少要有一个同事对OGG的进程机制和日志体系非常熟悉这个工具出问题时大部分信息都藏在日志和统计输出里看不懂日志就没法做判断。最后再补一句架构图、模式和分类这些概念不是拿来背的是拿来用的。下次你的OGG链路出了延迟甚至数据不一致的问题时顺着“Extract抓取 - Trail传输 - Replicat应用”这条线再对应到具体的运行模式和部署分类基本就能快速锁死问题范围。希望这篇东西能给你带来一点帮助少走几步我当年走过的弯路。