最近公司业务需要安装个OGG做数据同步,也是踩了很多坑花了四天才搭建好,网上相关的帖子并不是很多,一些细节问题被提及的也很少。所以整理了下自己这次搭建OGG工具的经验,以及其中可能会遇到的一些坑及相关解决方法。
oracle源端和postgresql目标端服务器都要安装对应的OGG,postgresql还需额外安装ODBCPostgres驱动
OGG下载地址:https://www.oracle.com/middleware/technologies/goldengate-downloads.html
下载对应OGG软件分别上传至各自服务器
1.1.创建GoldenGate操作系统用户
useradd ogg
passwd ogg
1.2.创建GoldenGate安装目录
mkdir -p /data/ogg
chown -R ogg:ogg /data/ogg
1.3.安装GoldenGate
将下载的oracle对应的OGG软件移动至 /data/ogg下,执行以下代码
unzip fbo_ggs_Linux_x64_ora11g_64bit.tar.zip
tar -xvf fbo_ggs_Linux_x64_ora11g_64bit.tar -C /data/ogg
1.4.配置GoldenGate环境变量
oracle默认安装在 /data目录下
export GGATE=/data/ogg
export ORACLE_BASE=/data
export ORACLE_HOME=/data/oracle
export PATH=$PATH:$GGATE:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$GGATE:$LD_LIBRARY_PATH
alias sqlplus='rlwrap sqlplus'
alias ggsci='rlwrap ggsci'
1.5.配置Oracle数据库
打开数据库归档
SQL> alter system set log_archive_dest_1 = 'LOCATION=/data/arch' scope = spfile;
SQL> shutdown immediate;
SQL> startup mount
SQL> alter database archivelog;
SQL> alter database open;
# 查看归档模式
SQL> archive log list
# 还需要开启 force log 和 supplemental log
SQL> alter database force logging;
SQL> alter database add SUPPLEMENTAL log data;
# 查询结果
SQL> select NAME,OPEN_MODE,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_MIN from v$database;
NAME OPEN_MODE FOR SUPPLEME
--------- -------------------- --- --------
ORA235 READ WRITE YES YES
1.6.oracle创建用户ogg
# 切换oracle用户
su - oracle
# 进入sql编辑模式
sqlplus / as sysdba
# 建议使用单独的表空间存放 GoldenGate 数据
create tablespace tsp_ogg datafile '/data/oracle/data/ogg01.dbf' size 512M autoextend on;
# 创建 GoldenGate 用户并赋权
create user ogg identified by ogg default tablespace tsp_ogg;
grant dba to ogg;
# 严谨一些;这样赋权
grant connect, resource TO ogg;
grant select any dictionary, select any table TO ogg;
grant flashback any table TO ogg;
grant execute on dbms_flashback TO ogg;
1.7.创建GoldenGate的工作目录
# 进入ogg安装目录下
cd /data/ogg
# 执行ggsci,若报错,参照文后错误处理方式
ggsci
# ggsci下执行代码创建工作目录
GGSCI (oracle221) 1> create subdirs
Creating subdirectories under current directory /data/ogg
Parameter files /data/ogg/dirprm: already exists
Report files /data/ogg/dirrpt: created
Checkpoint files /data/ogg/dirchk: created
Process status files /data/ogg/dirpcs: created
SQL script files /data/ogg/dirsql: created
Database definitions files /data/ogg/dirdef: created
Extract data files /data/ogg/dirdat: created
Temporary files /data/ogg/dirtmp: created
Stdout files /data/ogg/dirout: created
如执行ggsci时报错:-bash: ggsci: command not found
则为环境变量非永久变量导致,执行以下代码重新设置环境变量即可解决
export PATH=/data/oracle/product/11.2.0/bin:$PATH:/data/ogg
export LD_LIBRARY_PATH=/data/oracle/product/11.2.0/lib:/data/ogg/lib
1.8.配置进程组
负责启动GoldenGate进程,以及启动动态进程,管理trail文件,错误信息。
# 编辑参数文件
GGSCI (oracle221) 2> edit params mgr
# 复制如下内容至文件内,酌情修改参数保存
PORT 7809
DYNAMICPORTLIST 7800-8000 //指定服务监听端口;默认端口为7809
AUTOSTART ER * //动态端口.可以制定最大256个可用端口的动态列表
AUTORESTART EXTRACT *,WAITMINUTES 2, RESETMINUTES 5 //自动重启参数设置
PURGEOLDEXTRACTS /data/ogg/dirdat/*,USECHECKPOINTS,MINKEEPDAYS 3 //定期清理trail文件设置
LAGREPORTHOURS 1
LAGINFOMINUTES 30
LAGCRITICALMINUTES 45
SYSLOG ERROR,WARN
# 启动mgr
GGSCI (oracle221) 3> start mgr
Manager started.
# 查看详情,正常启动状态为RUNNING
GGSCI (oracle221) 4> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
1.9.配置Extract进程
负责抓取需要传输数据,下面代码为配置抽取进程并启动
# 编辑参数文件
GGSCI (oracle221) 5> edit params EORA_1
# 复制如下内容至文件内,酌情修改参数保存
EXTRACT EORA_1
SETENV (NLS_LANG=AMERICAN_AMERICA.UTF8)
SETENV (ORACLE_HOME="/data/oracle") //Oracle环境变量
SETENV (ORACLE_SID="oral") //oracle_sid
USERID ogg, PASSWORD ogg //数据库用户、密码
DISCARDFILE /data/ogg/dirrpt/EORA_1.dsc,APPEND,MEGABYTES 1024
EXTTRAIL /data/ogg/dirdat/aa
TABLE lottu.*; //指定的表名
# 创建 extract 组;
GGSCI (oracle221) 6> ADD EXTRACT EORA_1, TRANLOG, BEGIN NOW
EXTRACT added.
# 创建本地 trail 文件
GGSCI (oracle221) 7> ADD EXTTRAIL /data/ogg/dirdat/aa, EXTRACT EORA_1, MEGABYTES 5
EXTTRAIL added.
# 启动extract进程
GGSCI (oracle221) 8> start extract eora_1
Sending START request to MANAGER ...
EXTRACT EORA_1 starting
# 查看全部进程
GGSCI (oracle221) 9> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EORA_1 00:00:33 00:00:0
如果忘记ORACLE_SID是什么可以在oracle下执行如下sql语句查询
select instance_name from V$instance;
1.10.配置Pump进程
extract进程负责将抓取的数据写入本地trail文件;而需要Pump进程把trail文件传输到目标端
# 编辑参数文件
GGSCI (oracle221) 10> EDIT PARAMS PORA_1
# 复制如下内容至文件内,酌情修改参数保存
EXTRACT PORA_1
SETENV (NLS_LANG=AMERICAN_AMERICA.UTF8)
PASSTHRU
RMTHOST 192.168.11.xxx, MGRPORT 7809 //目标服务器和端口
RMTTRAIL /data/ogg/dirdat/pa
TABLE lottu.*;
# 用 add extract 指定本地 trail 文件
ADD EXTRACT PORA_1, EXTTRAILSOURCE /data/ogg/dirdat/aa
# 用 add rmttrail 指定远程 trail 文件
ADD RMTTRAIL /data/ogg/dirdat/pa, EXTRACT PORA_1, MEGABYTES 5
# 启动Pump 进程
START EXTRACT PORA
1.11.生成define文件
在异构的同步复制;需要生成define文件。用于数据兼容不同数据库。
# 编辑参数文件
GGSCI (oracle221) 16> edit params defgen
# 参数文件内容
defsfile ./dirdef/defgen.def
userid ogg, password ogg
TABLE lottu.*;
# 退出ggsci命令
GGSCI (oracle221) 17> exit
# root用户下生成文件
defgen paramfile ./dirprm/defgen.prm
# 传送到目标端
scp /data/ogg/dirdef/defgen_postgres.prm ogg@192.168.10.15:/data/ogg/dirdef
二.目标端(postgresql)配置OGG
2.1.创建GoldenGate操作系统用户
useradd ogg
passwd ogg
2.2.创建GoldenGate安装目录
mkdir -p /data/ogg
chown -R ogg:ogg /data/ogg
2.3.安装GoldenGate
将下载的postgresql对应的OGG软件移动至 /data/ogg下,执行以下代码
unzip 122022_ggs_Linux_x64_PostgreSQL_64bit.zip
tar -xvf ggs_Linux_x64_PostgreSQL_64bit.tar -C /data/ogg
2.4.配置GoldenGate环境变量
export GGATE=/data/ogg
export PGHOME=/opt/pgsql10
export PGDATA=/data/postgres/data1
export PATH=$PGHOME/bin:$HOME/bin:$GGATE:$PATH
export LD_LIBRARY_PATH=$PGHOME/lib:$GGATE/lib:$LD_LIBRARY_PATH
export ODBCINI=$GGATE/odbc.ini
alias ggsci='rlwrap ggsci'
2.5.创建复制用户
# 切换postgresql用户
su - postgres
# 进入sql编辑模式
psql
# 执行如下语句,进入pg数据库创建测试用户
$ psql
create database oggtest;
create user ogg superuser password 'ogg';
\c oggtest ogg
create schema ggs_owner;
create table test01(id int primary key,name varchar(10),age int);
2.6.创建DSN
ogg for pg使用的是ODBC来连接数据库,因此需要指明ODBC dirver
$ cd /data/ogg
$ vi odbc.ini
复制粘贴下面内容,修改参数,保存
[ODBC Data Sources] //定义的数据库别名,后面的【postgre】部分与之对应
GG_Postgres=DataDirect 10.6 PostgreSQL Wire Protocol
[ODBC]
IANAAppCodePage=106 //字符集,应该与数据库的字符集对应,106代表UTF-8
InstallDir=/data/ogg //ogg安装目录
[GG_Postgres]
Driver=/data/ogg/lib/GGpsql25.so //OGG安装包里有内置ODBC驱动
Description=DataDirect 10.6 PostgreSQL Wire Protocol //介绍
Database=postgres //表空间
HostName=localhost //一般是本地地址
PortNumber=5432 //端口
LogonID=postgres //数据库用户名
Password=postgres //数据库密码
--------------------------------------------------
2.7.创建GoldenGate工作目录
# 进入ogg安装目录
cd /data/ogg
# 进入ggsci,如报错,参考文后对应解决方案
ggsci
# 创建工作目录
GGSCI (oracle221) 1> create subdirs
如执行ggsci时报错:-bash: ggsci: command not found
则为环境变量非永久变量导致,执行以下代码重新设置环境变量即可解决
export PATH=/usr/pgsql-12/bin:$PATH:/data/ogg
export LD_LIBRARY_PATH=/usr/pgsql-12/lib:/data/ogg/lib
2.8.配置MGR进程组
# 编辑mgr
GGSCI (oracle221) 1>EDIT param mgr
# 复制以下内容,保存(此端口要与源端Pump进程里配置的对应)
PORT 7809
# 启动mgr
GGSCI (oracle221) 2>start mgr
2.9.添加checkPoint表
为了保证源和目标端在传数据的时候不会重复或者少传,在目标端添加checkpoin表
GGSCI (oracle221) 1>dblogin sourcedb GG_Postgres userid ogg
GGSCI (oracle as postgres@GG_Postgres) 4>add checkpointtable ogg.checkpointtab
若执行dblogin后报错如下内容,则为环境变量失效(默认没有配置永久环境变量)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NCrYwASk-1629441680703)(file:////tmp/wps-fangqian/ksohtml/wpsvwlOGW.jpg)]
解决方法:退出到root用户,执行如下代码重新配置odbc.ini环境变量即可解决
export ODBCINI=/data/ogg/odbc.ini
2.10.配置Replicat进程
# 编辑参数文件
GGSCI (lottu02) 1> EDIT PARAMS RORA_1
# 复制如下内容,酌情修改参数,保存
REPLICAT RORA_1
SOURCEDEFS /data/ogg/dirdef/defgen.def //之前源端传过来的文件
SETENV(PGCLIENTENCODING = "UTF8" )
SETENV(ODBCINI="/data/ogg/odbc.ini" ) //odbc.ini路径配置
SETENV(NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
TARGETDB GG_Postgres,userid ogg,password ogg //数据库,用户,密码
DISCARDFILE /data/ogg/dirrpt/RORA_aa.rpt, append
MAP lottu.*, TARGET lottu.*; //源表空间,目标表空间
# 添加 Replicat 进程
GGSCI (lottu02) 1> add replicat RORA_1,exttrail /data/ogg/dirdat/pa,begin now,checkpointtable ogg.checkpointtab
# 启动 Replicat 进程
GGSCI (lottu02) 1> start REPLICAT RORA_1
# 查看全部进程
GGSCI (lottu02) 1> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING RORA_1 00:00:00 00:00:05
三.验证
此时双端状态如下,可自行插入数据进行测试
# 源端
GGSCI (oracle221) 1> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EORA_1 00:00:00 00:00:02
EXTRACT RUNNING PORA_1 00:00:00 00:00:09
# 目标端
GGSCI (lottu02) 2> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING RORA_1 00:00:00 00:00:03
# 测试同步oracle插入数据
insert into tbl_lottu values (1001,'lottu');
# 测试同步PostgreSQL查询数据
lottu=> select * from tbl_lottu;
id | name
------+-------
1001 | lottu
四.相关驱动安装
postgresql端需要额外安装OdbcPostgresql驱动,如下为安装方法
# 安装UnixODBC(也可不必安装,OGG安装包自带ODBC驱动)
yum install -y unixODBC.x86_64
#验证安装
rpm -qa | grep postgresql-odbc
# 安装PostgresqlODBC
yum install -y postgresql-odbc.x86_64
验证安装
rpm -qa | grep postgresql-odbc
1.配置odbcinst.ini
# 查看并编辑参数文件
vim /etc/odbcinst.ini
# 文件内内容大概如下,可手动复制和修改
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[PostgreSQL]
Description = ODBC for PostgreSQL
Driver = /usr/lib64/psqlodbcw.so
Setup = /usr/lib64/libodbcpsqlS.so
Driver64 = /usr/lib64/psqlodbcw.so
Setup64 = /usr/lib64/libodbcpsqlS.so
FileUsage = 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2.配置odbc
# 编辑参数文件
vim /etc/odbc.ini
# 复制如下内容编辑并保存
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[GG_Postgres]
Description = Test to pg
Driver = PostgreSQL
Database = postgres
Servername = localhost
UserName = postgres
Password = admin
Port = 5432
ReadOnly = 0
ConnSettings = set client_encoding to UTF8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3.登录测试
# 使用ODBC登录Postgresql数据库
isql postgres 用户名 密码
# 登录成功会有如下提示
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
4.报错处理
若报如下错,则安装ODBC驱动缺少环境,执行如下代码即可解决
./configure --x-includes=/usr/include/X11 --x-libraries=/usr/lib/X11