ogg_sqlserver_oracle_winerver2008

注意:DDL 不支持
OGG 支持 oracle、sql server、MySQL、db2、Sybase 等关系数据库直接的数据复制。OGG这种灵活特性能够支持多种业务场景。
OGG 有几个进程使数据同步或转移:Extract,Data pump,Replicat,Trails or extract files,Checkpoints,Manager,Collector
(更多参考官方文档:Introduction to Oracle GoldenGate)

OGG 同步sql server 原理: 启用 Extract 进程后,sql server 中数据库及表将启用变更数据捕获(CDC),并读取相关日志中表的日志信息。
本例中使用的是 pump 进程传输同步文件记录,这样Extract进程读取出来的记录都保存到文件夹 dirdat 中,保证即使中断也不会影响到数据库截断。
(否则:Oracle GoldenGate For SQL Server 未提交事务导致MSSQL日志不截断)

服务器信息:
源端: 192.168.92.92 服务器: windows server 2008 x64 数据库: MSSQL 2008 R2
目标端: 192.168.92.92 服务器: windows server 2008 x64 数据库: ORACLE oracle 11.2.0.4.0

GoldenGate下载地址:
http://www.oracle.com/technetwork/cn/middleware/goldengate/downloads/index.html
https://edelivery.oracle.com/osdc/faces/SearchSoftware

本次测试下载的两个 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)

表无主键无唯一索引,若是在gg源端发出,如果导致gg目的端abend,除非目的端复制进程参数文件有APPLYNOOPUPDATES 或者ALLOWNOOPUPDATES参数

--若用winserver2008 或 win10专业版或企业版 执行ggsci报错:
--msvcr100.dll丢失
解决:下载msvcr100.dll,64位系统需要放两个dll文件,一个32位,一个64位(下面两个一定要看仔细,反的):32位dll放在:\Windows\SysWOW64, 64位dll放在:\Windows\System32
--msvcp100.dll丢失
解决:安装 vc2010_x64

SQL SERVER 源端重要条件:
1. 企业版:SQL Server Enterprise Edition
2. 启动 SQL Server 代理 (自动)
3. 有权启用:Change Data Capture (CDC)
4. 数据库须为完整回复(FULL)模式
5. MSSQL端权限:Extract:sysadmin ; REPLICAT:db_owner
6. 当前都使用SQL认证(dblogin ……)

USE test;
GO
--开启某个数据库的CDC功能
EXEC sys.sp_cdc_enable_db;
GO
--查询库是否开启cdc
SELECT name, is_cdc_enabled FROM sys.databases WHERE database_id = DB_ID();

--版本
select @@version;

--准备测试表
create table dbo.sp(id int primary key,name varchar(10));
insert into dbo.sp(id,name) values(1,'n1');
insert into dbo.sp(id,name) values(2,'n2');
select * from dbo.sp;

create table dbo.test(id int,name varchar(10));
insert into dbo.test(id,name) values(1,'n1');
insert into dbo.test(id,name) values(2,'n2');
select * from dbo.test;

--参考
--表存储参数:with (pad_index = off, statistics_norecompute=off, ignore_dup_key=off, allow_row_locks=on, allow_page_locks=on) on [primary]
BEGIN TRAN
INSERT INTO [dbo].[tab] VALUES(GETDATE()+RAND(),99,'kk')
COMMIT TRAN

--单张表开启cdc 另外2张表(sp test)未成功
EXECUTE sys.sp_cdc_enable_table
@source_schema = dbo
,@source_name = N'sp'
,@role_name = N'cdc_Admin'
,@capture_instance = N'dbo_sp'
,@supports_net_changes = 1;

EXECUTE sys.sp_cdc_enable_table
@source_schema = dbo
,@source_name = N'test'
,@role_name = N'cdc_Admin'
,@capture_instance = N'dbo_test'
,@supports_net_changes = 1;
--查询表是否开启cdc
SELECT [name], is_tracked_by_cdc FROM sys.tables WHERE object_id=OBJECT_ID(N'dbo.sp');
SELECT [name], is_tracked_by_cdc FROM sys.tables WHERE object_id=OBJECT_ID(N'dbo.test');

