designs\project\database-OGG

简介

OGG 是一个数据库 Replication 工具

如果您的来源库和目标仅是Oracle数据库,使用Data Guard就可以了,如果我的源端是Oracle,而目标是任何其他数据库之一,最受欢迎且受支持的工具,最可行的方案是OGG(OGG 还支持从 mysql 同步到 sqlserver 之类)

OGG 关键特性

  • 实时性
    • 主服务器和从服务器之间的同步,几乎是实时进行的(0.1秒级别,调优后)
  • 异构系统数据库同步
  • 保证事物的完整性
    • 这意味着事物,从源端到目标端的顺序是不会改变的

OGG 用途

  • 构建高可用性系统
    • 实时的同步,当源数据库宕机时,应用程序可以仍然连接到副本集数据库并继续
  • 热更,零停机时间的版本升级或迁移
    • 源数据库升级时,让应用程序迁移到副本集上
  • 分离应用,提供单独的报送服务器
    • 我们将源端数据库 replication 到我们的目标数据库,在目标端,我们将配置,目标报送程序
    • 源端中的资源全部很好地用于确保 OLTP 程序的高效执行
  • 数据库产品集成
    • 我们一般喜欢建立一个数据仓库,从所有不同的位置提取数据,并将来源数据整合,进入数据仓库
  • 它还提供转换数据的能力
    • 您可以已编程的方式,使用它还提供可扩展的解决方案,通过它可以完成转换,非常快且经过优化

  • 博主个人觉得: OGG 是一个 replication 中间件,但还算不上分布式中间件。最近 Apache 开源了分布式数据库 shardingsphere(又要学 (╬▔皿▔)╯)
    • OGG 支持完全冗余,支持基于 SQL 的部分冗余
      • 不支持分布式事务
      • 不支持并行查询
    • OGG 的检查点机制保证 Replication 的有序性
      • OGG 应该不支持分布式的并发,因为我没看到过有时钟同步!
    • OGG 提供可伸缩性 Scalibility
    • OGG 支持故障恢复 Fault tolerance
      • 非分布式架构,无协调器的概念
    • OGG 内部实现对用户透明 Transparency
  • 博主个人觉得:想要将 OGG 组分布式系统,可以将 OGG 的数据在一个 Memocache 或者 MongoDB 中集中转发,这样,共享内存的分布式数据库的特性就基本有了。博主想想而已。老板要是听说我想造个轮子,他该吐血了 ⊙﹏⊙∥
    • 安全可靠?宕了就停了
    • 冗余数据的一致性?有的
    • 并发事务支持?找 MongoDB
    • 容错性?有的

OGG 的几种架构方式

  • 单向复制
应用
数据库
Report
目标库
OLAP
源库
  • 双向复制
应用
数据库
App
目标库
源库
  • 广播
应用
数据库
业务系统
业务库
副本集
报送库
数据交换库
  • 数据集成
应用
数据库
仓储
仓储库
销售
销售库
制造
制造库
数据仓库
  • 级联
应用
数据库
业务
业务库
异常业务库
异常报送库

OGG 工作原理

概览

我们都知道 OGG 是基于日志更改的捕获

源库
OGG
目标库
Replicate
Extract
Pump
Extract
与源中事务发生顺序一致
初始/批量同步
源库
高可读性-数据文件
恢复-日志文件
事务日志
目标库
trail文件
目录

扩展性

trail 文件 可以是

  • Flat File —— 呃,不认识
  • Adapters —— 用户自定义的适配器
  • DB Load Utility Format —— 目标端数据库能识别的规格文件

用户可以自由的开发扩展应用

检查点

OGG 通过类似逻辑时钟同步(内部有序CSN号/事务号)的机制,提升实时冗余 Replication 的容错性

源库
Replicate
pump
Extract
目标库
同步写入
同步写入
已接收
已入库
事务的顺序与在源中发生的顺序一致
恢复-日志文件
事务日志
CSN
检查点持久化
检查点文件
检查点表
pump1
远程trail文件
pump2...
目标库
trail文件
生成检查点-提交序列号CSN

OGG 的配置

  • 环境准备
  • 配置抽取进程
  • 初始同步
  • 配置复制进程

OGG环境搭建

