使用 Direct Initial Load 初始化 GoldenGate 同步数据

作者简介

桑凯

现任职于云和恩墨,具有多年 Oracle 数据库企业级运维经验,擅长容灾项目解决方案设计,作为项目经理负责多个基于 Oracle DataGuard 和 GoldenGate 的双中心的数据库容灾项目实施,积累了丰富的数据库应用级容灾整体架构的设计经验。

本文由恩墨大讲堂148期线上分享整理而成。

1

背景

GoldenGate 的 Direct Initial load 常用于用于异构环境的初始化数据,也可以用于某些生产环境到测试环境的数据同步。初始化的同步过程一般只需要在 GoldenGate 上配置即可无需 DBA 进行参与,使用 Direct Initial load 处理某些数据表不一致后重新同步也非常方便,仅需要将想要同步表配置如参数启动进程即可完成表数据库的同步。

2

GoldenGate (OGG) 初始化数据的种类

2.1. Extract 和 Replicat 进程的两种工作模式

  • Initial Load — 初始数据的加载( special run、 batch run) 一般用于异构环境下的数据加载,初始化过程文件可以落地也可以选择不落地,抽取的方式就是将需要初始化的数据查询出来保存成 OGG 或者目标数据库可以识别的格式。
  • Change Data Capture (CDC) — 增量数据的抽取 配合初始化数据库,完成整个初始化中增量数据的同步。

2.2. initial load 的四种工作模式

目标端数据落地

  • File to replicat (Extract writes to a file that Replicat applies)

该方式利用 OGG 的 Initial Load Extract 进程将需要抽取的数据先进行解析生成 OGG 的 Trail 文件,然后将解析生成的文件传输到目标端主机的 OGG 指定的目录里,再由 OGG 的 Replicat 进行解析插入到目标数据库的对应表里。

  • File to database utility (Extract writes to a file formatted for a DB bulk loadutility)

该方式源端进程解析数据库数据,通过 FORMATASCII 参数控制抽取最终生成目标端数据库可以识别使用的 ASCII 文件,也就是文本文件。目标端使用自己数据库提供的数据加载程序进行数据加载完成初始数据,这种方式加载数据一般应用于异构的环境,比如 Oracle 到 IBM 数据库之间加载,Oracle 到 SQL Server 间。

目标端数据不落地

  • Direct Load (Extract sends data directly to Replicat)

采用不落地的方式 Initial load extract 和 Initial load replicat 进程之间直接进行传输数据,在目标端没有 collertor 进程负责收集源端发送的 tail 文件。而目标端落地方式当 mgr 进程启动的时候会自动启动一个 collector 进程进行接收源端 pump 进程传输过来的 tail 文件。

  • Direct load 的配置方式如下: ADD EXTRACT <name>, SOURCEISTABLE Extract parameters: RMTTASK REPLICAT, GROUP <name> ADD REPLICAT <name>, SPECIALRUN 两边的 group name 要对应上
  • Direct bulk load (Replicat uses Oracle SQL*Loader API)

这种方式仅仅支持 Oracle 间的同步,同样也不会落地文件 Initial load replicat 进程直接调用 SQL*LOADER API进行数据入库,复制端使用 bulkload 参数。

2.3. 初始化方式适用场景总结

3

实验步骤

Direct Initial load 操作步骤较多,文章中仅对关键步骤进行讲解说明详细操作步骤可以通过以下链接下载课程对应视频:https://share.weiyun.com/f9e06940c89cb00785c7514a3f326d10

3.1 两端同时创建表

CREATE TABLE sky.t1 (id NUMBER); --创建主键注意两边都要创建 alter table sky.t1 add primarykey(id); --增加附加日志 ggsic dblogin userid goldengate,passwordgoldengate; add trandata sky.*

3.2 模拟数据插入脚本

SQLPLUS 下执行如下语句模拟不断执行数据插入

begin for i in 90000..10000000 loop insert into sky.t1 values(i); commit; if mod(i,100) = 0 then dbms_lock.sleep(3); end if; end loop; end;

3.3 源端进程配置

  • 增加源端 CDC 进程

ADD EXTRACT cdcext1, TRANLOG, BEGIN NOW ADD RMTTRAIL ./dirdat/zz, EXTRACT cdcext1

  • 增加源端 CDC 进程配置文件

EXTRACT cdcext1 SETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) USERID goldengate, PASSWORD goldengate RMTHOST 192.168.56.120, MGRPORT 7809 RMTTRAIL ./dirdat/zz TABLE sky.t1

  • 增加源端的 INIT 进程

add extract initext,source is table

  • 增加源端 INIT 进程配置文件

extract initext userid goldengate, password goldengate rmthost 192.168.56.120, mgrport 7809 rmttask replicat,group initrep table sky.t1;

3.4 目标端进程配置

  • 增加目标端 CDC 进程

add replicat cdcrep1, exttrail./dirdat/zz nodbcheckpoint

  • 增加目标端 CDC 进程配置文件

REPLICAT cdcrep1 HANDLECOLLISIONS ASSUMETARGETDEFS USERID goldengate, PASSWORDgoldengate MAP sky.t1, TARGET sky.t1;

注意进程中关键的侧参数 HANDLECOLLISIONS。

  • 增加目标端 INIT 进程

add replicat initrep,specialrun

  • 增加目标端 INIT 进程配置文件