ORACLE 目标端重要条件:
1. 启用归档模式
2. 启用GoldenGate复制
3. 创建用于OGG账户并授予相关权限

--SQL Server 源端配置
--关闭数据库 'trunc.log on chkpt';参考:EXEC sp_dboption 'Demo', 'trunc. log on chkpt', 'false'
use master
go
EXEC sp_dboption 'test','trunc. log on chkpt'
go

--数据库须为完整回复(FULL)模式
use master
go
alter database test set recovery full
go

--创建数据库账号
use master
go
CREATE LOGIN ogguser WITH PASSWORD=N'Zyj123456', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF;
go
EXEC master..sp_addsrvrolemember @loginame = N'ogguser', @rolename = N'sysadmin'
go
SELECT name,recovery_model,recovery_model_desc FROM sys.databases WHERE name='test';

--创建ODBC 数据源 (开始-管理工具-数据源odbc 对sqlserver)
注:源端数据库驱动为 SQL Server (若sql server 作为目标端,则目标端驱动为 SQL Server Native Client 10.0)
数据源名称:test
数据库账号:ogguser
数据库密码:Zyj123456
操作步骤:
1.运行SQL Server 2008,连接到服务器
2.打开控制面——管理工具-数据源(ODBC)——系统DSN(应该选择系统DSN,数据库名称选择复制表的数据库),点击添加
3.打开创建数据源窗口,选择SQL Server,点击下一步
4.第四步,输入连接文件数据源的名称,点击下一步
5.命名数据源,可以输入sql;在服务器选项上,一般填写local,但有时候列表中没有这个选项,这个时候在服务器这一项填写自己电脑的IP地址即可。
6.点击完成,测试数据源
--需要配置系统DSN,否则源端exta进程报错
2019-11-09 17:42:59 WARNING OGG-00091 VAM Client Report <[mssqlvam::TruncMgr::Timer] 无法执行过程。该数据库没有发布。
请在已为复制发布的数据库中执行该过程。 Error (-2147217900): 无法执行过程。该数据库没有发布。请在已为复制发布的数据库中-
执行该过>.

--查看数据库或表是否启用cdc (不需要启动,配置完成自动启动)
SELECT name,is_cdc_enabled FROM sys.databases WHERE is_cdc_enabled = 1;
SELECT name,is_tracked_by_cdc FROM test.sys.tables WHERE is_tracked_by_cdc = 1;

--首次备份数据库(配置完成前不要截断日志)
BACKUP DATABASE test TO DISK= N'd:\backup\test.bak' WITH CHECKSUM,COMPRESSION
GO

--ORACLE 目标端配置
--查看是否归档
archive log list;

-- 设置归档模式
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;

--查看日志附加属性
select supplemental_log_data_min,force_logging from v$database;

--设置日志附加属性
alter database add supplemental log data;
alter database force logging;
alter system switch logfile;

--启用 goldengate 报错:非法选项 11.2.0.4版本开始设置此参数
alter system set enable_goldengate_replication = true scope=both;

--启用账号 scott (本测试以 scott 为例,真实环境另建!)
alter user scott identified by scott account unlock;
grant connect, resource to scott;
grant select any dictionary,select any table to scott;
grant execute on utl_file to scott;
grant execute on dbms_streams to scott;
grant execute on dbms_streams_adm to scott;

--创建目标表
conn scott/scott@orcl

CREATE TABLE sp(id number primary key,name varchar2(10));

create table test(id int,name varchar(10));

--SQL Server 源端(windows系统)及 oracle 目标端配置
--源端安装 GoldenGate: 解压 ggs_121210_Windows_x64_MSSQL_64bit.zip ,更名并移动到c盘(c:\ggs)
--目标端安装 GoldenGate: 解压 121210_ggs_Windows_x64_shiphome.zip 安装到c盘(c:\ggso)
--本测试中,源端和目标端的 ggs 位置相同,所以以下配置注意区别.
--创建相关目录
GGSCI
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)
--提示语法错误:Install did not terminate normally!!! 忽略
根据官方文档,GGSCI 支持每个 Oracle GoldenGate 实例最多 300 个并发的 Extract 和 Replicat 进程。不过,有一个进程负责控制其他进程;
这个进程被称作 Manager 进程。虽然您可以手动运行此进程,但最好将其安装为服务,否则当启动该进程的用户注销时,该进程将停止。
要将 Manager 进程添加为 Windows 服务,请在 GoldenGate 安装目录中执行 INSTALL ADDSERVICE 命令。

