
点击蓝字关注我们
毋庸置疑,升级数据库是一项重要任务。许多公司的数据库服务器尽量避免升级,因为无法承受业务停机/维护窗口。因此,他们会尽量努力解决在更高版本中已经解决的问题和错误,并且不熟悉新版本中引入的功能。
版本升级业界也有各种各样的实现方法,本文介绍可以使用EDB Postgres Replication Server (xDB),简称EPRS。 xDB可以通过在相同或不同主机上不同主要版本的两个节点之间创建逻辑复制,帮助用户在不停机的情况下升级到最新的主要版本。
EDB Postgres Replication Server复制服务器(EPRS)可以安装在运行数据库的主机上,也可以安装在能够连接到运行数据库的网络环境中的任意一台主机上。
一、EPRS 简介
EDB Postgres Replication Server(EPRS)是一个可用于PostgreSQL和EDB Postgres Advanced Server的异步复制系统。
可以使用Replication Server来实现基于两种不同复制模型之一的复制系统:单主Single-Master(主到从)复制或多主Multi-Master复制。无论采用何种复制模型,Replication Server都非常灵活且易于使用。
对于单主(Single-Master)复制,通常称为SMR,可以支持PostgreSQL、EDB Postgres Advanced Server、Oracle和Microsoft SQL Server的多种配置(包括级联复制),可以在多种场景用例使用SMR,并且有多种优势。
以下罗列在SMR配置下EPRS支持的跨数据库组合:
从 Oracle 到 PostgreSQL
从 Oracle 到 EDB Postgres Advanced Server
从 SQL Server 到 PostgreSQL
从 SQL Server 到 EDB Postgres Advanced Server
从EDB Postgres Advanced Server到Oracle
从 PostgreSQL 到 SQL Server
从 EDB Postgres Advanced Server 到 SQL Server
PostgreSQL 和 EDB Postgres Advanced Server之间
从 PostgreSQL 到 Oracle(WAL 模式)
从PostgreSQL到Oracle(触发器模式)
Note:EPRS不支持 Oracle Real Application Clusters (RAC) 和 Oracle Exadata。这些 Oracle 产品未经过 Replication Server 评估或认证。
对多主复制MMR模式下,支持以下组合配置:
PostgreSQL 数据库服务器之间
PostgreSQL 数据库服务器和 EDB Postgres Advanced Servers(PostgreSQL兼容运行模式)之间
EDB Postgres Advanced Server( PostgreSQL兼容运行模式)之间
EDB Postgres Advanced Server (Oracle兼容运行模式)之间
可以将以下数据库产品版本与 Replication Server 结合使用:
PostgreSQL 版本 13、14、15、16 和 17
EDB Postgres Advanced Server版本 13、14、15、16 和 17
Oracle 11g R2 11.2.0.2.0 经过认证。 11.2 系列中较新的次要版本也支持。
Oracle 12c 版本 12.1.0.2.0 经过认证。还支持12.1系列中较新的次要版本。
Oracle 18c 版本 18.1.0.2.0 经过认证。还支持18.1系列中较新的次要版本。
Oracle 19c 版本 19.1.0.2.0 经过认证。还支持19.1系列中较新的次要版本。
SQL Server 2014 版本 12.0.5000.0 经过认证。还支持12.0系列中较新的次要版本。
Notr:EDB Postgres Distributed (PGD) v5.3.0 已明确认证为触发器模式的发布数据库以及触发器模式和wal模式的订阅数据库。
从 Replication Server 7.1.0 开始:
SQL Server 2016 版本13.00.5026经过明确认证。还支持13.0系列中较新的次要版本。
SQL Server 2017 版本14.0.1000.169经过明确认证。还支持14.0系列中较新的次要版本。
SQL Server 2019 版本15.0.2000.5经过明确认证。还支持15.0系列中较新的次要版本。
EPRS作为异构数据库之间的迁移工具,以及SMR和MMR的架构及其复制原理,本文暂不作详细介绍,后续文章我们再做介绍。
本文主要是验证通过EPRS的SMR运行模式,通过publication和subscription实现EPAS版本从15在线升级到16的验证。
二、EPRS 的安装
本例假设已经安装并运行EPAS 15数据库服务器。同时我们安装好另一台EPAS 16数据库服务器,为了节省机器,我们安装EPRS在EPAS 15的数据库服务器上。
EPRS是用Java编写的工具,所以在安装之前需要安装Java。我们当前运行环境采用Oracle Linux 8.5,支持Red Hat OpenJDK 8 和 Oracle JDK 8.
2.1 安装JDK 8
sudo dnf install java-1.8.0-openjdk
[nuser@epas-15 bin]$ alternatives --list |grep java
复制
java auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.432.b06-2.0.1.el8.x86_64/jre/bin/java
jre_openjdk auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.432.b06-2.0.1.el8.x86_64/jre
jre_1.8.0 auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.432.b06-2.0.1.el8.x86_64/jre
javac auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.432.b06-2.0.1.el8.x86_64/bin/javac
java_sdk_openjdk auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.432.b06-2.0.1.el8.x86_64
java_sdk_1.8.0 auto
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.432.b06-2.0.1.el8.x86_64
java_sdk_1.8.0_openjdk auto /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.432.b06-2.0.1.el8.x86_64
复制
查看java的安装路径为/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.432.b06-2.0.1.el8.x86_64/jre/bin/java
[nuser@epas-15 bin]$ java -version
复制
openjdk version "1.8.0_432"
OpenJDK Runtime Environment (build 1.8.0_432-b06)
OpenJDK 64-Bit Server VM (build 25.432-b06, mixed mode)
复制
2.2 安装 EPRS
设置EDB repository,之前已经安装EPAS15,所以repository已经配好,也可以获得自己的token,然后按下面脚本安装repository。
curl -1sSLf 'https://downloads.enterprisedb.com/<token>/enterprise/setup.rpm.sh'| sudo -E bash
复制
[nuser@epas-15 ~]$ sudo dnf -y install edb-xdb
复制
系统会自动安装edb-xdb-console和edb-xdb-publisher和edb-xdb-subscriber和edb-xdb-libs软件包。
2.3 安装 JDBC 驱动
EPRS通过JDBC连接数据,所以需要安装相应的jdbc数据库驱动,连接不同的数据库需要下载对应的jdbc驱动,本例我们下载edb-jdbc驱动。
[nuser@epas-15 ~]$ sudo dnf -y install edb-jdbc
复制
驱动安装在edb目录下的jdbc目录, usr/edb/jdbc
[nuser@epas-15 usr]$ ls -l usr/edb/jdbc/
复制
total 1204
-rw-r--r--. 1 root root 1213951 Nov 11 20:06 edb-jdbc18.jar
lrwxrwxrwx. 1 root root 14 Nov 11 20:06 edb-jdbc-42.7.3.2.jar -> edb-jdbc18.jar
lrwxrwxrwx. 1 root root 21 Nov 11 20:06 edb-jdbc.jar -> edb-jdbc-42.7.3.2.jar
-r--r--r--. 1 root root 15663 Nov 11 20:01 edb-jdbc_license.txt
drwxr-xr-x. 2 root root 41 Jan 6 17:22 samples
复制
拷贝驱动程序edb-jdbc.jar 到java的ext目录下
[nuser@epas-15 usr]$ sudo cp edb/jdbc/edb-jdbc.jar usr/lib/jvm/java-1.8.0-openjdk-1.8.0.432.b06-2.0.1.el8.x86_64/jre/lib/ext/
复制
否则EPRS图形界面下连接数据库会提示找不到jdbc驱动。
三、EPRS SMR 配置
EPRS访问默认用admin用户,及加密密码,其配置文件位于/etc/edb-repl.conf,我们首先需要设置加密密码来访问图形console或执行cli命令。
3.1 设置 admin 密码
首先,自己定义一个明文密码文件pwdfile,内容给定自己的密码,如:cary.jin
然后生成加密密码:
$ java -jar /usr/edb/xdb/bin/edb-repcli.jar -encrypt -input ~/pwdfile -output ~/encryptfile
复制
encryptfile中查看生成密码:64BXex2MwUZuMBgrgjh4JA\=\=
copy加密密码到/etc/edb-repl.conf配置文件中,如下
# cat /etc/edb-repl.conf
admin_user=admin
admin_password= 64BXex2MwUZuMBgrgjh4JA\=\=
复制
3.2 查看并按需修改 EPRS 启动配置文件
EPRS启动配置文件位于/usr/edb/xdb/etc/sysconfig/xdbReplicationServer-7.config
内容如下:
#!/bin/sh
JAVA_EXECUTABLE_PATH=`which java`
JAVA_MINIMUM_VERSION=1.8
JAVA_BITNESS_REQUIRED=64
PUB_JAVA_HEAP_SIZE="-Xms2048m -Xmx4096m"
SUB_JAVA_HEAP_SIZE="-Xms256m -Xmx1536m"
PUBPORT=9051
SUBPORT=9052
复制
其中包含了java版本、执行路径、publication server端口9051及subscription server端口9052,以及java heap大小默认配置,可以按自己需要修改。如果要复制的行数很大,可以按官网提示增大相应的heap尺寸。
3.3 启动 EPRS 的服务
我们的EPRS安装在EPAS 15的数据库服务器上,本次publication server和subscription server计划都运行在该服务器上(当然也可以按自己需要安装在任意服务器上,只要保持网络和数据库可访问)。
启动publication server
systemctl enable --now edb-xdbpubserver.service
复制
启动subscription server
systemctl enable --now edb-xdbsubserver.service
复制
3.4 使用基于日志的方法启用同步复制
修改数据的配置文件参数postgresql.conf
wal_level 设为logical
max_wal_senders指定最大并发连接数(即同时运行的 WAL 发送进程的最大数量)。至少设置为此数据库服务器上使用基于日志的方法的SMR 发布数据库的数量。本例设为默认。
max_replication_slots 指定复制槽的最大数量。至少设置为此数据库服务器上使用基于日志的方法的SMR发布数据库的数量。
psql -d edb -c 'show all' |egrep 'wal_level. | max_wal_senders |max_replication_slots'
复制
max_replication_slots | 10
max_wal_senders | 10
wal_level | logical
复制
另外修改pg_hba.conf, 将数据库用户作为复制数据库用户包含在 pg_hba.conf 文件中。
host all all 192.168.31.0/24 scram-sha-256
host replication all 192.168.31.0/24 scram-sha-256
复制
四、使用 EPRS 升级数据库 EPAS15 到 EPAS16
4.1 在源数据库(EPAS15)上
edb=# select version();
version
-------------------------------------------------
PostgreSQL 15.10 (EnterpriseDB Advanced Server 15.10.0) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-22), 64-bit
(1 row)
复制
用EPAS自带的样例,创建示例表
[enterprisedb@epas-15 data]$ psql -d edb -f /usr/edb/as15/share/edb-sample.sql
复制
edb=# \dt
List of relations
Schema | Name | Type | Owner
--------+---------+-------+--------------
public | dept | table | enterprisedb
public | emp | table | enterprisedb
public | jobhist | table | enterprisedb
(3 rows)
复制
edb=# select * from emp;
empno | ename | job | mgr | hiredate | sal | comm | deptno
-------+--------+-----------+------+--------------------+---------+---------+--------
7369 | SMITH | CLERK | 7902 | 17-DEC-80 00:00:00 | 800.00 | | 20
7499 | ALLEN | SALESMAN | 7698 | 20-FEB-81 00:00:00 | 1600.00 | 300.00 | 30
7521 | WARD | SALESMAN | 7698 | 22-FEB-81 00:00:00 | 1250.00 | 500.00 | 30
7566 | JONES | MANAGER | 7839 | 02-APR-81 00:00:00 | 2975.00 | | 20
7654 | MARTIN | SALESMAN | 7698 | 28-SEP-81 00:00:00 | 1250.00 | 1400.00 | 30
7698 | BLAKE | MANAGER | 7839 | 01-MAY-81 00:00:00 | 2850.00 | | 30
7782 | CLARK | MANAGER | 7839 | 09-JUN-81 00:00:00 | 2450.00 | | 10
7788 | SCOTT | ANALYST | 7566 | 19-APR-87 00:00:00 | 3000.00 | | 20
7839 | KING | PRESIDENT | | 17-NOV-81 00:00:00 | 5000.00 | | 10
7844 | TURNER | SALESMAN | 7698 | 08-SEP-81 00:00:00 | 1500.00 | 0.00 | 30
7876 | ADAMS | CLERK | 7788 | 23-MAY-87 00:00:00 | 1100.00 | | 20
7900 | JAMES | CLERK | 7698 | 03-DEC-81 00:00:00 | 950.00 | | 30
7902 | FORD | ANALYST | 7566 | 03-DEC-81 00:00:00 | 3000.00 | | 20
7934 | MILLER | CLERK | 7782 | 23-JAN-82 00:00:00 | 1300.00 | | 10
(14 rows)
复制
edb-# \ds
List of relations
Schema | Name | Type | Owner
--------+------------+----------+--------------
public | next_empno | sequence | enterprisedb
(1 row)
复制
4.2 在目标数据库(EPAS16)上
edb=# select version();
version
--------------------------------------------
PostgreSQL 16.3 (EnterpriseDB Advanced Server 16.3.0) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-20), 64-bit
(1 row)
复制
edb=# \dt
Did not find any relations.
edb=# \ds
Did not find any relations.
复制
在edb库下没有任何表。
4.3 在发布服务器 Publication Server 上
我们启动EPRS的图形配置界面,在EPAS15上运行
/usr/edb/xdb/bin/runRepConsole.sh
复制
4.3.1 启动配置界面

