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