使用ogg实现oracle到postgresql表的实时同步

1.参考

Oracle GoldenGate 12c官方文档

配置Goldengate从Oracle到PostgreSQL的同步复制

2.安装

环境:oracle 11.2.0.4+centos6.9,postgresql10.6+centos6.9

ogg下载

下载网址:https://www.oracle.com/technetwork/middleware/goldengate/downloads/index.html

     http://edelivery.oracle.com/

下载安装包如下:122022_ggs_Linux_x64_PostgreSQL_64bit.zip,V861007-01.zip

3.源端安装配置

3.1.源端ogg安装

# oracle用户执行
cd /data/
mkdir ogg
cd /data/software
unzip V861007-01.Zip
cd fbo_ggs_Linux_x64_shiphome/Disk1/
export DISPLAY=xxx.xxx.xxx.xxx:0.0
./runInstaller

执行命令后,会出现图形化界面

选择安装对应版本oracle的ogg

指定ogg安装路径,配置mgr参数

报错:

只是因为我已经安装过一次了,因此上一次OGG安装目录中已经存在于OGG的安装清单(inventory.xml)里面,解决方法如下:

# root用户执行
find / -name inventory.xml
su - oracle
vi /oracle/oraInventory/ContentsXML/inventory.xml
#删除如下一行即可
<HOME NAME="OraHome1" LOC="/data/ogg" TYPE="O" IDX="2"/>

删除后,点击cancel取消,再次进入图形化界面即可。

3.2.源端ogg配置

打开归档

alter database archivelog;

打开允许ogg复制,打开附件日志(UPDATE更新redo会记录所有的栏位,会增加redo量)

-- 全库打开附件日志,后续不需要对单独的表增加附件日志
alter system set enable_goldengate_replication=true;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
-- 也可以用如下方法,打开最小附加日志,之后对需要OGG的表单独增加附加日志
alter database add supplemental log data;
-- 这一句后续在OGG中执行
add trandata user.table  

修改环境变量

vi .bash_Profile
export GGATE-/data/ogg
export PATH=$PATH:$GGATE
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$GGATE

新增ogg用户并赋权

create tablespace ggs_data datafile '/data/db/ggs_data01.dbf' size 1g;
create user ggs_owner identified by xxxxxx default tablespace ggs_data temporary tablespace temp quota unlimited on ggs_data;
grant connect, resource TO ggs_owner;
GRANT select any dictionary, select any table TO ggs_owner;    
grant flashback any table TO ggs_owner;
grant execute on dbms_flashback TO ggs_owner;

新增ogg抽取进程

edit param mgr    
add extract ext_demo,tranlog,begin now
edit param ext_demo
########################################################
extract ext_demo
setenv (NLS_LANG="TRADITIONAL CHINESE_TAIWAN.AL32UTF8")   
setenv (ORACLE_SID=db)
userid ggs_owner,password xxxxxx
exttrail /data/ogg/dirdat/ed
table USER01.TEST01; 
########################################################
add exttrail /data/ogg/dirdat/ed,extract ext_demo

新增ogg传送进程

add extract pup_demo exttrailsource /data/ogg/dirdat/ed 
edit param pup_demo
########################################################
extract pup_demo
setenv (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
setenv (ORACLE_SID=db)
rmthost xxx.xxx.xxx.xxx,mgrport 7809,compress
rmttrail /data/ogg/dirdat/rd
table USER01.TEST01;
########################################################
add rmttrail /data/ogg/dirdat/rd,extract pup_demo

生成源端定义文件(oracle和pg的数据类型不同,感觉是为了类型转换,没有测试如果不使用会如何)

vi ./dirprm/defgen.prm
DEFSFILE ./dirdef/defgen_postgres.prm;
userid ggs_owner,password xxxxxx;
table USER01.TEST01;
defgen paramfile ./dirprm/defgen.prm

4.目标端安装配置

解压安装

# postgres用户执行
cd /data/software/
unzip 122022_ggs_Linux_x64_PostgreSQL_64bit.zip
cd /data/
mkdir ogg
mv software/ggs_Linux_x64_PostgreSQL_64bit.tar ogg/
tar vxf ggs_Linux_x64_PostgreSQL_64bit.tar

创建子目录

# postgres用户执行
cd /data/ogg
ggsci
create subdirs

创建DSN(database source name)

ogg for pg使用的是ODBC来连接数据库,因此需要指明ODBC dirver

[ODBC Data Sources]:定义的数据库别名,后面的【postgre】部分与之对应

IANAAppCodePage:字符集,应该与postgresql数据库的字符集对应,106代表的是UTF-8

# postgres用户执行
cd /data/ogg
vi odbc.ini
################################################
[ODBC Data Sources]
postgre=DataDirect 10.6 PostgreSQL Wire Protocol

[ODBC]
IANAAppCodePage=106
InstallDir=/data/ogg

[postgre]
Driver=/data/ogg/lib/GGpsql25.so
Description=DataDirect 10.6 PostgreSQL Wire Protocol
Database=pgdb
HostName=xxx.xxx.xxx.xxx
PortNumber=5432
LogonID=ggs_owner
Password=xxxxxx
################################################

修改postgres环境变量

重点是动态连接库和ODBCINI的环境变量

export GGATE=/data/ogg
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GGATE/lib
export PATH=$PATH:$PGHOME/bin/:$GGATE
export ODBCINI=$GGATE/odbc.ini

进入pg数据库创建测试用户(其实应该在创建odbc.ini之前执行)

# postgres用户执行
psql
create database oggtest;
create user ggs_owner superuser password 'xxxxxx';
\c oggtest ggs_owner
create schema ggs_owner;
create table test01(id int primary key,name varchar(10),age int);

修改mgr参数

# postgresql用户执行
cd $GGATE
ggsci
edit param mgr
########################
PORT 7089
########################

新增checkpoint

需要注意,sourcedb必须与odbc.ini中配置的ODBC Data source相同,这样ogg才可以找到要登录的数据库(加入一个主机上有好几个数据库),因此odbc.ini可以用来区分复制进程所属数据库

# ogg中执行如下
dblogin sourcedb postgre userid ggs_owner
add checkpointtable ggs_owner.checkpointtab

新增复制进程

经测试,ODBCINI无需写入参数环境变量中,因为在postgres环境变量中已设定

# postgres用户执行
cd $GGATE
mkdir dircard
edit param rep_demo
############################################################
replicat rep_demo
SOURCEDEFS ./dirdef/defgen_postgres.prm
SETENV(PGCLIENTENCODING = "UTF8" )
SETENV(ODBCINI="/ogg/odbc.ini" )
SETENV(NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
TARGETDB postgre,userid ggs_owner,password xxxxxx
DISCARDFILE ./discard/rep_demo.txt
map user01.test01 ,target ggs_owner.test01;
############################################################
add replicat rep_demo,exttrail /data/ogg/dirdat/rd,begin now,checkpointtable ggs_owner.checkpointtab

将定义文件传送过来

scp oracle@xxx.xxx.xxx.xxx:/data/ogg/dirdef/defgen_postgres.prm  /data/ogg/dirdef

开启进程并测试

posted @ 2019-07-04 11:29  monkey6  阅读(3867)  评论(0编辑  收藏  举报