数据库端配置
OGG 端配置
开启归档日志
日志额外记录ID
定义需要同步的表
为OGG创建用户
授权
配置Manager
数据库端配置
注意当需要配置多个数据库的时候,请把窗口排齐整,确保我们正在连接到正确的数据库,不要问我为啥知道
  • 在源端和目标端创建一个数据库用户

    -- 创建用户这种事情 …… 请使用想象力解决
    
    • OGG 从Redo日志文件中读取信息,而 redo 文件仅具有有关对象ID的信息,所以OGG软件需要访问数据库

      • 可以直接实用 as sysdba 的角色授权
      • 不过 Oracle 的 DBA 角色数量好像最多 5 个还是 6 个吧!还是老老实实配置权限吧
      grant unlimited tablespace to ogg;
      grant create session, alter session to ogg;
      grant alter system to ogg;
      grant select any dictionary to ogg;
      grant flashback any table to ogg;
      grant select any table, insert any table, update any table, delete any table, drop any table to ogg;
      grant create table, create sequence to ogg;
      grant select on dba_clusters to ogg;
      grant select on v_$database to ogg;
      grant select on sys.logmnr_buildlog to ogg;
      grant select any transaction to ogg;
      grant lock any table to ogg;
      grant ggs_ggsuser_role to ogg;
      grant execute on dbms_flashback to ogg;
      grant execute on dbms_logmnr_d to ogg;
      grant execute on dbms_capture_adm to ogg;
      grant execute on dbms_streams to ogg;
      grant execute on utl_file to ogg;
      exec dbms_streams_auth.grant_admin_privilege(‘ogg’); 
      
    • OGG 必须在目标数据库执行 DML,这个用户拥有在目标端数据库执行 DML 权限

  • 开启supplemental日志,并立即切换为 supplemental 日志模式

    • 启用数据库级别的 supplemental 日志
      • a) 查看归档日志使用情况
        select * from v$flash_recovery_area_usage; --查看空间占用率,如果 ARCHIVED LOG 超过90%,Oracle随时有宕机的危险
        select * from v$recovery_file_dest; --查看归档日志大小及使用情况
        select group#, bytes, status from v$log; --查看现有日志
        select sequence#,first_time from v$loghist;--列出所有归档redo日志文件的顺序和产生的时间
        select * from v$archived_log;  --查看v$archive_log
        select count(*) from v$archived_log where archived='YES' and deleted='NO'; --查看所有归档,未删除的归档日志
        
        b) 修改闪回区大小
        show parameter db_recovery
        -- 首先是关闭数据库:以SYS身份链接到oracle,执行
        shutdown immediate;
        -- 启动数据库到mount状态:
        startup mount
        -- 查看回闪恢复区的大小和存放目标:
        show parameter db_recovery_file_dest
        -- 修改回闪恢复区的大小
        alter system set db_recovery_file_dest_size = 4G
        -- (缺省是2G,可以根据实际情况调整大小)
        -- 最后打开数据库: 
        alter database open;
        
        • c) 方法二:重定向归档日志的位置
          生产环境建议将归档目录和oracle产品的安装目录分开。最后的目录名称需要为archive_log!
        alter system set log_archive_dest_1='location=/oralog/NC65/archivelog' scope=spfile;
        
        • d) 实际上从Oracle 10g开始,可以生成多份一样的日志,保存多个位置,以防不测
        alter system set log_archive_dest_2='location=/data/oracle/log2/archive_log';
        
        • e) 开启归档日志
        shutdown immediate;
        startup mount
        alter database archivelog;
        alter database open;
        archive log list;
        
        alter database force logging;
        alter database add supplemental log data
        -- 如果启用DDL 支持,必须关闭recycle bin
        alter system set recyclebin=offscope=spfile;
        alter system switch logfile;
        -- 切换一下日志,最好还能重启一下
        
OGG 端配置
  • 番外
    • a) 使用CMD定位到OGG安装目录,输入GGSCI进入OGG配置终端
    • b) Windows2012服务器上报错,运行GGSCI找不到MSVCP100
      • MSVCP100.dll = Visual C++ 2010 Runtime
    • c) Windows2012服务器上报错,运行GGSCI找不到MSVCR100
      • MSVCR100.dll = Visual C++ 2010 Runtime
    • d) Windows2012服务器上报错,运行GGSCI找不到MSVCR120
      • MSVCR120.dll = Visual C++ 2013 Runtime
    • e) 其他版本依次类推,记得去微软官网下 www.microsoft.com 别装上其他东西了
  • 源端将需要同步的表加入trandata。
    • 默认的重做日志只记录 rowId,所以一个额外的主键信息也应该被记录
    • 重做日志对加入 trandata 的表额外记录主键
      -- 运行GGSCI,进入OGG管理控制台
      dblogin userid admin password admin
      add trandata xxxx.*
      
  • 配置源端和目标端的 manager 进程
    • manager 是 OGG 的主线程管理全局的东西
    • 建议编辑全局配置文件,在全局文件中指定使用检查点表的表名
    • 全局配置文件应该存在于安装在的默认位置,OGG根目录
  • 如果是异构环境,数据库类型不一致
    • 在源端中定义数据源格式
    • 在目标端定义数据格式
    • 这可以通过使用一个称为 defgen 的实用程序,通过它可以显示的指定映射
    • Manager 配置方法参见:designs\project\database-windows下OGG的部署

