OGG 从 Oracle 到 PostgreSQL 的同步复制 json 数据
标签:goldengate postgresql oracle json
平台环境:
源端 | 目标端 | |
系统 | Windows 8.1 | CentOS7 |
IP | 10.155.4.150 | 10.155.5.178 |
数据库 | Oracle 12.2.0.1.0 | postgresql 10.10-1 |
OGG版本 | GoldenGate 12.3.0.1.2 for oracle | Goldengate 12.2.0.1 for PostgreSQL |
一、源端配置:
(因为Oracle的数据库和OGG安装教程简单,此处不做介绍)
1.1 Oracle 数据库配置:
SQL> sqlplus / as sysdba;
SQL>archive log list;
SQL>shutdown immediate;
SQL>startup mount;
SQL>alter database archivelog; //打开归档模式
SQL>alter database open;
SQL> alter database force logging; //设置强制记录日志
SQL> alter database add supplemental log data; //增加附加日志
SQL> alter system switch logfile; //切换日志使附加日志生效
SQL> select log_mode,supplemental_log_data_min,force_logging from v$database;
LOG_MODE SUPPLEMENTAL_LOG FORCE_LOGGING
------------------------------------------------------------------------------
ARCHIVELOG YES YES
(这样就配置好了)
SQL> alter system set enable_goldengate_replication=true scope=both;(源端才有) //把OGG绑定到ORACLE上面
SQL> create user oracle identified by oracle; //创建源端被抽取用户
SQL> grant dba to oracle; //赋权
SQL>conn oracle/oracle;
//创建源表
SQL>CREATE TABLE jsontest(
id VARCHAR2 (32) NOT NULL PRIMARY KEY,
po_document VARCHAR2 (3000)
CONSTRAINT ensure_json CHECK (po_document IS JSON)
);
1.2 OGG配置:
进入oggs目录启动ggsci (默认port 7809,不用修改)
GGSCI (localhost) 1> dblogin userid oracle password oracle //登陆同步用户
GGSCI (localhost) 2> add trandata oracle.jsontest //为同步表添加trandata
添加Extract进程
GGSCI (localhost) 3> add extract ex2 integrated tranlog, begin now
GGSCI (localhost) 4> add exttrail ./dirdat/es extract ex2
GGSCI (localhost) 5> edit params ex2
extract ex2 dynamicresolution userid oggs,password oggs exttrail ./dirdat/es format release 12.2 //队列文件版本需要一致 table oracle.jsontest2;
添加Pump进程
GGSCI (localhost) 6> add extract pu2 exttrailsource ./dirdat/es, begin now
GGSCI (localhost) 7> add rmttrail ./dirdat/et extract pu2
GGSCI (localhost) 8> edit params pu2
extract pu2 rmthost 10.155.5.178, mgrport 7810 rmttrail ./dirdat/et table oracle.jsontest2;
二、目标端配置
2.1 Postgresql 数据库配置
PostgreSQL 安装教程请参考:https://www.cnblogs.com/freeweb/p/8006639.html
创建用于同步的数据库、用户和Schema,并创建测试表
postgres=# create database smandar;
postgres=# create user smandar superuser password ‘smandar‘;
postgres=# \c smandar smandar
smandar=# create schema smandar;
CREATE SCHEMA
smandar=# \dn
List of schemas
Name | Owner
---------+---------
public | smandar
smandar | smandar
(2 rows)
smandar=# CREATE TABLE jsontest
smandar-# (
smandar(# id varchar primary key,
smandar(# po_document json
smandar(# );
CREATE TABLE
smandar=# \d
List of relations
Schema | Name | Type | Owner
---------+-----------+-------+---------
smandar | jsontest | table | smandar
(1 rows)
2.2 OGG安装与配置
(1) 解压安装
$ cd /home/smandar/Oracle/Installation_package
$ unzip 122022_ggs_Linux_x64_PostgreSQL_64bit.zip
$ cd ..
$ mkdir ogg
$ mv Installation_package /ggs_Linux_x64_PostgreSQL_64bit.tar ogg/
$ tar vxf ggs_Linux_x64_PostgreSQL_64bit.tar
(2) 配置odbc数据源,goldengate 使用ODBC连接Postgres Database
$ cd /home/smandar/Oracle/ogg
$ vi odbc.ini
[ODBC Data Sources] GG_Postgres=DataDirect 10.10 PostgreSQL Wire Protocol [ODBC] IANAAppCodePage=106 InstallDir=/home/smandar/Oracle/ogg [GG_Postgres] Driver=/home/smandar/Oracle/ogg/lib/GGpsql25.so Description=DataDirect 10.10 PostgreSQL Wire Protocol Database=smandar HostName=127.0.0.1 PortNumber=5432 LogonID=smandar Password=smandar
[ODBC Data Sources] 里边配置该ODBC的别名,本文件中也就是GG_Postgres 后边的配置文件中的targetdb需要与这个对应
[ODBC]:
IANAAppCodePage 指的是字符集的设置 这里的106值得是UTF8,如果是4则为ISO-8859-1,注意这个应该始终和postgres的字符集设置相同,不同字符集对应的值见附件。
InstallDir 对应ogg的安装目录
[GG_Postgres]: 这里的名称对应的是上边ODBC的别名
Driver 这里指向的是ogg安装目录下的lib/GGpsql25.so
Description 是描述
Database 填写数据库名称
HostName 填写本机的hostname,可以解析的即可。
PosrNumber 是postgres的监听端口。
LogonID 填写postgres的用户名
password 填写postgres的密码
(3) 修改环境变量 vi ~/.bashrc
export LD_LIBRARY_PATH=/home/smandar/Oracle/ogg/lib:$LD_LIBRARY_PATH export PATH=$PATH:/home/smandar/Oracle/ogg export ODBCINI=/home/smandar/Oracle/ogg/odbc.ini
(4) 配置OGG
$ cd /home/smandar/Oracle /ogg
$ ./ggsci
GGSCI (localhost.localdomain) 1> create subdirs //创建子目录
GGSCI (localhost.localdomain) 2 > edit param mgr //配置mgr端口
port 7810
GGSCI (localhost.localdomain) 3 > dblogin sourcedb gg_postgres userid smandar //配置replicat进程
Password: //输入密码
GGSCI (localhost.localdomain) 4 > add replicat re2, exttrail ./dirdat/et, nodbcheckpoint
GGSCI (localhost.localdomain) 5 > edit param re2
replicat re2
targetdb gg_postgres, userid smandar, password smandar
assumetargetdefs
map oracle.jsontest2, target smandar.jsontest2;
三、测试
(1)启动OGG进程
源端的mgr进程、ex2进程、pu2进程
目标端的mgr,re2进程
(2)原始数据
源端:
目标端:
源端插入数据:
SQL>INSERT INTO jsontest2
VALUES ('001',
'{"PONumber" : 1600,
"Reference" : "ABULL-20140421",
"Requestor" : "Alexis Bull",
"User" : "ABULL"}');
SQL>commit;
目标端查询数据:
(以上结果说明成功同步数据)
附:
Oracle 对 json 数据进行查询:
Postgresql 对 json 数据进行查询: