Oracle GoldenGate (简称 OGG)使在不同关系型数据库之间能进行实时同步复制可谓非常强大。
OGG 支持 oracle、sql server、MysqL、db2、Sybase 等关系数据库直接的数据复制。OGG 这种灵活特性能够支持多种业务场景。如下图:
OGG 实现原理如图:
OGG 有几个进程使数据同步或转移:Extract,Data pump,Replicat,Trails or extract files,Checkpoints,Manager,Collector
(更多参考官方文档:Introduction to Oracle GoldenGate)
以下进行一个小测试:Windows 平台利用 GoldenGate 同步 sqlServer 到 ORACLE
OGG 同步sql server 原理: 启用Extract 进程后,sql server 中数据库及表将启用 变更数据捕获(CDC),并读取相关日志中表的日志信息。本例中使用的是 pump 进程传输同步文件记录,这样Extract进程读取出来的记录都保存到文件夹dirdat 中,保证即使中断也不会影响到数据库截断。(否则:Oracle GoldenGate For SQL Server 未提交事务导致MSSQL日志不截断)
服务器信息:
源端: 192.168.1.123服务器: windows server 2008 x64数据库: MSsql 2008 R2
目标端: 192.168.1.89服务器: windows server 2008 x64数据库: ORACLE oracle 11g.2.0.4.0
GoldenGate下载地址:
http://www.oracle.com/technetwork/cn/middleware/goldengate/downloads/index.html
本次测试下载的两个 OGG :
ggs_121210_Windows_x64_MSsql_64bit.zip (解压可用)
适用于 Windows(64 位)上 sql Server 的 Oracle GoldenGate 12.1.2.1.0 版 (71 MB)
121210_ggs_Windows_x64_shiphome.zip (安装可用)
适用于 Windows(64 位)上 Oracle 的 Oracle GoldenGate 12.1.2.1.0 版 (239 MB)
sql SERVER 源端重要条件:
ORACLE 目标端重要条件:
- 启用归档模式
- 启用GoldenGate复制
- 创建用于OGG账户并授予相关权限
/*####################################################################
## sql Server 源端配置
#####################################################################*/
- --创建测试数据
- use master
- go
- CREATE DATABASE Demo
- go
- use Demo
- go
- CREATE TABLE [dbo].[tab](
- [id] [int] NOT NULL identity(1,1) primary key,[birthDate] [datetime] NULL,[age] [int] NULL,[name] [varchar](50) NULL
- ) ON [PRIMARY]
- GO
- CREATE TABLE [dbo].[tab2](
- [id] [int] NOT NULL identity(1,[name] [varchar](50) NULL
- ) ON [PRIMARY]
- GO
- INSERT INTO [dbo].[tab] VALUES(GETDATE()+RAND(),99,'kk')
- GO 10
- INSERT INTO [dbo].[tab2] VALUES(GETDATE()+RAND(),'kk')
- GO 10
- -- 关闭数据库 'trunc. log on chkpt',
- use master
- go
- EXEC sp_dboption 'Demo','trunc. log on chkpt','false'
- go
- -- 数据库须为完整回复(FULL)模式
- use master
- go
- alter database Demo set recovery full
- go
- -- 创建数据库账号
- USE [master]
- GO
- CREATE LOGIN [ogguser] WITH PASSWORD=N'oggpsw',DEFAULT_DATABASE=[master],CHECK_EXPIRATION=OFF,CHECK_POLICY=OFF
- GO
- EXEC master..sp_addsrvrolemember @loginame = N'ogguser',@rolename = N'sysadmin'
- GO
- -- 创建ODBC 数据源 (开始-管理工具-数据源odbc)
- /*
- 数据源名称:Demo_ODBC
- 数据库账号:ogguser
- 数据库密码:oggpsw
- */
- -- 查看数据库或表是否启用cdc (不需要启动,配置完成自动启动)
- SELECT name,is_cdc_enabled FROM sys.databases WHERE is_cdc_enabled = 1
- SELECT name,is_tracked_by_cdc FROM Demo.sys.tables WHERE is_tracked_by_cdc = 1
- GO
- -- 首次备份数据库(配置完成前不要截断日志)
- BACKUP DATABASE [Demo] TO DISK= N'D:\MSsql\Demo.bak' WITH CHECKSUM,COMPRESSION
- GO
/*####################################################################
## ORACLE 目标端配置
#####################################################################*/
- -- 查看是否归档
- sql> archive log list;
- 数据库日志模式 非存档模式
- 自动存档 禁用
- 存档终点 USE_DB_RECOVERY_FILE_DEST
- 最早的联机日志序列 8
- 当前日志序列 10
- -- 设置归档模式
- sql> shutdown immediate;
- sql> startup mount;
- sql> alter database archivelog;
- sql> alter database open;
- -- 查看日志附加属性
- sql> select supplemental_log_data_min,force_logging from v$database;
- -- 设置日志附加属性
- sql> alter database add supplemental log data;
- sql> alter database force logging;
- sql> alter system switch logfile;
- -- 启用 goldengate
- sql> alter system set enable_goldengate_replication = true scope=both;
- -- 启用账号 scott (本测试以 scott 为例,真实环境另建!)
- sql> alter user scott identified by tiger account unlock;
- sql> grant connect,resource to scott;
- sql> grant select any dictionary,select any table to scott;
- sql> grant execute on utl_file to scott;
- sql> grant execute on dbms_streams to scott;
- sql> grant execute on dbms_streams_adm to scott;
- -- 创建目标表
- sql> conn scott/tiger
- CREATE TABLE scott.tab(
- id number NOT NULL,birthDate Date,age number,name varchar2(50),constraint tab_pk primary key(id));
- CREATE TABLE scott.tab2(
- id number NOT NULL,constraint tab2_pk primary key(id));
/*####################################################################
## sql Server 源端及 oracle 目标端配置(都为windows系统)
#####################################################################*/
- -- 源端安装 GoldenGate: 解压 ggs_121210_Windows_x64_MSsql_64bit.zip,更名并移动到d盘(D:\ggs)
- -- 目标端安装 GoldenGate: 解压 121210_ggs_Windows_x64_shiphome.zip 安装到d盘(D:\ggs)
- -- 本测试中,源端和目标端的 ggs 位置相同,所以以下配置注意区别.
- -- 创建相关目录
- D:\ggs> GGSCI
- GGSCI (MSsql)> CREATE SUBDIRS
- /*执行结果:
- Parameter files D:\ggs\dirprm: created
- Report files D:\ggs\dirrpt: created
- Checkpoint files D:\ggs\dirchk: created
- Process status files D:\ggs\dirpcs: created
- sql script files D:\ggs\dirsql: created
- Database definitions files D:\ggs\dirdef: created
- Extract data files D:\ggs\dirdat: created
- Temporary files D:\ggs\dirtmp: created
- Credential store files D:\ggs\dircrd: created
- Masterkey wallet files D:\ggs\dirwlt: created
- Dump files D:\ggs\dirdmp: created
- */
- -- 将 Manager 进程添加为 Windows 服务(名称为: GGSMGR)
- D:\ggs> INSTALL ADDSERVICE
- /*执行结果:
- Service 'GGSMGR' created.
- Install program terminated normally.
- */
- -- 配置 Manager 参数文件(内容如下)
- GGSCI (MSsql)> EDIT PARAM mgr
- PORT 7809
- DYNAMICPORTLIST 7840-7850
- AUTORESTART ER *,WAITMINUTES 5,RETRIES 5
- -- 启动 GGSMGR 服务 (删除服务: sc delete GGSMGR)
- GGSCI (MSsql)> START MGR
- /*执行结果:
- Starting Manager as service ('GGSMGR')...
- Service started.
- */
- -- 查看进程
- GGSCI (MSsql)> INFO ALL
- GGSCI (MSsql)> INFO MGR
注:
参数文件都存储在 dirprm 文件夹中; 错误信息存储在 dirrpt 文件夹中;
从安装 GoldenGate 到 启动 GGSMGR 服务,源端和目标端都一样配置(都为windows系统).
/*####################################################################
## sql Server 源端配置
#####################################################################*/
- -- 从事务日志识别表信息
- GGSCI(MSsql)> dblogin sourcedb Demo_ODBC userid ogguser password oggpsw
- GGSCI(MSsql)> LIST TABLES dbo.*
- GGSCI(MSsql)> ADD TRANDATA dbo.tab
- GGSCI(MSsql)> ADD TRANDATA dbo.tab2
- -- 配置定义文件(内容如下)
- GGSCI(MSsql)> edit params defgen
- sourcedb Demo_ODBC userid ogguser password oggpsw
- defsfile D:\ggs\dirdef\Demo_tabless.def
- table dbo.tab;
- table dbo.tab2;
- -- 生成表定义文件 D:\ggs\dirdef\Demo_tabless.def
- GGSCI(MSsql)> exit
- D:\ggs> defgen paramfile D:\ggs\dirprm\defgen.prm
- /*
- 将生成的文件 D:\ggs\dirdef\Demo_tabless.def 复制到目标OGG目录 D:\ggs\dirdef
- Demo_tabless.def 文件内容如下:
- *+- Defgen version 4.0,Encoding GBK
- *
- * Definitions created/modified 2016-12-01 01:14
- *
- * Field descriptions for each column entry:
- *
- * 1 Name
- * 2 Data Type
- * 3 External Length
- * 4 Fetch Offset
- * 5 Scale
- * 6 Level
- * 7 Null
- * 8 Bump if Odd
- * 9 Internal Length
- * 10 Binary Length
- * 11 Table Length
- * 12 Most Significant DT
- * 13 Least Significant DT
- * 14 High Precision
- * 15 Low Precision
- * 16 Elementary Item
- * 17 Occurs
- * 18 Key Column
- * 19 Sub Data Type
- * 20 Native Data Type
- * 21 Character Set
- * 22 Character Length
- * 23 LOB Type
- * 24 Partial Type
- *
- Database type: MSsql
- Character set ID: windows-936
- National character set ID: UTF-16
- Locale: zh_CN
- Case sensitivity: 00 00 00 00 00 00 00 00 00 00 00 00 11 00 00 00
- TimeZone: Asia/Shanghai
- *
- Definition for table dbo.tab
- Record length: 109
- Syskey: 0
- Columns: 4
- id 134 23 0 0 0 1 0 8 8 8 0 0 0 0 1 0 1 0 4 -1 0 0 0
- birthDate 192 29 11 3 0 1 0 29 29 29 0 6 0 0 1 0 0 0 11 -1 0 0 0
- age 134 23 43 0 0 1 0 8 8 8 0 0 0 0 1 0 0 0 4 -1 0 0 0
- name 64 50 54 0 0 1 0 50 50 0 0 0 0 0 1 0 0 0 12 -1 0 0 0
- End of definition
- *
- Definition for table dbo.tab2
- Record length: 109
- Syskey: 0
- Columns: 4
- id 134 23 0 0 0 1 0 8 8 8 0 0 0 0 1 0 1 0 4 -1 0 0 0
- birthDate 192 29 11 3 0 1 0 29 29 29 0 6 0 0 1 0 0 0 11 -1 0 0 0
- age 134 23 43 0 0 1 0 8 8 8 0 0 0 0 1 0 0 0 4 -1 0 0 0
- name 64 50 54 0 0 1 0 50 50 0 0 0 0 0 1 0 0 0 12 -1 0 0 0
- End of definition
- */
- -- 配置 Extract 文件(内容如下)
- GGSCI(MSsql)> EDIT PARAMS EXTA
- EXTRACT EXTA
- SETENV ( NLS_LANG = "SIMPLIFIED CHINESE_CHINA.ZHS16GBK" )
- sourcedb Demo_ODBC userid ogguser password oggpsw
- TRANlogoPTIONS MANAGESECONDARYTRUNCATIONPOINT
- EXTTRAIL D:\ggs\dirdat\pr
- EOFDELAYCSECS 10
- table dbo.tab;
- table dbo.tab2;
- -- 添加 Extract 进程
- GGSCI(MSsql)> ADD EXTRACT EXTA,TRANLOG,BEGIN NOW
- GGSCI(MSsql)> ADD RMTTRAIL D:\ggs\dirdat\pr,EXTRACT EXTA
- -- 配置 pump 文件(配置 REPLICAT 文件)
- GGSCI(MSsql)> EDIT PARAMS PUMPA
- extract PUMPA
- SETENV ( NLS_LANG = "SIMPLIFIED CHINESE_CHINA.ZHS16GBK" )
- sourcedb Demo_ODBC userid ogguser,password oggpsw
- rmthost 192.168.1.89,mgrport 7809,compress
- rmttrail D:\ggs\dirdat\pr
- EOFDELAYCSECS 10
- table dbo.tab;
- table dbo.tab2;
- -- 添加 pump 进程
- GGSCI(MSsql)> ADD EXTRACT PUMPA,EXTTRAILSOURCE D:\ggs\dirdat\pr,EXTRACT PUMPA
- -- 查看所有进程 或某个进程
- GGSCI(MSsql)> INFO ALL
- GGSCI(MSsql)> INFO MGR
- -- 启动进程
- GGSCI(MSsql)> START EXTA
- GGSCI(MSsql)> START PUMPA
- -- 查看数据库或表是否启用cdc
- SELECT name,is_tracked_by_cdc FROM Demo.sys.tables WHERE is_tracked_by_cdc = 1
- GO
/*####################################################################
## sql Server 初始化数据
#####################################################################*/
- -- 源: 初始提取配置
- GGSCI(MSsql)> EDIT PARAMS INEXT
- SOURCEISTABLE
- sourcedb Demo_ODBC userid ogguser,password oggpsw
- RMTHOST 192.168.1.89,MGRPORT 7809
- RMTFILE D:\ggs\dirdat\ex
- TABLE dbo.tab;
- TABLE dbo.tab2;
- -- 目标: 初始加载配置
- GGSCI(MSsql)> EDIT PARAMS INLOAD
- SPECIALRUN
- END RUNTIME
- USERID scott,PASSWORD tiger
- EXTFILE D:\ggs\dirdat\ex
- SOURCEDEFS D:\ggs\dirdef\Demo_tabless.def
- MAP dbo.tab,target scott.tab;
- MAP dbo.tab2,target scott.tab2;
- -- 源: 提取数据到目标文件夹
- D:\ggs> extract paramfile dirprm\inext.prm reportfile dirrpt\inext.rpt
- -- 目标: 加载数据到表
- D:\ggs> replicat paramfile dirprm/inload.prm
/*####################################################################
## ORACLE 目标端配置
#####################################################################*/
- -- 检查点用于存储 Extract 和 REPLICAT 进程的当前读/写位置
- GGSCI(MSsql)> DBLOGIN USERID scott,PASSWORD tiger
- GGSCI(MSsql)> ADD CHECKPOINTTABLE scott.chkpt
- -- 配置同步进程
- GGSCI(MSsql)> EDIT PARAM MSREP
- REPLICAT MSREP
- SETENV ( NLS_LANG = "SIMPLIFIED CHINESE_CHINA.ZHS16GBK" )
- USERID scott,PASSWORD tiger
- SOURCEDEFS D:\ggs\dirdef\Demo_tabless.def
- HANDLECOLLISIONS
- ASSUMetaRGETDEFS
- MAP dbo.tab,target scott.tab2;
- -- 添加进程
- GGSCI(MSsql)> ADD REPLICAT MSREP,CHECKPOINTTABLE scott.chkpt,EXTTRAIL ./dirdat/pr
- -- 启用进程
- GGSCI(MSsql)> START REPLICAT MSREP
- -- 查看进程
- GGSCI(MSsql)> INFO ALL
- GGSCI(MSsql)> INFO MSREP
配置完成!!测试同步正常!!~~
(注意:此配置没有设置同步 DDL ,当然也可设置)
附图一: sql server 源端 OGG 进程信息
附图二: oracle 目标端 OGG 进程信息
附图三: oracle 目标端scott 表信息 (chkpt 及 chkpt_lox 为检查点记录创建的表)
参考:
Oracle GoldenGate 12c (12.1.2)
使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务