4.3.2 注册 publication server


添加publication server服务运行的主机,端口,用户名及密码(之前生成的加密密码)
注册成功后的界面

可以看到EPRS支持SMR和MMR两种复制模式,其中SMR主要用于复制及跨库迁移,MMR可以实现多主master的运行要求。
在SMR下添加源数据库

添加并测试成功

可以在源数据库中查看xDB的元数据
edb=# select * from _edb_replicator_pub.xdb_pub_database ;
pub_db_id | db_host | db_port | db_user | db_password | db_name | db_type | url_options | rep_group | is_mdn | status | d
b_priority | changeset_log_mode | db_oid
-----------+----------------+---------+--------------+---------------------
1 | 192.168.31.100 | 5444 | enterprisedb | Tqz5czKBURk6qOqzVlhcew== | edb | 0 | | S | f | |
0 | W | 15312
(1 row)
复制
创建publication

完成后,如下图

我们设定publication名字为pub-1,计划对dept、emp、jobhist三个表及其相关数据复制到EPAS 16数据库中。
在源数据库验证元数据
edb=# select * from _edb_replicator_pub.xdb_publications;
pub_id | pub_name | rep_type | pub_db_id
--------+----------+----------+-----------
32 | pub-1 | T | 1
(1 row)
复制
注册subscription server,端口为9052

