learn by doing,less theory,more results.
install configure:
我们需要熟悉的最重要的组件是 Extract 和 Replicat 进程。Extract 进程运行在源系统上,负责捕获数据更改。Replicat 运行在目标计算机上,负责将更改应用于目标数据库。
ogg sync SQLServer to Oracle
OGG 支持 oracle、sql server、mysql、db2、Sybase 等关系数据库直接的数据复制。OGG 这种灵活特性能够支持多种业务场景。
环境信息
source:
os : windows server 2008 r2
ip : 10.37.2.98
db : SQLServer 2008 R2
instance : MSSQLSERVER
ogg: Oracle GoldenGate Command Interpreter for SQL Server Version 11.2.1.0.1
安装路径:E:\app\ogg
要求:
企业版:SQL Server Enterprise Edition
启动 SQL Server 代理 (自动)
有权启用:Change Data Capture (CDC)
数据库须为完整回复(FULL)模式
MSSQL端权限:Extract:sysadmin ; REPLICAT:db_owner
当前都使用SQL认证(dblogin ……)
target:
os : Centos 6.6
ip : 10.37.2.254
db : oracle 11g r2
instance : jhdb
ogg:Oracle GoldenGate Command Interpreter for oracle Version 11.2.1.0.1
安装路径:/u01/gg/
要求:
启用归档模式
启用GoldenGate复制
创建用于OGG账户并授予相关权限
本次测试使用的是’V34020-01.zip’(Oracle GoldenGate 11.2.1.0.1 for Oracle 10g on Windows 2003, 2008 on Microsoft Windows x64),可以在https://edelivery.oracle.com/osdc/faces/SoftwareDelivery下载。
配置
/*####################################################################
1、source源端配置:
###############################################################*/
以下进行一个小测试: Windows 平台利用 GoldenGate 同步 SQLServer 到 ORACLE OGG 。
同步sql server 原理: 启用 Extract 进程后,sql server 中数据库及表将启用 变更数据捕获(CDC),并读取相关日志中表的日志信息。本例中使用的是 pump 进程传输同步文件记录,这样Extract进程读取出来的记录都保存到文件夹 dirdat 中,保证即使中断也不会影响到数据库截断。(否则:Oracle GoldenGate For SQL Server 未提交事务导致MSSQL日志不截断)
1.1、开启SQLServer CDC:
变更数据捕获(Change Data Capture ,简称 CDC)记录 SQL Server 表的插入、更新和删除活动。使用变更数据捕获可以更有效跟踪表对象DML历史操作,对 ETL 等数据转移也非常有用。
变更数据捕获适用版本:
SQL Server 2008 以上的 Enterprise Edition、Developer Edition 和 Evaluation Edition 。
变更数据捕获原理:
变更数据捕获的更改数据源为 SQL Server 事务日志。当对表启用变更数据捕获时,系统将生成一个与该表结构类似的副本。当对源表进行插入、更新和删除 时,在事务日志会记录相关操作信息。变更数据捕获代理使用异步进程读取事务日志,将相关操作结果应用到副本表(捕获实例表)中,这样就完成了对源表操作的记录跟踪。
查看数据库或表是否启用了cdc:
-- 查看数据库是否启用cdc
SELECT name,is_cdc_enabled FROM sys.databases WHERE is_cdc_enabled = 1
-- 查看当前数据库表是否启用cdc
SELECT name,is_tracked_by_cdc FROM sys.tables WHERE is_tracked_by_cdc = 1
-- 对当前数据库启用cdc
USE MyDatabase
GO
EXECUTE sys.sp_cdc_enable_db;
GO
可能出现以下错误及解决办法:
/*
消息 22830,级别 16,状态 1,过程 sp_cdc_enable_db_internal,第 186 行
无法更新元数据来指示已对数据库 MyDatabase 启用了变更数据捕获。执行命令 'SetCDCTracked(Value = 1)' 时失败。
返回的错误为 15404: '无法获取有关 Windows NT 组/用户 'KK\administrator' 的信息,错误代码 0x54b。'。
请使用此操作和错误来确定失败的原因并重新提交请求。
消息 266,级别 16,状态 2,过程 sp_cdc_enable_db_internal,第 0 行
EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 0,当前计数 = 1。
消息 266,级别 16,状态 2,过程 sp_cdc_enable_db,第 0 行
EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 0,当前计数 = 1。
消息 3998,级别 16,状态 1,第 1 行
在批处理结束时检测到不可提交的事务。该事务将回滚。
*/
-- 原因是数据库所有者为Windows用户,改为“sa”
EXEC dbo.sp_changedbowner @loginame = N'sa', @map = false
GO
--依赖别名已删除
-- 也可以使用脚本查看跟踪表的信息
EXEC sys.sp_cdc_help_change_data_capture
GO
EXEC sys.sp_cdc_help_change_data_capture 'dbo', 'CDC_Test'
GO
1.2、创建数据源:
开始-管理工具-数据源(odbc)
/* 注:源端数据库驱动为 SQL Server (若sql server 作为目标端,则目标端驱动为 SQL Server Native Client 10.0)
数据源名称:Demo_ODBC
数据库账号:ogguser
数据库密码:oggpsw
*/
启动数据库cdc后,接着对指定源表启用 cdc :
-- 接着对指定源表启用cdc
EXEC sys.sp_cdc_enable_table
@source_schema= 'dbo', --源表架构
@source_name = 'CDC_Test', --源表
@role_name = 'CDC_Role' --角色(将自动创建)
GO
--作业 'cdc.MyDatabase_capture' 已成功启动。
--作业 'cdc.MyDatabase_cleanup' 已成功启动。
1.3、 源端 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,1) primary key,
[birthDate] [datetime] NULL,
[age] [int] NULL,
[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(),99,'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)
/* 注:源端数据库驱动为 SQL Server (若sql server 作为目标端,则目标端驱动为 SQL Server Native Client 10.0)
数据源名称: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
1.4、source 源端ogg配置
--- -- 创建相关目录
GGSCI (MSSQL)> CREATE SUBDIRS
根据官方文档,GGSCI 支持每个 Oracle GoldenGate 实例最多 300 个并发的 Extract 和 Replicat 进程。不过,有一个进程负责控制其他进程;这个进程被称作 Manager 进程。虽然您可以手动运行此进程,但最好将其安装为服务,否则当启动该进程的用户注销时,该进程将停止。
-- -- 将 Manager 进程添加为 Windows 服务(名称为: GGSMGR)
D:\ggs> INSTALL ADDSERVICE
Service 'GGSMGR' created.
Install program terminated normally.
-- -- 配置 Manager 参数文件
GGSCI (MSSQL)> EDIT PARAM mgr
PORT 7809
-- --从事务日志识别表信息
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
因为 Oracle 和 SQL Server 中的数据类型不同,所以您必须建立数据类型转换。GoldenGate 提供了一个名为 DEFGEN 的专用工具,用于生成数据定义,当源表和目标表中的定义不同时,Oracle GoldenGate 进程将引用该专用工具。在运行 DEFGEN 之前,需要为其创建一个参数文件,指定该工具应检查哪些表以及在检查表之后存放类型定义文件的位置。可以在 GGSCI 内使用 EDIT PARAMS 命令创建这样一个参数文件。
-- -- 配置sourcedb 参数文件
GGSCI(MSSQL)> edit params defgen
sourcedb Demo_ODBC userid ogguser password oggpsw
defsfile E:\app\ogg\dirdef\Demo_tabless.def
table dbo.tab;
table dbo.tab2;
参数的含义不言自明。我们希望 DEFGEN 检查 HRSCHEMA 内的 EMP 表并在 DIRDEF 子目录中放置一个名为 EMP.DEF 的定义文件。我们来调用 DEFGEN 并检查其输出。
-- -- 生成表定义文件
D:\ggs> defgen paramfile E:\app\ogg\dirprm\defgen.prm
**********************************************************************
Oracle GoldenGate Table Definition Generator for ODBC
Version 11.1.1.0.0 Build 078
Windows (optimized), Microsoft SQL Server on Jul 28 2010 19:16:56
Copyright (C) 1995, 2010, Oracle and/or its affiliates.All rights reserved.
Starting at 2011-04-08 14:41:06
***********************************************************************
Operating System Version:
Microsoft Windows XP Professional, on x86
Version 5.1 (Build 2600: Service Pack 3)
Process id: 2948
***********************************************************************
** Running with the following parameters **
***********************************************************************
defsfile c:\gg\dirdef\emp.def
sourcedb hr
table hrschema.emp;
Retrieving definition for HRSCHEMA.EMP
Definitions generated for 1 tables in c:\gg\dirdef\emp.def
C:\GG>
如果您费心检查一下 EMP.DEF 的内容,就会发现其内容类似如下所示:
*
* Definitions created/modified 2011-07-07 10:27
*
* 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