exit
.\install.exe ADDSERVICE

Service 'GGSMGR' created.
Install program terminated normally.


--配置 Manager 参数文件(内容如下)
cd c:\
cd ggsci
ggsci
EDIT PARAM mgr

PORT 7809
DYNAMICPORTLIST 7840-7850
AUTORESTART ER *, WAITMINUTES 5, RETRIES 5

--启动 GGSMGR 服务 (删除服务: sc delete GGSMGR)
START MGR

--查看进程
INFO ALL
INFO MGR

--SQL Server 源端配置
--从事务日志识别表信息
ggsci
dblogin sourcedb test userid ogguser password Zyj123456
LIST TABLES dbo.*
ADD TRANDATA dbo.sp
ADD TRANDATA dbo.test

--报警告
2017-04-11 17:40:06 WARNING OGG-01483 The key for table [test.dbo.lib] contains one or more variable length columns. These columns may
not have their pre-images written to the transaction log during updates. Please use KEYCOLS to specify a key for Oracle GoldenGate to use on this table.

--配置定义文件(内容如下)
因为 Oracle 和 SQL Server 中的数据类型不同,所以您必须建立数据类型转换。GoldenGate 提供了一个名为 DEFGEN 的专用工具,用于生成数据定义,
当源表和目标表中的定义不同时,Oracle GoldenGate 进程将引用该专用工具。在运行 DEFGEN 之前,需要为其创建一个参数文件,
指定该工具应检查哪些表以及在检查表之后存放类型定义文件的位置。可以在 GGSCI 内使用 EDIT PARAMS 命令创建这样一个参数文件。
这将创建一个名为 DEFGEN.PRM 的空参数文件,该文件位于 GoldenGate 安装的 DIRPRM 文件夹中

edit params defgen

sourcedb test userid ogguser password Zyj123456
defsfile C:\ggs\dirdef\test_tabless.def
table dbo.sp;
table dbo.test;

--生成表定义文件 c:\ggs\dirdef\test_tabless.def
exit
.\defgen paramfile c:\ggs\dirprm\defgen.prm

将生成的文件 c:\ggs\dirdef\test_tabless.def 复制到目标OGG目录 /home/oracle/app/oracle/ogg/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 文件(内容如下);MANAGESECONDARYTRUNCATIONPOINT。此选项告诉 Extract 进程定期检查和删除 CDC 捕获作业
.\ggsci
dblogin sourcedb test userid ogguser password Zyj123456
ADD CHECKPOINTTABLE dbo.chkpt
edit params exta

EXTRACT EXTA
SETENV ( NLS_LANG = "SIMPLIFIED CHINESE_CHINA.ZHS16GBK" )
sourcedb test userid ogguser password Zyj123456
TRANLOGOPTIONS MANAGESECONDARYTRUNCATIONPOINT
EXTTRAIL C:\ggs\dirdat\a
EOFDELAYCSECS 10
table dbo.sp;
table dbo.test;

--添加 Extract 进程
--DELETE EXTRACT EXTA, TRANLOG, BEGIN NOW
--DELETE EXTTRAIL C:\ggs\dirdat\ab, EXTRACT EXTA
ADD EXTRACT EXTA,TRANLOG,BEGIN NOW
ADD EXTTRAIL C:\ggs\dirdat\ab,EXTRACT EXTA