添加成功,如下图

在subscription server中添加EPAS 16数据库,并测试连接成功

验证xDB的元数据
edb=# select * from _edb_replicator_sub.xdb_sub_database ;
sub_db_id | db_host | db_port | db_user | db_password | db_name | db_type | url_options
-----------+----------------+---------+--------------+--------------------------+---------+---------+-------------
41 | 192.168.31.101 | 5444 | enterprisedb | Tqz5czKBURk6qOqzVlhcew== | edb | 0 |
(1 row)
复制
在subscription server下的数据库(EPAS 16)下创建subscription,如果成功会检测并load到publication name:pub-1

添加完成如图:

验证元数据
edb=# select * from _edb_replicator_sub.xdb_subscriptions ;
sub_id | sub_name | sub_db_id | sub_server_id | sub_server_name | pub_id | pub_server_ip | pub_server_port | pub_rep_type | pub_db_type
--------+----------+-----------+---------------+-----------------+--------+-------------
43 | sub-1 | 41 | 34 | | 32 | 192.168.31.100 | 9051 | T | 0
(1 row)
复制
到此,publiction和subscription都已设置完成。
4.4 数据复制
登录到目录数据库服务器EPAS 16
edb=# select version();
version
---------------------------------------------------------------------------
PostgreSQL 16.3 (EnterpriseDB Advanced Server 16.3.0) on x86_64-pc-linux-gnu
(1 row)
edb=# \dt
List of relations
Schema | Name | Type | Owner
--------+---------+-------+--------------
public | dept | table | enterprisedb
public | emp | table | enterprisedb
public | jobhist | table | enterprisedb
(3 rows)
复制
看到DDL相关信息已经从EPAS15复制到RPAS16中,但数据内容为空
edb=# select * from emp;
empno | ename | job | mgr | hiredate | sal | comm | deptno
-------+-------+-----+-----+----------+-----+------+--------
(0 rows)
复制
edb=# select * from dept;
deptno | dname | loc
--------+-------+-----
(0 rows)
edb=# select * from jobhist;
empno | startdate | enddate | job | sal | comm | deptno | chgdesc
-------+-----------+---------+-----+-----+------+--------+---------
(0 rows)
复制
接下来在EPRS中进行数据复制,在第一次数据同步之前,一定要先进行一次snapshot操作。否则选同步时会报错,提示第一次要做snapshot动作。


