前言
OGG 23ai for PostgreSQL 23.7 近日发布了。最大的惊喜是支持从PostgreSQL的备库抽取数据,之前只支持从主库抽取,如果主库失败还得重建抽取进程。
这里我把从PostgreSQL流复制架构抽取数据的过程记录下来跟大家分享一下。
环境规划
本文采用5台虚拟机,其中一台安装Oracle 19.26和 OGG for Oracle 23.7.0.25.01,三个机器安装PGSQL 16.2,一台机器安装OGG 23ai for PostgreSQL 23.7.0.25.01从远程抽取和应用数据。
主机名 | IP | 操作系统 | 数据库版本 | OGG版本 |
ogg-pgsql00 | 172.16.1.7 | Oracle Linux 8.10 | oracle 19.26 | OGG for Oracle 23.7.0.25.01 |
ogg-pgsql01 | 172.16.1.8 | Oracle Linux 8.10 | PGSQL 16.2 |
|
ogg-pgsql02 | 172.16.1.9 | Oracle Linux 8.10 | PGSQL 16.2 |
|
ogg-pgsql03 | 172.16.1.10 | Oracle Linux 8.10 | PGSQL 16.2 |
|
ogg-pgsql04 | 172.16.1.11 | Oracle Linux 8.10 |
| OGG for PGSQL 23.7.0.25.01 |
Oracle 19.26采用多租户特性,建了两个PDB,pdb1和pdb2,PostgreSQL建了两个数据库test1和test2。实验过程会建立两个复制的链路,从oracle到PostgreSQL,pdb1是源库,test2是它的目标库。然后从PostgreSQL到oracle,test1是源库,pdb2是它的目标库。
配置Oracle数据库
ogg-pgsql00上安装数据库oracle 19.26,安装过程这里就省略了。
修改数据库为归档模式
SHUTDOWN immediate
STARTUP mount
ALTER SYSTEM SET log_archive_dest_1 = 'location=/arch';
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
CDB添加附加日志
ALTER DATABASE FORCE LOGGING;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
PDB添加附加日志
登录到pdb1,添加附加日志
alter session set container=pdb1;
ALTER PLUGGABLE DATABASE ADD SUPPLEMENTAL LOG DATA;
数据库开启OGG支持
ALTER SYSTEM SET enable_goldengate_replication = TRUE;
创建OGG用户
23ai开始可以可以不用CDB级别的抽取了,使用PDB里面的用户,因此需要在需要的PDB里创建ogg用户。
先创建OGG表空间
CREATE TABLESPACE OGG
DATAFILE
SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
LOGGING
ONLINE
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;
在PDB创建OGG用户
CREATE USER ogg IDENTIFIED BY ******
DEFAULT TABLESPACE ogg;
给OGG用户授权
EXEC dbms_goldengate_auth.grant_admin_privilege('OGG');
EXEC dbms_goldengate_auth.grant_admin_privilege('OGG','*', grant_optional_privileges=>'*');
GRANT DBA TO ogg;
如果归档存放在ASM中,还需要以下授权:
GRANT SELECT ON SYSTEM.logmnr_session$ TO ogg;
创建测试用户
在PDB1和PDB2中分别创建test用户
创建test表空间
CREATE TABLESPACE TEST
DATAFILE
SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
LOGGING
ONLINE
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;
创建用户
CREATE USER test IDENTIFIED BY ******* DEFAULT TABLESPACE test;
给test用户授权
GRANT CONNECT, RESOURCE, UNLIMITED TABLESPACE TO test;
GRANT UNLIMITED TABLESPACE TO test;
创建测试表
在PDB1和PDB2的test用户下面创建测试表
CREATE TABLE "TEST"."T1"
( "ID" NUMBER NOT NULL ENABLE,
"NAME" VARCHAR2(255),
"ADDRESS" VARCHAR2(255),
"AGE" NUMBER,
"BIRTHDAY" DATE,
PRIMARY KEY ("ID")
TABLESPACE "TEST";
配置TNS
为每个PDB创建TNS
PDB1=
(DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCP)
(HOST= ogg-pgsql00)
(PORT=1521)
)
(CONNECT_DATA=
(SERVICE_NAME=pdb1)
)
)
PDB2=
(DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCP)
(HOST= ogg-pgsql00)
(PORT=1521)
)
(CONNECT_DATA=
(SERVICE_NAME=pdb2)
)
)
创建OGG安装目录
创建OGG的安装目录,将可执行文件和部署目录分开
mkdir -p /ogg/oggma
mkdir -p /ogg/ogginst
chown -R oracle: /ogg
配置PostgreSQL流复制
安装PostgreSQL
ogg-pgsql01,ogg-myslq02,ogg-pgsql03上分别安装postgres 16.2。为了方便以下机器称为节点一、节点二、节点三,如果没有具体说明,操作需要所有机器上执行。
以下操作用默认用root执行
禁用SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
禁用防火墙
systemctl disable firewalld
systemctl stop firewalld
重启下服务器
reboot
安装PostgreSQL源
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
禁用DNF PostgreSQL模块
dnf -qy module disable postgresql
创建postgres用户
useradd postgres
给postgres用户设置密码
passwd postgres
安装PostgreSQL
dnf install -y postgresql16-server postgresql16-contrib
配置PostgreSQL流复制
配置postgres用户环境变量
用postgres用户配置,三个节点都要配置
export PG_HOME=/usr/pgsql-16
export PGDATA=/data/pgsql
export LD_LIBRARY_PATH=$PG_HOME/lib:$LD_LIBRARY_PATH
export PATH=$PG_HOME/bin:$PATH
创建挂载目录
mkdir /data
chown postgres: /data
初始化PostgreSQL
在节点一用postgres用户执行
/usr/pgsql-16/bin/initdb -D /data/pgsql -k
修改服务脚本
vim /usr/lib/systemd/system/postgresql-16.service
将Environment设置为
Environment=PGDATA=/data/pgsql
重载服务脚本
systemctl reload-daemon
在节点一启动postgres
systemctl start postgresql-16
创建归档目录
用postgres用户执行
mkdir /data/arch
创建流复制用户
登录psql之后执行下面语句:
SET password_encryption = 'scram-sha-256';
CREATE ROLE repl WITH REPLICATION LOGIN;
\password repl
\password postgres
给repl和postgres用户设置密码
编辑pg_hba.conf
加入下面的配置
host all all 172.16.0.0/16 scram-sha-256
host replication all 172.16.0.0/16 scram-sha-256
配置认证
cat > /home/postgres/.pgpass <<EOF
172.16.1.13:5432:replication:repl:*
172.16.1.14:5432:replication:repl:*
172.16.1.15:5432:replication:repl:*
172.16.1.13:5432:postgres:postgres:*
172.16.1.14:5432:postgres:postgres:*
172.16.1.15:5432:postgres:postgres:*
ogg-pgsql01:5432:replication:repl:*
ogg-pgsql02:5432:replication:repl:*
ogg-pgsql03:5432:replication:repl:*
ogg-pgsql01:5432:postgres:postgres:*
ogg-pgsql02:5432:postgres:postgres:*
ogg-pgsql03:5432:postgres:postgres:*
EOF
chmod 600 /home/postgres/.pgpass
将最后*号替换为repl和postgres用户的密码,我本机配置了dns,所有用主机名多一些
修改PostgreSQL配置文件
节点一:
cat >> /data/pgsql/postgresql.conf <<EOF
listen_addresses = '*'
port=5432
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
archive_mode = on
archive_command = 'cp "%p" "/data/arch/%f"'
max_wal_senders = 10
max_replication_slots = 10
wal_level = logical
hot_standby = on
wal_log_hints = on
EOF
节点一重启数据库
systemctl restart postgresql-16
创建备库
节点二复制,用postgre用户执行
pg_basebackup -h 172.16.1.13 -D /data/pgsql -U repl -P -v -R -X stream -C -S pgstandby1
节点三复制,用postgres用户执行
pg_basebackup -h 172.16.1.13 -D /data/pgsql -U repl -P -v -R -X stream -C -S pgstandby2
为了从备库提取数据,还需要在节点二和节点三/data/pgsql/postgresql.conf加入以下参数
recovery_target_timeline = 'latest'
hot_standby_feedback = on
启动备库
systemctl start postgresql-16
创建数据库
创建两个数据库
CREATE DATABASE "test1" WITH ENCODING = 'UTF8';
CREATE DATABASE "test2" WITH ENCODING = 'UTF8';
创建测试表
在test1和test2数据库都执行
CREATE TABLE "public"."t1" (
"ID" int4 NOT NULL,
"NAME" varchar(255) COLLATE "pg_catalog"."default",
"ADDRESS" varchar(255) COLLATE "pg_catalog"."default",
"AGE" int4,
"BIRTHDAY" timestamp(6)
);
ALTER TABLE "public"."t1" ADD CONSTRAINT "T1_pkey" PRIMARY KEY ("ID");
创建OGG用户
SET password_encryption = 'scram-sha-256';
CREATE ROLE ogg WITH REPLICATION LOGIN;
\password ogg
设置ogg用户密码
给ogg用户授权
ALTER ROLE ogg
SUPERUSER
CREATEDB
CREATEROLE;
创建ogg架构
在test1和test2数据库里执行
CREATE SCHEMA ogg
AUTHORIZATION ogg;
到此PostgreSQL的配置已经完成,下一步就说OGG的具体配置。
安装OGG
OGG for Oracle和OGG for Pgsql安装过程是一样的,这里就写一个,不再区分。
配置环境变量
修改oracle用户环境变量
cat>>~/.bash_profile<<EOF
export OGG_HOME=/ogg/oggma
export OGG_ETC_HOME=/ogg/ogginst/sm/etc
export OGG_VAR_HOME=/ogg/ogginst/sm/var
EOF
解压缩安装文件
unzip ggs_Linux_x64_Pgsql_services_shiphome.zip
安装OGG
cd ggs_Linux_x64_Pgsql_services_shiphome/Disk1/
./runInstaller
执行脚本
[root@ogg-pgsql04 ~]# /ogg/oraInventory/orainstRoot.sh
更改权限/ogg/oraInventory.
添加组的读取和写入权限。
删除全局的读取, 写入和执行权限。
更改组名/ogg/oraInventory 到 oinstall.
脚本的执行已完成。
部署OGG
使用oggca来部署OGG微服务,使用oracle用户执行
/ogg/oggma/bin/oggca.sh
配置OGG
配置数据库连接
打开浏览器输入oggip:9001登录
选择数据库连接
使用同样的过程为每个机器上的数据库都建立一个连接。
下面是oracle数据库的截图
添加trandata
点击连接主库上面test1数据库,添加trandata
Oracle的话,还是在PDB1里添加shematrandata。
添加checkpointtable
使用同样的方法在oracle PDB2里添加checkpointtable ogg.ckpt
配置PostgreSQL到oracle的同步
添加抽取
注册完成之后,为备库也创建复制槽,返回选择备库的连接名,点注册
这个时候页面会卡住,需要到主库上执行语句:
select * from pg_log_standby_snapshot();
重复执行,直至将在所有备库上注册。
现在是连接主库test1,用工具生成一万条数据。
可以看到捕捉到了主库上插入的1万条数据。下面把抽取停了
现在修改登录的数据库连接,指向备库,然后再用工具生成10000条数据
可以看到现在从备库上捕捉到了1万条数据。
添加分发路径
添加复制
再ogg for oracle上面执行
刷新同步状态,可以看到第一次抽取到的1万条数据
再接着刷新,可以看到总共插入了2万条记录。
配置Oracle到PostgreSQL同步
添加抽取
用工具生成1万条记录
添加分发路径
添加复制
复制链接得选主库的test2
最后看到写入了1万条数据。
使用OGG for PostgreSQL需要注意的地方
OGG for PostgreSQL不支持PgBouncer和Pgpool。
之前为了避免更改ip,特意学习了如何配置pgpool,但是pgpool配置成功后,OGG完全用不了。