• 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放在:WindowsSysWOW64, 64位dll放在:WindowsSystem32
    --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:ackup est.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:ggsdirprm: created
    Report files D:ggsdirrpt: created
    Checkpoint files D:ggsdirchk: created
    Process status files D:ggsdirpcs: created
    SQL script files D:ggsdirsql: created
    Database definitions files D:ggsdirdef: created
    Extract data files D:ggsdirdat: created
    Temporary files D:ggsdirtmp: created
    Credential store files D:ggsdircrd: created
    Masterkey wallet files D:ggsdirwlt: created
    Dump files D:ggsdirdmp: 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:ggsdirdef est_tabless.def
    table dbo.sp;
    table dbo.test;

    --生成表定义文件 c:ggsdirdef est_tabless.def
    exit
    .defgen paramfile c:ggsdirprmdefgen.prm

    将生成的文件 c:ggsdirdef est_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:ggsdirdata
    EOFDELAYCSECS 10
    table dbo.sp;
    table dbo.test;

    --添加 Extract 进程
    --DELETE EXTRACT EXTA, TRANLOG, BEGIN NOW
    --DELETE EXTTRAIL C:ggsdirdatab, EXTRACT EXTA
    ADD EXTRACT EXTA,TRANLOG,BEGIN NOW
    ADD EXTTRAIL C:ggsdirdatab,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:ggsdirdatpr
    EOFDELAYCSECS 10
    table dbo.sp;
    table dbo.test;

    --添加 pump 进程
    --DELETE EXTRACT PUMPA,EXTTRAILSOURCE c:ggsdirdatpr, BEGIN NOW
    --DELETE RMTTRAIL c:ggsodirdatpr, EXTRACT PUMPA
    --参考
    --BEGIN NOW需要
    ADD EXTRACT PUMPA,EXTTRAILSOURCE c:ggsdirdatab, BEGIN NOW
    ADD RMTTRAIL C:ggsdirdatpr, 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:ggsdirdatex
    TABLE dbo.sp;
    TABLE dbo.test;

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

    SPECIALRUN
    END RUNTIME
    USERID scott, PASSWORD scott
    EXTFILE C:ggsdirdatex
    SOURCEDEFS C:ggsdirdef est_tabless.def
    MAP dbo.sp,target scott.sp;
    MAP dbo.test,target scott.test;

    --源: 提取数据到目标文件夹
    --报错:TCP/IP error 10061 (由于目标计算机积极拒绝,无法连接。), endpoint: orcl:7809
    exit
    .extract paramfile dirprminext.prm reportfile dirrptinext.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:ggsdirdef est_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;

  • 相关阅读:
    SQL Server数据库高级进阶之事务实战演练
    ASP.NET Core使用Nginx搭建高可用分布式Web集群
    C#签名算法HS256和RS256实战演练
    ASP.NET (Core)WebApi参数传递实操演练
    基于Windows服务实现的亚马逊云S3文件上传
    ASP.NET Core WebApi如何动态生成树形Json格式数据
    SQL Server数据库高级进阶之分布式唯一ID生成实战演练
    ASP.NET Core WebApi分布式文件系统FastDFS实战演练
    .Net Core使用NLog记录日志到文件和数据库实战演练
    ASP.NET Core开源任务调度框架Hangfire实战演练
  • 原文地址:https://www.cnblogs.com/buffercache/p/11671794.html
Copyright © 2020-2023  润新知