抽取进程配置

  • OGG 的基于日志的捕获对于源系统的性能影响很小
  • 启用 pump
    • 如果目标端是再网络的另一端,则我们可以启用单独的 pump 进程来将本地 trail 发布到远程 trail
    • 使用 pump 的另一个好处是,如果网络断了抽取进程不会受到影响,OGG继续运行
    • 如果使用一个 pump 来发送给多个目标,如果其中一个网络掉线,则 pump 会停止
    • 所以一般我们为一个 trail 启用多个独立的 pump 来 pump 到不同目的地,且多个 pump 的检查点相互独立
OGG 源端配置
本地复制
Extract抽取进程
远程trail
启动
本地trail
Pump
无 Pump 抽取进程示栗
add extract extwest, tranlog, begin now
edit param extwest
EXTRACT extwest
USERID admin,PASSWORD oracle
RMTHOST 127.0.0.1, MGRPORT 7809 
RMTTRAIL .\dirdat\ew
dynamicresolution
gettruncates
TABLE admin.*;
STATOPETIONS RESETREPORTSTAS
REPORT AT 00:01
REPORTROLLOVER AT 00:01
REPORTCOUNT EVERY 60 SECONDS, RATE
-- 
add exttrail ./dirdat/ew, extract extwest, megabytes 50
有 Pump 抽取进程示栗
edit param extwest
EXTRACT extwest
EXTRAIL ./dirdat/ew
USERID gguser, PASSWORD gguser
TABLE west.*;
STATOPETIONS RESETREPORTSTAS
REPORT AT 00:01
REPORTROLLOVER AT 00:01
REPORTCOUNT EVERY 60 SECONDS, RATE
add extract extwest, tranlog, begin now
add exttrail ./dirdata/ew, extract extwest, megabytes 50
-- 创建 pump
edit param pwest
EXTRACT pwest
RMTHOST 192.168.1.110, MGRPORT 15001, COMPRESS
RMTTRAIL ./dirdat/pe
PASSTHRU
TABLE west.*;
add extract pwest, extrailsource ./dirdata/ew
add rmttrail ./dirdata/pe, extract pwest, megabytes 50
start extract extwest
start extract pwest

初始同步

对比手动备份恢复,OGG 执行初始同步之后,不管源代码发生了什么变化,都可以被捕获并同步到目标中
OGG 初始同步
使用抽取进程从源端中读取数据
写入trail文件
目标端
普通SQL
oracle-sqlLoader
db2-BCP
SQLServer-SSIS
directBulkLoad

再执行初始同步之前,请确保从源端的抽取进程已经是开启状态,以防初始同步期间的数据丢失

  • 初始同步时的冲突解决 collisior
    • 由于初始同步和数据同步同时运行,我们会遇到许多的冲突,我们可以尝试停止同步,如果实在没有办法停止源端事务,则考虑处理初始同步持续期间的冲突
      • 记录重复:在 Replciate 中使用 SEND HANDLECOLLISIONS 来解决问题
      • 找不到记录:(数据被用户删除了)在 Replciate 中添加 SEND NOHANDLECOLLISIONS 来解决问题

复制进程配置

DBLOGIN USERID ogg, PASSWORD ogg
ADD CHECKPOINTTABLE ogg.checkpoint
edit param rep1
REPLICAT rep1
USERID root,PASSWORD oracle
ASSUMETARGETDEFS
REPERROR default,discard
DISCARDFILE .\repsz.dsc,append,megabytes 100 // 请将目录更换成自己的,
MAP admin.*, TARGET root.*;
add replicat rep1 exttrail .\dirdat\pe, checkpointtable ogg.checkpoint

并行优化

如果数据之间没有依赖(通过 range 函数,或者分表),可以开启多个抽取进程,进行优化

双向复制的问题

  • loop 循环复制:使用 Exclude User 来避免。A 传递给 B ,B 再传回给 A
  • conflicts 冲突:如果两边的用户同一时间使用同一行记录的时候。
    • 使得同步足够的快
    • 通过数据分片来避免两边同时处理同一记录
    • 手动处理冲突监测并解决冲突
  • 序列不能同步
    • 可以在以边时用偶数序列,另一边使用奇数序列
  • 禁用 Truncate

文档翻译?CSDN 审核中啊

猜你喜欢

转载自blog.csdn.net/u012296499/article/details/105640960
ogg