如何在 PostgreSQL 10 上设置逻辑复制

PostgreSQL 是一个功能强大的开源对象关系数据库系统 ( ORDBMS )。

与其他关系型数据库系统不同,PostgreSQL 允许用户通过 SQL 函数创建唯一运算符、复杂数据类型、聚合函数、数据类型转换字符等各种数据库对象。

新 PostgreSQL 10 版本附带的最令人兴奋的功能之一是逻辑复制。
逻辑复制是一种复制数据对象及其更改的方法。
逻辑复制基于发布和订阅。
这是其他流行的 RDBMS(如 Oracle 和 Microsoft SQL)也使用的常用方法。

在本教程中,我们将演示如何在侦听端口 5432 的两个 PostgreSQL 10 节点之间设置逻辑复制。
我们已经在两台服务器上安装了 PostgreSQL 10.

在主节点上,我们需要在postgresql.conf文件中设置参数wal_level为logical

[jack@onitroad ~]# vi /var/lib/pgsql/10/data/postgresql.conf
# - Settings 
wal_level = logical                    # minimal, replica, or logical
                                        # (change requires restart)

使用以下命令重新启动 PostgreSQL 服务:

[jack@onitroad ~]# systemctl restart postgresql-10

要验证逻辑复制是否已正确配置,请使用以下命令:

postgres=# show wal_level;
 wal_level
----------
 logical
(1 row)

在主节点上,让我们创建一个名为 testdb 的数据库和一个表 article :

postgres=# CREATE DATABASE testdb;
CREATE DATABASE
testdb=# CREATE TABLE article(idart int primary key,name varchar(10), quantity int);
CREATE TABLE

我们还需要一个具有复制权限的用户:

testdb=# CREATE ROLE rep REPLICATION LOGIN PASSWORD 'Password';
CREATE ROLE
testdb=# GRANT ALL ON article TO rep;
GRANT
testdb=#

让我们在文章表上添加几行:

testdb=# INSERT INTO article (idart, name, quantity) VALUES (1, 'articolo1', 20);
INSERT 0 1
testdb=# INSERT INTO article (idart, name, quantity) VALUES (2, 'articolo2', 50);
INSERT 0 1

让我们使用以下命令为表文章创建一个名为 mypub 的发布:

testdb=# CREATE PUBLICATION mypub FOR TABLE article;
CREATE PUBLICATION
testdb=#

我们可以使用以下 psql 元命令验证发布是否已创建:

testdb=# \dRp+
 Publication mypub
 All tables | Inserts | Updates | Deletes
------------+---------+---------+--------
 f          | t       | t       | t
Tables:
 "public.article"

最后,在 pg_hba.conf 文件中添加以下行,以允许新用户 rep 使用加密密码访问 testdb 数据库

[jack@onitroad ~]# vi /var/lib/pgsql/10/data/pg_hba.conf
## TYPE   DATABASE   USER   CIDR-ADDRESS   METHOD
  Host   testdb     rep    0.0.0.0/0      md5

进行更改后,我们必须重新启动 PostgreSQL 服务器

# sudo systemctl restart postgresql-10

现在让我们连接到辅助节点,我们已经创建了一个名为 destdb 的数据库。
在创建订阅之前,我们需要先创建表文章。

destdb=# CREATE TABLE article(idart int primary key,name varchar(10), quantity int);
CREATE TABLE

使用以下命令设置订阅

destdb=# CREATE SUBSCRIPTION mysub CONNECTION 'dbname=testdb host=192.168.1.30 user=rep password=Password port=5432' PUBLICATION mypub;
NOTICE:  created replication slot "mysub" on publisher
CREATE SUBSCRIPTION
destdb=#

在辅助节点中,使用以下查询来检查表是否已正确复制:

destdb=# table article;
 idart | name      | quantity
-------+-----------+---------
     1 | articolo1 | 20
     2 | articolo2 | 50
(2 rows)

至于发布,有一个 psql 元命令来显示所有创建的订阅:

destdb=# \dRs+
 List of subscriptions
日期:2020-06-02 22:17:40 来源:oir作者:oir