暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ogg实时同步oracle到postgresql,项目急急急啊....

ogg实时同步oracle到postgresql

xx库本来商定好了割接方案,但是由于割接时间要控制到2小时以内,之前的迁移方案有一些问题。某些历史表之前以为是静态数据可以提前迁移,但是经过讨论,开发说历史数据还会发生零星的update操作,所以只能采用实时同步的方案。

因为本次割接临时改方案,然后2天之后就得实施,没办法,只能拿出祖传的o gei gei软件来做了。

1. 下载ogg软件

既然是异构的迁移,我们首先要确认ogg是否支持我们的PostgreSQL版本。

从Oracle的MOS文档中可以确认一件事,OGG v19.x以上的版本可以支持Postgresql 12版本。所以我们下载介质到话,下载OGG地址https://www.oracle.com/middleware/technologies/goldengate-downloads.html#license-lightbox

Oracle GoldenGate 19.1.0.0.4 for Oracle on Linux x86-64

Oracle GoldenGate 19.1.0.0.200714 for PostgreSQL on Linux x86-64

2. Oracle侧配置

在Oracle这一侧我们需要先安装ogg软件。安装无图形界面,选择静默安装。

修改response中的oggcore.rsp文件

vi oggcore.rsp #-------------------------------------------------------------------------------# Specify the installation option.# Specify ORA19c for installing Oracle GoldenGate for Oracle Database 19c or#         ORA18c for installing Oracle GoldenGate for Oracle Database 18c or#         ORA12c for installing Oracle GoldenGate for Oracle Database 12c or#         ORA11g for installing Oracle GoldenGate for Oracle Database 11g #-------------------------------------------------------------------------------INSTALL_OPTION=ORA11g#-------------------------------------------------------------------------------# Specify a location to install Oracle GoldenGate#-------------------------------------------------------------------------------SOFTWARE_LOCATION=/ogg/goldengate#-------------------------------------------------------------------------------# Specify true to start the manager after installation. #-------------------------------------------------------------------------------START_MANAGER=false

主要配置三个地方:

  • INSTALL_OPTION 软件安装选项,我们的Oracle数据库版本是Oracle Database 11gR2,所以这里填ORA11g。

  • SOFTWARE_LOCATION ogg软件安装路径。

  • START_MANAGER 安装好之后是否立即启动MGR进程。

执行静默安装

cd /ogg/fbo_ggs_Linux_x64_shiphome/Disk1/response./runInstaller -silent -responseFile /ogg/fbo_ggs_Linux_x64_shiphome/Disk1/response/oggcore.rsp

ogg软件安装完成之后,进入到命令行,执行create subdirs创建相对应的目录。

create subdirs

接下来我们需要在Oracle数据库做一些配置

--创建OGG用户并赋权create tablespace goldengate datafile '+DATA' size 500autoextend oncreate user goldengate identified by goldengate default tablespace goldengate temporary tablespace TEMP quota unlimited on goldengate;--OGG用户在源端所需权限(DML)GRANT CONNECT TO goldengate;GRANT ALTER ANY TABLE TO goldengate;      GRANT ALTER SESSION TO goldengate;GRANT CREATE SESSION TO goldengate;GRANT FLASHBACK ANY TABLE TO goldengate;GRANT SELECT ANY DICTIONARY TO goldengate;GRANT SELECT ANY TABLE TO goldengate;GRANT RESOURCE TO goldengate;

数据库打开附加日志和SUPPLEMENTAL_LOG。

alter database force logging;ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;SYS@jifen1>select NAME,OPEN_MODE,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_MIN from v$database;NAME      OPEN_MODE            FOR SUPPLEME--------- -------------------- --- --------JIFEN     READ WRITE           YES YES

登录到ogg软件,添加CHECKPOINTTABLE,然后添加表级的附加日志。

EDIT PARAMS ./GLOBALSGGSCHEMA goldengateCHECKPOINTTABLE goldengate.ggschkptdblogin userid goldengate password xxxxxxxxADD CHECKPOINTTABLE  add trandata HBTLC.TF_ACC_DETAIL_1009

