目录
简介
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 支持完全冗余,支持基于 SQL 的部分冗余
- 博主个人觉得:想要将 OGG 组分布式系统,可以将 OGG 的数据在一个 Memocache 或者 MongoDB 中集中转发,这样,共享内存的分布式数据库的特性就基本有了。博主想想而已。老板要是听说我想造个轮子,他该吐血了 ⊙﹏⊙∥
- 安全可靠?宕了就停了
- 冗余数据的一致性?有的
- 并发事务支持?找 MongoDB
- 容错性?有的
OGG 的几种架构方式
- 单向复制
- 双向复制
- 广播
- 数据集成
- 级联
OGG 工作原理
概览
我们都知道 OGG 是基于日志更改的捕获
扩展性
trail 文件
可以是
- Flat File —— 呃,不认识
- Adapters —— 用户自定义的适配器
- DB Load Utility Format —— 目标端数据库能识别的规格文件
用户可以自由的开发扩展应用
检查点
OGG 通过类似逻辑时钟同步(内部有序CSN号/事务号)的机制,提升实时冗余 Replication 的容错性
OGG 的配置
- 环境准备
- 配置抽取进程
- 初始同步
- 配置复制进程
OGG环境搭建
数据库端配置
注意当需要配置多个数据库的时候,请把窗口排齐整,确保我们正在连接到正确的数据库,不要问我为啥知道
-
在源端和目标端创建一个数据库用户
-- 创建用户这种事情 …… 请使用想象力解决
-
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) 查看归档日志使用情况
b) 修改闪回区大小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'; --查看所有归档,未删除的归档日志
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; -- 切换一下日志,最好还能重启一下
- c) 方法二:重定向归档日志的位置
- a) 查看归档日志使用情况
- 启用数据库级别的 supplemental 日志
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 的检查点相互独立
无 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 执行初始同步之后,不管源代码发生了什么变化,都可以被捕获并同步到目标中
再执行初始同步之前,请确保从源端的抽取进程已经是开启状态,以防初始同步期间的数据丢失
- 初始同步时的冲突解决 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 审核中啊