pglogical 是 PostgreSQL 的逻辑复制插件,专注于PostgreSQL数据库间高效复制和同步数据。它支持选择性复制特定表或数据,而非整个数据库,从而提供灵活性和低延迟的实时更新。与物理复制相比,逻辑复制能够跨不同版本的 PostgreSQL,便于版本升级和数据迁移,同时支持多源复制,将多个源数据库的数据整合到同一目标数据库。这使得 pg_logical 特别适用于负载均衡、实时数据分析、灾难恢复和数据整合等多种场景。
IvorySQL作为完全兼容PG的Oracle兼容开源数据库,对pglogical也能做到完美支持。
1
安装环境
操作系统:CentOS Stream 9
数据库版本:IvorySQL 3.4、IvorySQL 3.3
pglogical版本:pglogical v2.4.4
2
安装过程
yum install -y zlib-devel pam-devel libxml2-devel libxslt-devel lz4-devel
wget https://github.com/2ndQuadrant/pglogical/archive/refs/tags/REL2_4_4.tar.gz
tar -xvf ./REL2_4_4.tar.gz
PATH=/usr/local/ivorysql/ivorysql-3/bin/:$PATH make clean all
sudo PATH=/usr/local/ivorysql/ivorysql-3/bin/:$PATH make install在主库与备库上,同时进行如下修改:
3
配置环境
在主库与备库上,同时进行如下修改:
在IvorySQL的data目录下,修改ivorysql.conf文件;
在 shared_preload_libraries中,添加pglogical。
同时,修改data目录下的postgresql.conf文件。
添加如下内容:
wal_level = 'logical'
max_worker_processes = 10
max_replication_slots = 10
max_wal_senders = 10
修改 listen_addresses = '*'
在 pg.hba.conf 中,
添加 host replication all 0.0.0.0/0 trust
配置修改完成后,启动或重启数据库。
4
使用过程
发布端IP: 192.168.21.205 (IvorySQL 3.4)
订阅端IP: 192.168.21.167 (IvorySQL 3.3)
>>>发布端
psql 连接数据库,执行create extension pglogical;
主库内添加测试表及初始数据
create table test_pglogical(id int primary key, name text);
insert into test_pglogical(1, 'test pglogical');
创建发布端node
SELECT pglogical.create_node(node_name := 'provider1',dsn := 'host=192.168.21.205 port=5432 dbname=ivorysql');
将发布端public仓库内的所有表,添加到名为default的replication中
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
>>>订阅端
psql 连接数据库,执行create extension pglogical;
创建相同数据库
create table test_pglogical(id int primary key, name text);
订阅端创建node
SELECT pglogical.create_node(node_name := 'subscriber1',dsn := 'host=192.168.21.167 port=5432 dbname=ivorysql');
订阅端创建订阅
SELECT pglogical.create_subscription( subscription_name := 'subscription1', provider_dsn := 'host=192.168.21.205 port=5432 dbname=ivorysql');
select * from test_pglogical;
我们就可以看到 IvorySQL可以完美支持pglogical。
5 Oracle 兼容及新增表同步
>>>发布端
创建含有Oracle数据类型的表
set ivorysql.compatible_mode to oracle;
create table test_oracle_type(id int primary key, name varchar2(20), value number(10));
insert into test_oracle_type values(1, 'oracle varchar 1', 1);
insert into test_oracle_type values(2, 'oracle varchar 2', 2);
将新建表添加到发布端的replication中
select pglogical.replication_set_add_table('default',relation:='public.test_oracle_type'::regclass,synchronize_data:=true);
>>>订阅端
set ivorysql.compatible_mode to oracle;
create table test_oracle_type(id int primary key, name varchar2(20), value number(10));
select * from test_oracle_type;
即可查看到新添加的表信息。
在发布端继续插入一些数据。
insert into test_oracle_type values(3, 'oracle varchar 3', 3);
select * from test_oracle_type;
发布端插入数据后,订阅端数据同步成功。