--配置 pump 文件(配置 REPLICAT 文件
EDIT PARAMS PUMPA

extract PUMPA
SETENV ( NLS_LANG = "SIMPLIFIED CHINESE_CHINA.ZHS16GBK" )
sourcedb test userid ogguser, password Zyj123456
rmthost 192.168.92.92,mgrport 7809,compress
rmttrail c:\ggs\dirdat\pr
EOFDELAYCSECS 10
table dbo.sp;
table dbo.test;

--添加 pump 进程
--DELETE EXTRACT PUMPA,EXTTRAILSOURCE c:\ggs\dirdat\pr, BEGIN NOW
--DELETE RMTTRAIL c:\ggso\dirdat\pr, EXTRACT PUMPA
--参考
--BEGIN NOW需要
ADD EXTRACT PUMPA,EXTTRAILSOURCE c:\ggs\dirdat\ab, BEGIN NOW
ADD RMTTRAIL C:\ggs\dirdat\pr, EXTRACT PUMPA

--查看所有进程 或某个进程
INFO ALL
INFO MGR

--启动进程
start mgr
START EXTA
START PUMPA
--查看数据库或表是否启用cdc
SELECT name,is_cdc_enabled FROM sys.databases WHERE is_cdc_enabled = 1;
SELECT name,is_tracked_by_cdc FROM test.sys.tables WHERE is_tracked_by_cdc = 1;

--SQL Server 初始化数据
--源: 初始提取配置
EDIT PARAMS INEXT

SOURCEISTABLE
sourcedb test userid ogguser, password Zyj123456
RMTHOST 192.168.92.92,MGRPORT 7809
RMTFILE C:\ggs\dirdat\ex
TABLE dbo.sp;
TABLE dbo.test;

--目标: 初始加载配置 END RUNTIME,Replicat 进程在加载完成后终止
.\ggsci
EDIT PARAMS INLOAD

SPECIALRUN
END RUNTIME
USERID scott, PASSWORD scott
EXTFILE C:\ggs\dirdat\ex
SOURCEDEFS C:\ggs\dirdef\test_tabless.def
MAP dbo.sp,target scott.sp;
MAP dbo.test,target scott.test;

--源: 提取数据到目标文件夹
--报错:TCP/IP error 10061 (由于目标计算机积极拒绝,无法连接。), endpoint: orcl:7809
exit
.\extract paramfile dirprm\inext.prm reportfile dirrpt\inext.rpt

--目标: 加载数据到表 初始化目标端数据
exit
./replicat paramfile dirprm/inload.prm

-----------------------------------------------------------------------------------------------------------------------
--ORACLE 目标端配置

--目标端创建表结构
create table scott.sp(id number primary key,name varchar(10));
create table scott.test(id number,name varchar(10));

--检查点用于存储 Extract 和 REPLICAT 进程的当前读/写位置

.\ggsci
DBLOGIN USERID scott, PASSWORD scott
ADD CHECKPOINTTABLE scott.chkpt

--编辑目标段参数文件mgr
EDIT PARAM mgr

PORT 7809
DYNAMICPORTLIST 7840-7850
AUTORESTART ER *, WAITMINUTES 5, RETRIES 5

--配置同步进程
EDIT PARAM MSREP

REPLICAT MSREP
SETENV ( NLS_LANG = "SIMPLIFIED CHINESE_CHINA.ZHS16GBK" )
USERID scott, PASSWORD scott
SOURCEDEFS c:\ggs\dirdef\test_tabless.def
HANDLECOLLISIONS
ASSUMETARGETDEFS
MAP dbo.sp,target scott.sp;
MAP dbo.test,target scott.test;

--添加进程
ADD REPLICAT MSREP,CHECKPOINTTABLE scott.chkpt,EXTTRAIL ./dirdat/pr

--启用进程
START REPLICAT MSREP

--查看进程
INFO ALL
INFO MSREP

--源端用navicat测试
insert into dbo.sp(id,name) values(3,'n3');
update dbo.sp set name='nn3' where id=3;
delete from dbo.sp where id=3;

insert into dbo.test(id,name) values(3,'n3');
update dbo.test set name='nn3' where id=3;
delete from dbo.test where id=3;

select * from dbo.sp;
select * from dbo.test;

--目标端查询
select * from scott.sp;
select * from scott.test;

posted @ 2019-10-14 15:38  virtual_daemon  阅读(923)  评论(0编辑  收藏  举报