如果不执行add trandata添加表级的附加日志,在后面同步到时候会遇到OGG-00869 SQL error 0 (0x0)[Oracle][ODBC PostgreSQL Wire Protocol driver]Invalid character value. Error in parameter 4.的错误。

3.Oracle侧创建MGR、抽取、投递进程

在Oracle侧创建MGR进程

输入edit param mgr,配置如下:

PORT 7809DYNAMICPORTLIST 7800-8000AUTOSTART ER *AUTORESTART EXTRACT *,WAITMINUTES 2, RESETMINUTES 5PURGEOLDEXTRACTS /ogg/goldengate/dirdat/*,USECHECKPOINTS,MINKEEPDAYS 3LAGREPORTHOURS 1LAGINFOMINUTES 30LAGCRITICALMINUTES 45SYSLOG ERROR,WARN

启动mgr进程

start mgr
Oracle侧创建抽取进程

输入edit param extpg,配置如下:

edit param extpgEXTRACT extpgSETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)SETENV (ORACLE_HOME="/u01/app/oracle/product/11.2.0/db_1")SETENV (ORACLE_SID="jifen1")USERID goldengate, PASSWORD xxxxxxxxxDISCARDFILE /ogg/goldengate/dirrpt/extpg.dsc,APPEND,MEGABYTES 1024EXTTRAIL /ogg/goldengate/dirdat/aa tranlogoptions dblogreaderTABLE HBTLC.oggtest;table HBTLC.TF_ACC_DETAIL_1009

因为我这里的环境是RAC,所有的归档日志都存放在ASM里面,所以这里要加上tranlogoptions dblogreader选项。不然会出现ERROR   OGG-00446  Oracle GoldenGate Capture for Oracle的错误。

同时在数据库需要打开enable_goldengate_replication参数。

添加抽取进程

add extract extpg tranlog,begin now,threads 2;ADD EXTTRAIL /ogg/goldengate/dirdat/aa, EXTRACT extpg, megabytes 1000

启动抽取进程

start extpg
在Oracle侧创建投递进程

输入edit param dppg,配置如下:

EXTRACT DPPGSETENV (NLS_LANG=AMERICAN_AMERICA.ZHS16GBK)PASSTHRURMTHOST 133.0.117.4 MGRPORT 7809RMTTRAIL /app/ogg/dirdat/dpTABLE HBTLC.oggtest;table HBTLC.TF_ACC_DETAIL_1009;

添加投递进程

GGSCI (DBN03 as goldengate@jifen1) 80> add extract dppg,EXTTRAILSOURCE /ogg/goldengate/dirdat/aaEXTRACT added.GGSCI (DBN03 as goldengate@jifen1) 81> ADD RMTTRAIL /app/ogg/dirdat/dp, EXTRACT dppg, MEGABYTES 1000RMTTRAIL added.

启动投递进程

start dppg
在Oracle侧生成define文件

对于异构数据库同步,需要生成define文件,首先要在配置文件写上你需要迁移的表名。

edit params defgendefsfile ./dirdef/defgen.defuserid goldengate , password xxxxxxxxxxxTABLE HBTLC.TF_ACC_DETAIL_1009;TABLE HBTLC.oggtest;

配置完成之后,使用defgen命令生成定义文件。

[oracle@DBN03 goldengate]$ ./defgen paramfile ./dirprm/defgen.prm***********************************************************************defsfile ./dirdef/defgen.defuserid goldengate , password ***TABLE HBTLC.TF_ACC_DETAIL_1009;Retrieving definition for HBTLC.TF_ACC_DETAIL_1009.TABLE HBTLC.oggtest;Retrieving definition for HBTLC.OGGTEST.2021-06-09 00:21:09  WARNING OGG-06439  No unique key is defined for table OGGTEST. All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key.Definitions generated for 2 tables in ./dirdef/defgen.def.

如果你没有唯一键,ogg会使用all viable columns作为你的唯一键。

通过scp将定义文件传输到PostgreSQL端。

 scp defgen.def  postgresql@133.0.117.4:/app/postgresql

4.PostgreSQL侧创建mgr、配置odbc数据源、replicate进程

在PostgreSQL侧需要安装Oracle客户端。不安装客户端,ggsci都没办法启动。客户端我们只要去官网下载那种精简版的解压就行了。

然后我们要在PostgreSQL用户下增加和修改下列环境变量。

export GGATE=/app/oggexport ORACLE_HOME=/app/instantclientexport ODBCINI=$GGATE/odbc.iniexport LD_LIBRARY_PATH=$ORACLE_HOME:${PGHOME}/lib:$GGATE/lib:$LD_LIBRARY_PATH
  • GGATE 指定ogg的安装目录
  • ORACLE_HOME 指定oracle客户端的安装目录
  • ODBCINI 指定ODBC数据源的配置文件,这里先设上,等下再配置该文件。
  • LD_LIBRARY_PATH 指定各种lib的路径,这里要把ogg和路径、PG的路径、oracle客户端的路径都加上。

环境变量如果配置有问题,会出现以下的错误 ./ggsci: error while loading shared libraries: libGGicu25.so

在PostgreSQL上安装ogg软件

这里我没有新建操作系统用户,直接使用了postgreSQL用户安装。

unzip 19100200714_ggs_Linux_x64_PostgreSQL_64bit.zip tar -xvf ggs_Linux_x64_PostgreSQL_64bit.tar 

直接解压就能使用,但是前提是你需要配置好上面的环境变量。

GGSCI (DBN08) 1> create subdirs

这里直接ggsci进去把目录创建出来。

PostgreSQL数据库配置

我们要在PostgreSQL中创建goldengate用户,这里为了割接方便,直接赋的是superuser权限。

postgres=# create user goldengate superuser password 'xxxxxx';CREATE ROLE.

虽然权限有点大,但是考虑到割接完就可以删了,也就忍了。

配置管理进程

默认已经有个管理进程存在了,我们只需要修改一下配置,启动起来就行了。

edit param mgrPORT 7809

启动mgr进程

start mgr
配置checkpoint table

为了后面的数据校验,这里最好配置checkpoint table。

DBLOGIN SOURCEDB Postgres userid goldengateadd checkpointtable hbtlc.ggschkpt
配置复制进程

最后一步就是配置复制进程

edit param REMPGREPLICAT REMPGSOURCEDEFS /app/ogg/dirdef/defgen.defSETENV(PGCLIENTENCODING="UTF8" )SETENV(ODBCINI="/app/ogg/odbc.ini")SETENV(NLS_LANG="AMERICAN_AMERICA.AL32UTF8")TARGETDB Postgres,userid goldengate,password xxxxxxxxxDISCARDFILE /app/ogg/dirrpt/REMPG_aa.rpt, appendMAP HBTLC.oggtest, TARGET hbtlc.oggtest;

这里面有两个配置很重要,一个是SOURCEDEFS,这里需要指定我们从原库传过来的定义文件。第二个就是SETENV(ODBCINI="/app/ogg/odbc.ini"),这里指定一个odbc的配置文件,ogg将通过odbc来访问PG数据库。

这里的TARGETDB不是指PostgreSQL中数据库的名字,而是指定ODBC配置的数据源的名字。

odbcini的配置文件如下:

[ODBC Data Sources]  GG_Postgres=DataDirect 10 PostgreSQL Wire Protocol  [ODBC]  IANAAppCodePage=106InstallDir=/app/ogg[Postgres] Driver=/app/ogg/lib/GGpsql25.soDescription=DataDirect 10 PostgreSQL Wire ProtocolDatabase=jifenHostName=133.0.117.4PortNumber=5432  LogonID=goldengatePassword=xxxxxxxxx

注意,这里[Postgres]里面代表的是数据源的名字。

接下来启动复制进程就可以同步了

add replicat REMPG,exttrail /app/ogg/dirdat/dp,begin now,checkpointtable hbtlc.ggschkptREPLICAT added.start REPLICAT REMPG
测试同步是否正常
--Oracleinsert into oggtest values(1,'aaa');insert into oggtest values(2,'zzz');--PostgreSQLjifen=# select * from hbtlc.oggtest ;    id    | name ----------+------ 1.000000 | aaa 2.000000 | zzz(2 rows)

Oracle到PG,ogg的初始化如何做?

在搭建和配置好ogg软件之后,我们实现了能从Oracle到PostgreSQL的实时同步,但是我们还需要做的一件事是初始化,也就是把表的数据基于一个时间点导过去,然后复制进程根据导出的时间点进行后续的复制。

这个问题的难点就在于PostgreSQL并没有像Oracle一样的SCN。所以我们的方法如下:

创建基于SCN的视图

在Oracle数据库中创建基于scn号的视图。

jifen>select current_scn from v$database;CURRENT_SCN----------------------17379359410015SYS@jifen2>create view HBTLC.OGG_1011 as select * from HBTLC.TF_ACC_DETAIL_1011 as of scn 17379359410015;View created.

使用DataX将Oracle视图的数据导入到PostgreSQL

我们这里使用dataX软件,把oracle视图的数据导入到PostgreSQL的表中。你也可以使用其他的ETL软件来做这件事。DataX我们较为熟悉一些。

创建新的复制进程,基于SCN号开始复制

这份视图数据导入到PostgreSQL之后,接下来我们启动复制进程将scn-1就可以基于这之后进行复制了。

edit param RMPG1011REPLICAT RMPG1011SOURCEDEFS /app/ogg/dirdef/defgen.defSETENV(PGCLIENTENCODING="UTF8" )SETENV(ODBCINI="/app/ogg/odbc.ini")SETENV(NLS_LANG="AMERICAN_AMERICA.AL32UTF8")TARGETDB Postgres,userid goldengate,password xxxxxxxxxxDISCARDFILE /app/ogg/dirrpt/REMPG_aa.rpt, appendMAP HBTLC.TF_ACC_DETAIL_1011, TARGET hbtlc.TF_ACC_DETAIL_1011;add replicat RMPG1011,exttrail /app/ogg/dirdat/dp,checkpointtable hbtlc.ggschkptstart RMPG1011, aftercsn 17379359410014

数据一致性如何校验

因为我们在PostgreSQL创建了checkpointtable。这样我们能够提前对一些表进行核验。具体的核验方法如下:

1.停止复制进程

stop RMPG1018

2.在PostgreSQL数据库通过checkpointtable查看复制进程当前所在的scn号

jifen=# select log_csn from hbtlc.ggschkpt where group_name='RMPG1018';    log_csn     ---------------- 17381216337537

3.到Oracle数据库和PostgreSQL分别查询数据,核对是否一致。

Oracle侧要基于scn查询。

jifen1>col xa format 999999999999999999999jifen1>select sum(DETAIL_SEQ_ID) xa from hbtlc.TF_ACC_DETAIL_1018 as of scn 17381216337537;        XA----------------------280681007420939625

PostgreSQL因为停止了复制进程,可以直接查询

jifen=# select  sum(DETAIL_SEQ_ID) from hbtlc.TF_ACC_DETAIL_1018;        sum         -------------------- 280681007420939625

两边sum的核心字段,结果值一样。

当然还有其他的校验方法,比如将所有字段拼接在一起然后求hash值进行对比,这里仅供参考。

遇到的问题

最后说一下遇到的一个问题。

ogg在复制的时候进程挂掉,会报这样一类的error mapping或者是update where all key columns for target table的错误。引起这个问题的原因是分区表。Oracle的主键是创建在父表上的,而PG的主键是创建在子表上的。解决这个问题的方法是在ogg复制的配置文件中增加keycols强制指定主键。

MAP HBTLC.TF_ACC_DETAIL_1014, TARGET hbtlc.TF_ACC_DETAIL_1014 ,keycols (detail_seq_id);

后记

祖传ogg的手艺还好没有丢,不过ogg非开源软件,这次主要是时间比较紧就拿来临时用一下。

参考链接:

https://www.cnblogs.com/lottu/p/11466112.html

文章转载自励志成为postgresql大神,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论