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

王炸!OGG 23ai 终于支持从PostgreSQL备库抽取数据了

原创 曹海峰 2025-03-09
329

前言

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

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

执行脚本

[root@ogg-pgsql04 ~]# /ogg/oraInventory/orainstRoot.sh

更改权限/ogg/oraInventory.

添加组的读取和写入权限。

删除全局的读取, 写入和执行权限。

更改组名/ogg/oraInventory 到 oinstall.

脚本的执行已完成。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

部署OGG

使用oggca来部署OGG微服务,使用oracle用户执行

/ogg/oggma/bin/oggca.sh

图形用户界面, 应用程序

AI 生成的内容可能不正确。

配置OGG

配置数据库连接

打开浏览器输入oggip:9001登录

图形用户界面, 应用程序

AI 生成的内容可能不正确。

选择数据库连接

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

使用同样的过程为每个机器上的数据库都建立一个连接。

下面是oracle数据库的截图

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

添加trandata

点击连接主库上面test1数据库,添加trandata

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

Oracle的话,还是在PDB1里添加shematrandata。

图形用户界面, 表格

AI 生成的内容可能不正确。

添加checkpointtable

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

使用同样的方法在oracle PDB2里添加checkpointtable ogg.ckpt

图形用户界面, 应用程序

AI 生成的内容可能不正确。

配置PostgreSQL到oracle的同步

添加抽取

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

注册完成之后,为备库也创建复制槽,返回选择备库的连接名,点注册

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

这个时候页面会卡住,需要到主库上执行语句:

select * from pg_log_standby_snapshot();

重复执行,直至将在所有备库上注册。

图形用户界面, 应用程序, Word

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

现在是连接主库test1,用工具生成一万条数据。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

可以看到捕捉到了主库上插入的1万条数据。下面把抽取停了

图形用户界面, 应用程序

AI 生成的内容可能不正确。

现在修改登录的数据库连接,指向备库,然后再用工具生成10000条数据

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

可以看到现在从备库上捕捉到了1万条数据。

图形用户界面, 应用程序, Word

AI 生成的内容可能不正确。

添加分发路径

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

添加复制

再ogg for oracle上面执行

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

刷新同步状态,可以看到第一次抽取到的1万条数据

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。再接着刷新,可以看到总共插入了2万条记录。

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

配置Oracle到PostgreSQL同步

添加抽取

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。 用工具生成1万条记录

添加分发路径

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

添加复制

复制链接得选主库的test2

图形用户界面, 应用程序

AI 生成的内容可能不正确。

最后看到写入了1万条数据。

使用OGG for PostgreSQL需要注意的地方

OGG for PostgreSQL不支持PgBouncer和Pgpool。

之前为了避免更改ip,特意学习了如何配置pgpool,但是pgpool配置成功后,OGG完全用不了。

最后修改时间:2025-03-12 22:10:48
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论