我们需要熟悉的最重要的组件是 Extract 和 Replicat 进程。Extract 进程运行在源系统上,负责捕获数据更改。Replicat 运行在目标计算机上,负责将更改应用于目标数据库。
OGG 支持 oracle、sql server、mysql、db2、Sybase 等关系数据库直接的数据复制。OGG 这种灵活特性能够支持多种业务场景。
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 ……)
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下载。
/*####################################################################
以下进行一个小测试: Windows 平台利用 GoldenGate 同步 SQLServer 到 ORACLE OGG 。
同步sql server 原理: 启用 Extract 进程后,sql server 中数据库及表将启用 变更数据捕获(CDC),并读取相关日志中表的日志信息。本例中使用的是 pump 进程传输同步文件记录,这样Extract进程读取出来的记录都保存到文件夹 dirdat 中,保证即使中断也不会影响到数据库截断。(否则:Oracle GoldenGate For SQL Server 未提交事务导致MSSQL日志不截断)
变更数据捕获(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
开始-管理工具-数据源(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' 已成功启动。
--创建测试数据
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
--- -- 创建相关目录
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
* 16 Elementary Item
* 17 Occurs
* 18 Key Column
* 19 Sub Data Type
*
*
Definition for table HRSCHEMA.EMP
Record length: 121
Syskey: 0
Columns: 3
id 134 23 0 0 0 1 0 8 8 8 0 0 0 0 1 0 1 0
first_name 64 50 11 0 0 1 0 50 50 0 0 0 0 0 1 0 0 0
last_name 64 50 66 0 0 1 0 50 50 0 0 0 0 0 1 0 0 0
End of definition
基本上,它列出了所有表/列并使用更一般的定义描述了原生数据库类型。
现在需要将 Demo_tabless.def 文件复制到目标计算机,因为该文件需要供 Replicat 进程使用。Replicat 还必须执行另一项转换。该进程将更一般的类型重新映射为数据库特定的类型(但这次这些类型将对应于目标数据库所使用的类型)。
将源端生成的表定义文件( D:\ggs\dirdef\Demo_tabless.def) 复制到目标端OGG 目录(/u01/gg/dirdef/)
针对初始数据加载配置 Extract 和 Replicat
首先在源计算机上配置 Extract 进程。将进程命名为 INEXT(表示 INitial EXTract,初始提取)。接下来,按照为 DEFGEN 实用程序创建参数文件的方式创建一个参数文件。文件名为 INEXT.PRM。
-- -- 初始提取配置
SOURCEISTABLE 参数指示 Extract 进程直接从表而不是从事务日志获取数据。这是我们为执行完整提取所期望的行为。SOURCEDB 指向包含数据的数据库。RMTHOST 和 MGRPORT 指定远程计算机和 Manager 端口。RMTFILE 指定所提取的数据将写入的文件。
GGSCI(MSSQL)> EDIT PARAMS INEXT
SOURCEISTABLE
sourcedb Demo_ODBC userid ogguser, password oggpsw
RMTHOST 10.37.2.160, MGRPORT 7809
RMTFILE /u01/gg/dirdat/ex
TABLE dbo.tab;
TABLE dbo.tab2;
首先需要运行 Extract 进程;它将提取 SQL Server 的 dbo.tab,dbo.tab2 表中的所有数据,并将其写入 Linux 主机上的 RMTFILE (/u01/gg/dirdat/ex) 中。
通过运行 EXTRACT 命令并提供参数和日志文件作为命令行参数来启动 Extract。
-- -- 源: 提取数据到目标文件夹
D:\ggs> extract paramfile dirprm\inext.prm reportfile dirrpt\inext.rpt
D:\ggs> extract paramfile dirprm\inext.prm reportfile dirrpt\inext.rpt
***********************************************************************
Oracle GoldenGate Capture for SQL Server
Version 11.2.1.0.1 OGGCORE_11.2.1.0.1_PLATFORMS_120423.0230
Windows x64 (optimized), Microsoft SQL Server on Apr 23 2012 07:48:51
Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
Starting at 2017-11-07 18:51:57
***********************************************************************
Operating System Version:
Microsoft Windows Server 2008 R2 , on x64
Version 6.1 (Build 7601: Service Pack 1)
Process id: 5456
Description:
***********************************************************************
** Running with the following parameters **
***********************************************************************
2017-11-07 18:51:57 INFO OGG-03035 Operating system character set identifie
d as GBK. Locale: zh_Hans_CN, LC_ALL:.
2017-11-07 18:51:57 INFO OGG-01017 Wildcard resolution set to IMMEDIATE bec
ause SOURCEISTABLE is used.
2017-11-07 18:51:57 INFO OGG-03036 Database character set identified as win
dows-936. Locale: zh_Hans_CN.
2017-11-07 18:51:57 INFO OGG-03037 Session character set identified as GBK.
Using the following key columns for source table dbo.tab: id.
Using the following key columns for source table dbo.tab2: id.
2017-11-07 18:51:57 INFO OGG-01815 Virtual Memory Facilities for: COM
anon alloc: MapViewOfFile anon free: UnmapViewOfFile
file alloc: MapViewOfFile file free: UnmapViewOfFile
target directories:
E:\app\ogg_11.2.1.0.1_SQLServer2008r2\dirtmp.
CACHEMGR virtual memory values (may have been adjusted)
CACHESIZE: 16G
CACHEPAGEOUTSIZE (normal): 8M
PROCESS VM AVAIL FROM OS (min): 26.41G
CACHESIZEMAX (strict force to disk): 24G
2017-11-07 18:51:58 WARNING OGG-01842 CACHESIZE PER DYNAMIC DETERMINATION (16G
) LESS THAN RECOMMENDED: 64G (64bit system)
vm found: 26.41G
Check swap space. Recommended swap/extract: 128G (64bit system).
Database Version:
Microsoft SQL Server
Version 10.50.1600
ODBC Version 03.80.0000
Driver Information:
sqlncli10.dll
Version 10.50.1600
ODBC Version 03.52
2017-11-07 18:51:58 INFO OGG-01478 Output file /u01/gg/dirdat/ex is using f
ormat RELEASE 11.2.
2017-11-07 18:52:03 INFO OGG-01226 Socket buffer size set to 27985 (flush s
ize 27985).
Processing table dbo.tab
Processing table dbo.tab2
***********************************************************************
* ** Run Time Statistics ** *
***********************************************************************
Report at 2017-11-07 18:52:03 (activity since 2017-11-07 18:51:57)
Output to /u01/gg/dirdat/ex:
From Table dbo.tab:
# inserts: 6
# updates: 0
# deletes: 0
# discards: 0
From Table dbo.tab2:
# inserts: 12
# updates: 0
# deletes: 0
# discards: 0
-- -- 配置 Extract 参数文件
GGSCI(MSSQL)> EDIT PARAMS EXTA
EXTRACT MSEXT
SOURCEDB Demo_ODBC
TRANLOGOPTIONS MANAGESECONDARYTRUNCATIONPOINT
RMTHOST 10.37.2.160, MGRPORT 7809
RMTTRAIL /u01/gg/dirdat/ex
TABLE HRSCHEMA.EMP;
这里不同的是我们省略了 SOURCEISTABLE 参数并引入一个新参数:TRANLOGOPTIONS MANAGESECONDARYTRUNCATIONPOINT。此选项告诉 Extract 进程定期检查和删除 CDC 捕获作业,从而提高性能并减小捕获数据所占用的空间。
我们来创建一个挖掘事务日志的新 extract 组,将其命名为 EXTA。然后设置数据更改应写入的目标(/u01/gg/dirdat/)
-- -- 添加extract进程
GGSCI(MSSQL)> ADD EXTRACT EXTA, TRANLOG, BEGIN NOW
GGSCI(MSSQL)> ADD RMTTRAIL /u01/gg/dirdat/ex, EXTRACT EXTA
-- -- 配置datapump 参数文件(可选)
GGSCI(MSSQL)> EDIT PARAMS PUMPA
extract PUMPA
SETENV ( NLS_LANG = "SIMPLIFIED CHINESE_CHINA.ZHS16GBK" )
sourcedb Demo_ODBC userid ogguser, password oggpsw
rmthost 10.37.2.160, mgrport 7809
rmttrail /u01/gg/dirdat/ex
EOFDELAYCSECS 10
table dbo.tab;
table dbo.tab2;
-- -- 添加datapump进程(可选)
GGSCI(MSSQL)> ADD EXTRACT PUMPA,EXTTRAILSOURCE D:\gg\dirdat\pr, BEGIN NOW
GGSCI(MSSQL)> ADD RMTTRAIL /u01/gg/dirdat/ex, EXTRACT PUMPA
-- -- 启动进程:
GGSCI(MSSQL)> start mgr
GGSCI(MSSQL)> start *
GGSCI(MSSQL)> info all
实时数据捕获配置
Oracle Database 现在已有了 SQL Server 的 tab,tab2表的一个精确副本,可以创建实时捕获配置了。我们将 Extract 和 Replicat 进程配置成一直运行并不断传输/应用 tab,tab2 表的更改。
为了实现这一新配置,需要为提取和复制创建新的参数文件。不过首先必须在 SQL Server 上另外执行两个步骤:确认数据库已设置为完全恢复,然后执行 EMP 数据库的完整数据库备份。如果执行完整备份失败,将阻碍 Extract 进程捕获实时数据更改
通过右键单击 EMP 数据库,选择 Properties 并检查 Recovery model 的值,可以轻松检查该数据库是否处于完全恢复模式。
或者 通过命令修改
-- 数据库须为完整回复(FULL)模式
use master
go
alter database Demo set recovery full
go
执行完整备份也只需几次单击即可完成。右键单击 EMP 数据库,选择 Tasks,然后选择 Back Up。这将启动 Back Up Database 对话框。确认 Backup type 配置为 Full,然后单击 OK。
或者通过命令执行:
-- 首次备份数据库(配置完成前不要截断日志)
BACKUP DATABASE [Demo] TO DISK= N'D:\MSSQL\Demo.bak' WITH CHECKSUM,COMPRESSION
GO
/*####################################################################
-- 查看是否归档
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 "asd.123" 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;
一定要记住,如果 Replicat 进程将数据应用于位于不同模式中的表,GG_USER 将需要额外的权限(如 SELECT ANY TABLE、LOCK ANY TABLE 等)。官方文档中列出了所需权限的详细列表。
-- 创建目标表
SQL> conn scott/"asd.123"
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,
birthDate Date,
age number,
name varchar2(50),
constraint tab2_pk primary key(id));
需要设置 PATH 和 LD_LIBRARY_PATH 环境变量,如下所示:
[oracle@oradb ~]$ export PATH=$PATH:$ORACLE_BASE/gg
[oracle@oradb ~]$ export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_BASE/gg
-- 创建ogg目录
GGSCI (MSSQL)> CREATE SUBDIRS
-- 编辑管理进程参数文件
GGSCI (MSSQL)> EDIT PARAM mgr
PORT 7809
接下来需要为 Replicat 进程设置参数。为此,创建一个新的参数文件并将其命名为 INLOAD(表示 INitial LOADing,初始加载)。
SPECIALRUN 参数定义一个初始加载进程(这是不使用检查点的一次性加载)。文件中的下一行指示 Replicat 进程在加载完成后终止。
接下来提供了数据库用户和口令、提取文件以及表定义。最后一个参数 MAP 指示 Replicat 将表 HRSCHEMA.EMP 重新映射到 GG_USER.EMP。
-- -- 初始加载配置
GGSCI(MSSQL)> edit PARAMS INLOAD
SPECIALRUN
END RUNTIME
USERID scott, PASSWORD "asd.123"
EXTFiLE /u01/gg/dirdat/ex
SOURCEDEFS /u01/gg/dirdef/Demo_tabless.def
MAP dbo.tab,target scott.tab;
MAP dbo.tab2,target scott.tab2;
要将所提取的数据应用于目标数据库,请运行 replicat 命令并提供准备好的参数文件。下面是运行 replicat 的节选:
-- -- 目标: 加载数据到表
[oracle@oradb gg]$ ./replicat paramfile dirprm/inload.prm
[oracle@slave1 gg]$ ./replicat paramfile dirprm/inload.prm
***********************************************************************
Oracle GoldenGate Delivery for Oracle
Version 11.2.1.0.1 OGGCORE_11.2.1.0.1_PLATFORMS_120423.0230_FBO
Linux, x64, 64bit (optimized), Oracle 11g on Apr 23 2012 08:48:07
Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
Starting at 2017-11-07 19:46:19
***********************************************************************
Operating System Version:
Linux
Version #1 SMP Wed Oct 15 04:27:16 UTC 2014, Release 2.6.32-504.el6.x86_64
Node: slave1
Machine: x86_64
soft limit hard limit
Address Space Size : unlimited unlimited
Heap Size : unlimited unlimited
File Size : unlimited unlimited
CPU Time : unlimited unlimited
Process id: 7750
Description:
***********************************************************************
** Running with the following parameters **
***********************************************************************
2017-11-07 19:46:19 INFO OGG-03035 Operating system character set identified as UTF-8. Locale: en_US, LC_ALL:.
SPECIALRUN
END RUNTIME
USERID scott, PASSWORD *********
2017-11-07 19:46:19 INFO OGG-03501 WARNING: NLS_LANG environment variable is invalid or not set. Using operating system character set value of AL32UTF8.
EXTFiLE /u01/gg/dirdat/ex
SOURCEDEFS /u01/gg/dirdef/Demo_tabless.def
MAP dbo.tab,target scott.tab;
MAP dbo.tab2,target scott.tab2;
2017-11-07 19:46:19 INFO OGG-01815 Virtual Memory Facilities for: COM
anon alloc: mmap(MAP_ANON) anon free: munmap
file alloc: mmap(MAP_SHARED) file free: munmap
target directories:
/u01/gg/dirtmp.
CACHEMGR virtual memory values (may have been adjusted)
CACHESIZE: 2G
CACHEPAGEOUTSIZE (normal): 8M
PROCESS VM AVAIL FROM OS (min): 4G
CACHESIZEMAX (strict force to disk): 3.41G
Database Version:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
Database Language and Character Set:
NLS_LANG = ".AL32UTF8"
NLS_LANGUAGE = "AMERICAN"
NLS_TERRITORY = "AMERICA"
NLS_CHARACTERSET = "AL32UTF8"
Opened trail file /u01/gg/dirdat/ex at 2017-11-07 19:46:19
2017-11-07 19:46:19 INFO OGG-01014 Positioning with begin time: Jan 1, 1970 12:00:00 AM, starting record time: Nov 7, 2017 6:54:04 PM at extrba 930.
***********************************************************************
** Run Time Messages **
***********************************************************************
Opened trail file /u01/gg/dirdat/ex at 2017-11-07 19:46:19
MAP resolved (entry dbo.tab):
MAP dbo.tab,target scott.tab;
Using following columns in default map by name:
ID, BIRTHDATE, AGE, NAME
Using the following key columns for target table SCOTT.TAB: ID.
2017-11-07 19:46:21 WARNING OGG-03504 NLS_LANG character set AL32UTF8 on the target is different from the source database character set ZHS16GBK. Replication may not be valid if the source data has an incompatible character for the target NLS_LANG character set.
2017-11-07 19:46:21 WARNING OGG-00869 OCI Error ORA-00001: unique constraint (SCOTT.TAB_PK) violated (status = 1). INSERT INTO "SCOTT"."TAB" ("ID","BIRTHDATE","AGE","NAME") VALUES (:a0,:a1,:a2,:a3).
2017-11-07 19:46:21 WARNING OGG-01004 Aborted grouped transaction on 'SCOTT.TAB', Database error 1 (OCI Error ORA-00001: unique constraint (SCOTT.TAB_PK) violated (status = 1). INSERT INTO "SCOTT"."TAB" ("ID","BIRTHDATE","AGE","NAME") VALUES (:a0,:a1,:a2,:a3)).
2017-11-07 19:46:21 WARNING OGG-01003 Repositioning to rba 930.
2017-11-07 19:46:21 WARNING OGG-01154 SQL error 1 mapping dbo.tab to SCOTT.TAB OCI Error ORA-00001: unique constraint (SCOTT.TAB_PK) violated (status = 1). INSERT INTO "SCOTT"."TAB" ("ID","BIRTHDATE","AGE","NAME") VALUES (:a0,:a1,:a2,:a3).
2017-11-07 19:46:21 WARNING OGG-01003 Repositioning to rba 1061.
Source Context :
SourceModule : [er.errors]
SourceID : [/scratch/aime1/adestore/views/aime1_adc4150256/oggcore/OpenSys/src/app/er/errors.cpp]
SourceFunction : [take_rep_err_action]
SourceLine : [623]
ThreadBacktrace : [8] elements
: [/u01/gg/libgglog.so(CMessageContext::AddThreadContext()+0x1e) [0x7f8c3247b06e]]
: [/u01/gg/libgglog.so(CMessageFactory::CreateMessage(CSourceContext*, unsigned int, ...)+0x2cc) [0x7f8c3247744c]]
: [/u01/gg/libgglog.so(_MSG_ERR_MAP_TO_TANDEM_FAILED(CSourceContext*, ggs::gglib::ggapp::CQualDBObjName<(DBObjType)1> const&, ggs::gglib::ggapp::CQualDBObjName<(DBObjType)1> const&, CMessageFactory::MessageDisposition)+0x53) [0x7f8c3246ff19]]
: [./replicat(take_rep_err_action(short, int, char const*, extr_ptr_def*, __std_rec_hdr*, char*, file_def*, bool)+0xdac) [0x51daa0]]
: [./replicat(process_extract_loop()+0x2240) [0x536ab0]]
: [./replicat(main+0x732) [0x548752]]
: [/lib64/libc.so.6(__libc_start_main+0xfd) [0x3b63a1ed5d]]
: [./replicat(__gxx_personality_v0+0x322) [0x4be48a]]
2017-11-07 19:46:21 ERROR OGG-01296 Error mapping from dbo.tab to SCOTT.TAB.
***********************************************************************
* ** Run Time Statistics ** *
***********************************************************************
Last record for the last committed transaction is the following:
___________________________________________________________________
Trail name : /u01/gg/dirdat/ex
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: A (x41)
RecLength : 73 (x0049) IO Time : 2017-11-07 18:54:04.351661
IOType : 5 (x05) OrigNode : 255 (xff)
TransInd : . (x03) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 0 AuditPos : 0
Continued : N (x00) RecCount : 1 (x01)
2017-11-07 18:54:04.351661 Insert Len 73 RBA 930
Name: dbo.tab
___________________________________________________________________
Reading /u01/gg/dirdat/ex, current RBA 1061, 1 records
Report at 2017-11-07 19:46:21 (activity since 2017-11-07 19:46:21)
From Table dbo.tab to SCOTT.TAB:
# inserts: 1
# updates: 0
# deletes: 0
# discards: 1
Last log location read:
FILE: /u01/gg/dirdat/ex
RBA: 1061
TIMESTAMP: 2017-11-07 18:54:04.351661
EOF: NO
READERR: 0
2017-11-07 19:46:21 ERROR OGG-01668 PROCESS ABENDING.
CACHE OBJECT MANAGER statistics
CACHE MANAGER VM USAGE
vm current = 0 vm anon queues = 0
vm anon in use = 0 vm file = 0
vm used max = 0 ==> CACHE BALANCED
CACHE CONFIGURATION
cache size = 2G cache force paging = 3.41G
buffer min = 64K buffer highwater = 8M
pageout eligible size = 8M
================================================================================
RUNTIME STATS FOR SUPERPOOL
CACHE Transaction Stats
trans active = 0 max concurrent = 0
non-zero total = 0 trans total = 0
CACHE File Caching
disk current = 0 disk total = 0
disk caching = 0 file cached = 0
file retrieves = 0
CACHE MANAGEMENT
buffer links = 0 anon gets = 0
forced unmaps = 0 cnnbl try = 0
cached out = 0 force out = 0
Allocation Request Distribution
< 128B: 0
128B: 0 0 | 512B: 0 0
2K: 0 0 | 8K: 0 0
32K: 0 0 | 128K: 0 0
512K: 0 0 | 2M: 0 0
8M: 0 0 | 32M: 0 0
128M: 0 0 | 512M: 0 0
2G: 0 0 | 8G: 0
Cached Transaction Size Distribution
0: 0
< 4K: 0
4K: 0 0 | 16K: 0 0
64K: 0 0 | 256K: 0 0
1M: 0 0 | 4M: 0 0
16M: 0 0 | 64M: 0 0
256M: 0 0 | 1G: 0 0
4G: 0 0 | 16G: 0 0
64G: 0 0 | 256G: 0 0
1T: 0 0 | 4T: 0 0
16T: 0 0 | 64T: 0 0
256T: 0 0 |1024T: 0 0
================================================================================
CUMULATIVE STATS FOR SUPERPOOL
CACHE Transaction Stats
trans active = 0 max concurrent = 0
non-zero total = 0 trans total = 0
CACHE File Caching
disk current = 0 disk total = 0
disk caching = 0 file cached = 0
file retrieves = 0
CACHE MANAGEMENT
buffer links = 0 anon gets = 0
forced unmaps = 0 cnnbl try = 0
cached out = 0 force out = 0
Allocation Request Distribution
< 128B: 0
128B: 0 0 | 512B: 0 0
2K: 0 0 | 8K: 0 0
32K: 0 0 | 128K: 0 0
512K: 0 0 | 2M: 0 0
8M: 0 0 | 32M: 0 0
128M: 0 0 | 512M: 0 0
2G: 0 0 | 8G: 0
Cached Transaction Size Distribution
0: 0
< 4K: 0
4K: 0 0 | 16K: 0 0
64K: 0 0 | 256K: 0 0
1M: 0 0 | 4M: 0 0
16M: 0 0 | 64M: 0 0
256M: 0 0 | 1G: 0 0
4G: 0 0 | 16G: 0 0
64G: 0 0 | 256G: 0 0
1T: 0 0 | 4T: 0 0
16T: 0 0 | 64T: 0 0
256T: 0 0 |1024T: 0 0
QUEUE Statistics:
num queues = 15 default index = 0
cur len = 0 max len = 0
q vm current = 0 vm max = 0
q hits = 0 q misses = 0
queue size q hits curlen maxlen cannibalized
0 64K 0 0 0 0
1 128K 0 0 0 0
2 256K 0 0 0 0
3 512K 0 0 0 0
4 1M 0 0 0 0
5 2M 0 0 0 0
6 4M 0 0 0 0
7 8M 0 0 0 0
8 16M 0 0 0 0
9 32M 0 0 0 0
10 64M 0 0 0 0
11 128M 0 0 0 0
12 256M 0 0 0 0
13 512M 0 0 0 0
14 1G 0 0 0 0
================================================================================
RUNTIME STATS FOR CACHE POOL #0
POOL INFO group: inload id: p7750_BLOB
trans active = 0 trans concurrent (max) = 0
trans total = 0 (0 )
flag = 0x00000030
last error = (0=> )
Allocation Request Distribution
< 128B: 0
128B: 0 0 | 512B: 0 0
2K: 0 0 | 8K: 0 0
32K: 0 0 | 128K: 0 0
512K: 0 0 | 2M: 0 0
8M: 0 0 | 32M: 0 0
128M: 0 0 | 512M: 0 0
2G: 0 0 | 8G: 0
================================================================================
CUMULATIVE STATS FOR CACHE POOL #0
POOL INFO group: inload id: p7750_BLOB
trans active = 0 trans concurrent (max) = 0
trans total = 0 (0 )
flag = 0x00000030
last error = (0=> )
Allocation Request Distribution
< 128B: 0
128B: 0 0 | 512B: 0 0
2K: 0 0 | 8K: 0 0
32K: 0 0 | 128K: 0 0
512K: 0 0 | 2M: 0 0
8M: 0 0 | 32M: 0 0
128M: 0 0 | 512M: 0 0
2G: 0 0 | 8G: 0
QUEUE Statistics:
num queues = 15 default index = 0
cur len = 0 max len = 0
q vm current = 0 vm max = 0
q hits = 0 q misses = 0
queue size q hits curlen maxlen cannibalized
0 64K 0 0 0 0
1 128K 0 0 0 0
2 256K 0 0 0 0
3 512K 0 0 0 0
4 1M 0 0 0 0
5 2M 0 0 0 0
6 4M 0 0 0 0
7 8M 0 0 0 0
8 16M 0 0 0 0
9 32M 0 0 0 0
10 64M 0 0 0 0
11 128M 0 0 0 0
12 256M 0 0 0 0
13 512M 0 0 0 0
14 1G 0 0 0 0
================================================================================
RUNTIME STATS FOR CACHE POOL #0
POOL INFO group: inload id: p7750_BLOB
trans active = 0 trans concurrent (max) = 0
trans total = 0 (0 )
flag = 0x00000030
last error = (0=> )
Allocation Request Distribution
< 128B: 0
128B: 0 0 | 512B: 0 0
2K: 0 0 | 8K: 0 0
32K: 0 0 | 128K: 0 0
512K: 0 0 | 2M: 0 0
8M: 0 0 | 32M: 0 0
128M: 0 0 | 512M: 0 0
2G: 0 0 | 8G: 0
================================================================================
CUMULATIVE STATS FOR CACHE POOL #0
POOL INFO group: inload id: p7750_BLOB
trans active = 0 trans concurrent (max) = 0
trans total = 0 (0 )
flag = 0x00000030
last error = (0=> )
Allocation Request Distribution
< 128B: 0
128B: 0 0 | 512B: 0 0
2K: 0 0 | 8K: 0 0
32K: 0 0 | 128K: 0 0
512K: 0 0 | 2M: 0 0
8M: 0 0 | 32M: 0 0
128M: 0 0 | 512M: 0 0
2G: 0 0 | 8G: 0
-- 检查点用于存储 Extract 和 REPLICAT 进程的当前读/写位置
GGSCI(MSSQL)> DBLOGIN USERID scott, PASSWORD "asd.123"
GGSCI(MSSQL)> ADD CHECKPOINTTABLE scott.chkpt
-- 配置同步进程
GGSCI(MSSQL)> EDIT PARAM MSREP
REPLICAT MSREP
SETENV ( NLS_LANG = "SIMPLIFIED CHINESE_CHINA.ZHS16GBK" )
USERID scott, PASSWORD "asd.123"
SOURCEDEFS /u01/gg/dirdef/Demo_tabless.def
HANDLECOLLISIONS
ASSUMETARGETDEFS
MAP dbo.tab,target scott.tab;
MAP dbo.tab2,target scott.tab2;
-- 添加进程
GGSCI(MSSQL)> ADD REPLICAT MSREP,CHECKPOINTTABLE scott.chkpt,EXTTRAIL /u01/gg/dirdat/ex
-- 启用进程
GGSCI(MSSQL)> START REPLICAT MSREP
-- 查看进程
GGSCI(MSSQL)> INFO ALL
GGSCI(MSSQL)> INFO MSREP
注意:此次试验不支持ddl,所以源端跟目标端数据库表定义需要一样。
BEGIN TRAN
INSERT INTO [hrschema].[emp] ([id], [first_name], [last_name]) VALUES (9,'Gar','Samuelson')
COMMIT TRAN
sqlserver CDC信息请参考:http://blog.csdn.net/kk185800961/article/details/45749333
使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务请参考:http://www.oracle.com/technetwork/cn/articles/datawarehouse/oracle-sqlserver-goldengate-1396114-zhs.html
OGG官方文档请查看:http://www.oracle.com/technetwork/cn/middleware/goldengate/documentation/index.html
在本文中,我们对某些 Oracle GoldenGate 特性进行了非常基本的演示。您应该了解有许多不同拓扑结构和使用情况。例如,可以将 GoldenGate 配置成执行双向复制(两个不同的数据库同时互相复制更改)。还有广播(一个数据库复制到多个目标)和整合(许多数据库复制到一个中心数据库)配置。可以使用 GoldenGate 实现查询分流(将报告与生产分离,但避免了传统数据仓库的时间空隙)。GoldenGate 还是一个能够实现零停机升级及数据库迁移的功能强大的解决方案。