所以,我们选择snapshot进行快照动作。


提示快照成功。
在EPAS16中查看,数据已经复制过来。
edb=# select version();
version
-----------------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 16.3 (EnterpriseDB Advanced Server 16.3.0) on x86_64-pc-linux-gnu
(1 row)
edb=# select * from emp;
empno | ename | job | mgr | hiredate | sal | comm | deptno
-------+--------+-----------+------+--------------------+---------+---------+--------
7369 | SMITH | CLERK | 7902 | 17-DEC-80 00:00:00 | 800.00 | | 20
7499 | ALLEN | SALESMAN | 7698 | 20-FEB-81 00:00:00 | 1600.00 | 300.00 | 30
7521 | WARD | SALESMAN | 7698 | 22-FEB-81 00:00:00 | 1250.00 | 500.00 | 30
7566 | JONES | MANAGER | 7839 | 02-APR-81 00:00:00 | 2975.00 | | 20
7654 | MARTIN | SALESMAN | 7698 | 28-SEP-81 00:00:00 | 1250.00 | 1400.00 | 30
7698 | BLAKE | MANAGER | 7839 | 01-MAY-81 00:00:00 | 2850.00 | | 30
7782 | CLARK | MANAGER | 7839 | 09-JUN-81 00:00:00 | 2450.00 | | 10
7788 | SCOTT | ANALYST | 7566 | 19-APR-87 00:00:00 | 3000.00 | | 20
7839 | KING | PRESIDENT | | 17-NOV-81 00:00:00 | 5000.00 | | 10
7844 | TURNER | SALESMAN | 7698 | 08-SEP-81 00:00:00 | 1500.00 | 0.00 | 30
7876 | ADAMS | CLERK | 7788 | 23-MAY-87 00:00:00 | 1100.00 | | 20
7900 | JAMES | CLERK | 7698 | 03-DEC-81 00:00:00 | 950.00 | | 30
7902 | FORD | ANALYST | 7566 | 03-DEC-81 00:00:00 | 3000.00 | | 20
7934 | MILLER | CLERK | 7782 | 23-JAN-82 00:00:00 | 1300.00 | | 10
(14 rows)
复制
接下来就可以进行手工同步或设定按时间调度同步。
手工同步,后可以查看状态及报告