replicat initrep ASSUMETARGETDEFS DISCARDFILE ./dirrpt/repint1.dsc, APPEND, MEGABYTES 100 userid goldengate, password goldengate MAP sky.t1, TARGET sky.t1;

3.5 同步过程

  • 源端数据库执行数据生成 SQL 语句

begin for i in90000..10000000 loop insertinto sky.t1 values(i); commit; ifmod(i,100) = 0 then dbms_lock.sleep(3); end if; end loop; end; /

  • 源端 OGG 启动 CDC 捕获进程

start extract cdcext1

  • 源端启动 initialload 初始化进程

start extract initext

  • 等待初始环境完成自动关闭后,目标端启动 CDC 复制进

start replicat cdcrep1

  • 等待 CDC 复制进程执行的时间点超过初始化进程结束的时间点后,关闭复制端CDC 进程取消 HANDLECOLLISIONS 参数

send replicat cdcrep1 nohandlecollisions

4. Oracle To Oracle 初始化的关键注意点

  • 确保能成功打开库级和表级附加日志的
  • 考虑是否配置 DDL 和序列的复制
  • 初始化过程中源库没有 DDL 操作
  • 如果用数据导入导出进行在线初始化,确保回滚段不会失效
  • 目标库不能有引起数据变化的因素(触发器、 job、级联删除约束)
  • Scheduler:如果是导入导出进行初始化,源端中的非系统 scheduler 必须 disable,否则这些 Scheduler 会在导入后立刻自动运行;如果使用 RMAN 初始化数据,可以在目标重构过程中(open 之前)在目标上要 disable,可以在 upgrade 模式下 disable)
  • 源端开始备份或者 EXP 的时候,确保这时 DB 中没有 start_time 是在启动 extract 进程之前的事务。

执行目标初始化过程中,必须保证做源端数据导出时,当时所有数据库中交易是在 extract 启动检查点后才开始,否则这些交易在 extract 启动检查点前的部分数据将会丢失。

可以通过查看 v$transaction 的 min(START_TIME) 应当大于 extract 开始时间来验证在取 SCN 号时,先执行:select start_time from gv$transaction where to_date(start_time, ‘yyyy-mm-ddhh24:mi:ss’)<to_date(‘extract 启动时间','yyyy-mm-dd hh24:mi:ss');通过该语句,如果找到比 extract 启动时间早的事务需要等这些事务结束,才可以开始执行备份。

4

总结

本课程主要介绍了 Direct Initial load 在生产环境快速同步数据表有很高的效率,配合 CDC 进程完成一致性的初始化,我们可以快速的在测试环境构建,数据装载测试等各种环境很好的使用该功能。

另外在 OGG 初始化过程中注意文中提到的关键点,能够在有效杜绝在初始化完成后 OGG 同步过程的数据不一致问题。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2018-03-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

备库查询导致的ORA-01110错误及修复(r8笔记第67天)

最近帮助业务部门解决了一个技术问题,因为发现有数据问题需要对存在问题的数据做分析。当然一个难点就是把数据给筛选出来,当我看到他们提供的语句,在备 库做了简单的数...

3297
来自专栏数据和云

时过境迁:Oracle跨平台迁移之XTTS方案与实践

作者简介 ? 谢金融 云和恩墨东区交付部 Oracle 工程师,多年来从事 Oracle 第三方服务,曾服务过金融、制造业、物流、政府等许多行业的客户,精通数据...

43610
来自专栏杨建荣的学习笔记

MySQL配置TokuDB的简单总结

MySQL中的存储引擎是插件式的,当然主流默认的是InnoDB,而且InnoDB存储引擎会随着MySQL官方的搭理投入会越来越火。有了MGR,还有InnoDB ...

4046
来自专栏性能与架构

InnoDB 日志文件大小设为多大合适?

InnoDB 日志文件的作用 Innodb 数据表崩溃后,再次启动时,MySQL会扫描日志文件,看哪些记录不在表空间中,对其进行 redo 操作,从而完成数据恢...

43711
来自专栏杨建荣的学习笔记

使用shell生成orabbix自动化配置脚本(r6笔记第53天)

在使用Orabbix监控Oracle的时候,本身和zaabix agent最大的不同便是使用Orabbix不需要对每个数据库实例都安装单独的agent,而是一个...

2938
来自专栏数据和云

当SQL Server爱上Linux:AVAILABILITY_MODE 和 DataGuard 的实践差距

作者 | 张乐奕:Oracle ACE 总监,ACOUG (中国 Oracle 用户组)联合发起人。Oracle 数据库高可用解决方案与 Exadata 一体...

672
来自专栏Jackson0714

【T-SQL性能优化】01.TempDB的使用和性能问题

1462
来自专栏逸鹏说道

1.并发编程~先导篇(上)

并发 :一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

833
来自专栏程序猿

面试问题之mysql修改哪些配置文件可以进行优化?

配置文件中具体修改的内容是什么呢?要是面试官问你,你该怎么回答?你想下,你坐在一间屋子里。 服务器的mysql性能优化,有两个大...

2717
来自专栏杨建荣的学习笔记

oracle工具集初探(r4笔记第8天)

今天无意中看了下ORACLE_HOME/bin下面的东西,发现里面还是存在不少的东西。除了常用的sqlplus,tnsping,rman,exp/expdp,i...

2534

扫码关注云+社区