也可以设置同步调度计划,例下图设定每30秒进行一次同步复制

设置成功可以在sub-1的realtime monitor下查看状态

在replication history中可以查看同步成功与否

至此,可以成功实现从EPAS15数据在线复制到EPAS 16的过程,复制完成后可以选定时间进行remove subscription及pulication,整个业务就用新的EPAS16作为数据库来使用就可以了。
五、结语
EDB EPRS即可以作为异构数据库的迁移工具(SMR模式),也可以作为同构多主服务器(MMR)具有非常丰富和灵活的配置和使用。后续我们可以对EPRS进行更多使用场景的用例测试。
关于公司
感谢您关注新智锦绣科技(北京)有限公司!作为 Elastic 的 Elite 合作伙伴及 EnterpriseDB 在国内的唯一代理和服务合作伙伴,我们始终致力于技术创新和优质服务,帮助企业客户实现数据平台的高效构建与智能化管理。无论您是关注 Elastic 生态系统,还是需要 EnterpriseDB 的支持,我们都将为您提供专业的技术支持和量身定制的解决方案。
欢迎关注我们,获取更多技术资讯和数字化转型方案,共创美好未来!
![]() | ![]() |
Elastic 微信群 | EDB 微信群 |

发现“分享”和“赞”了吗,戳我看看吧