用更简单的术语来说,逻辑复制PostgreSQL是一种将数据从一个数据库复制到另一个物理相比更加灵活和可定制的方式复制。而不是复制整个数据库,逻辑复制专注于复制更改个人行或事务。建立逻辑复制,您创建一个发布的源数据库和目标数据库订阅。当你启用订阅,这一过程被称为逻辑复制发射器识别它并开始应用程序工作进程。然后工人同步表通过推出table-sync工人,这将改变从源复制到目标。
这篇文章将研究另一种方法进行初始数据同步在PostgreSQL。而不是利用表同步过程通过数据转储加速同步过程,我们将探讨pg_dump和pg_restore的使用。
实验室环境,下面的实验室环境包含服务器:
- 一个主要和两个副本上运行Postgres版本12
- 一个服务器运行在PostgreSQL版本15
| 服务器详细信息 | IP地址 | PostgreSQL版本 |
| 主 | 10.0.0.25 | 12 |
| Replica1 | 10.0.0.80 | 12 |
| Replica2 | 10.0.0.40 | 12 |
| 逻辑复制(目标服务器) | 10.0.0.221 | 15 |
在这个实验中,我建立了两个副本,使这种方法工作。我需要暂停WAL回放过程,所以有两个副本,包括replica2,有助于确保持续复制,这可能是重要的会议业务需求,不是受此影响的方法。
步骤1:创建一个发布在主服务器上
第一步是创建一个出版物在主服务器上,它定义了表将被复制。连接到主服务器使用PostgreSQL psql命令行工具,并执行下面的命令
|
1
2
3
4
|
雷竞技下载官网
=
#创建my_pub出版;
创建
出版
雷竞技下载官网
=
#修改出版my_pub添加表名;
改变
出版
|
这些命令创建一个名为my_pub的出版物和添加表名。出版现在可以更改复制到表1在主服务器上。
步骤2:创建一个逻辑复制槽在主服务器上
接下来,我们需要创建一个逻辑复制槽在主服务器上捕捉到表1所做的更改。在psql控制台执行以下命令在主服务器上:
|
1
2
3
4
|
雷竞技下载官网percona = #
选择
pg_create_logical_replication_slot (“my_pub_slot”,
“pgoutput”);
pg_create_logical_replication_slot
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(my_pub_slot, 0/1 c8beb58)
|
这个命令创建一个名为my_pub_slot使用的逻辑复制槽pgoutput输出插件,这是一个内置的逻辑输出插件复制在PostgreSQL。槽将捕捉更改表和存储复制。
步骤3:在目标服务器上创建一个订阅
在目标逻辑复制服务器,我们需要创建一个连接到主服务器的订阅和复制表的更改。使用psql连接到目标服务器,并执行下面的命令。注意,我们忽略了这个命令的密码,因为它位于。pgpass文件
|
1
2
|
雷竞技下载官网percona = #
创建
订阅my_pub_subscription连接
“主机= 10.0.0.25端口= 5432 dbname = p雷竞技下载官网ercona '
出版my_pub
与
(copy_data=
假,create_slot=
假,启用=
假,slot_name=my_pub_slot);
创建
订阅
|
这个命令创建一个名为my_pub_subscription的订阅,在IP地址10.0.0.25连接到主服务器,使用Percona数据库,复制my_pub出版,其中包括表1。雷竞技下载官网创建订阅时使用以下选项:
copy_data= false:这个选项指定,我们不会从出版商使用逻辑复制复制数据,相反,我们将使用pg_dump工具复制数据。
create_slot= false:这个选项指定,我们不会在目标服务器上创建一个复制槽,我们已经创建了一个逻辑复制槽在主服务器上。
启用= false:这个选项指定订阅将不会立即启用,当我们想要使其之前执行一些额外的步骤。
slot_name= my_pub_slot:这个选项指定逻辑复制槽的名字,我们在主服务器上创建的。
步骤4:暂停复制replica2: 10.0.0.40 pg_dump数据快照table1和恢复的目标逻辑复制节点
replica2:
|
1
2
3
4
5
6
7
8
9
|
postgres@知识产权- - - - - -10- - - - - -0- - - - - -0- - - - - -40:~ $psql- d雷竞技下载官网
- c
“选择pg_wal_replay_pause ()”
pg_wal_replay_pause
- - - - - - - - - - - - - - - - - - - - - - - -
(1
行)
postgres@知识产权- - - - - -10- - - - - -0- - - - - -0- - - - - -40:~ $psql- d雷竞技下载官网
- c
“选择pg_is_wal_replay_paused ()”
pg_is_wal_replay_paused
- - - - - - - - - - - - - - - - - - - - - - - - -
t
(1
行)
|
请注意:更多细节关于如何使用和应用pg_dump,我建议看看我的同事的博客文章,涵盖了几个主题,包括简单备份和恢复,使用pg_dump和pg_restore PostgreSQL升级,PostgreSQL升级使用pg_dumpall,使用PostgreSQL转储清单。
现在复制replica2暂停,在主节点和事务不会被复制到replica2。确认是否replica2暂停,回放我们新记录插入表1在主服务器上,增加死亡总人数达到1000001。然后,我们指望replica1和replica2检查记录。Replica1显示1000001年的预计数,虽然replica2重演停顿了一下“t”状态的记录计数1000000,表明新插入的记录没有被复制到它由于暂停复制。
在主服务器在表1:计数和插入记录。
|
1
2
3
4
5
6
7
8
9
|
postgres@知识产权- - - - - -10- - - - - -0- - - - - -0- - - - - -25:~ $psql- d雷竞技下载官网
tc
“select count(*)从表1”
1000000
雷竞技下载官网percona = #
插入
成
表1(姓名、年龄)
值(“知识库”,“29”);
插入
01
雷竞技下载官网percona = #
选择
数(*)
从
表1;
数
- - - - - - - - - - - -
1000001
(1
行)
|
我们可以验证新插入的记录是否被复制到replica1 replica2。因为复制replica2暂停,它不会有记录我们插入。
Replica1:
|
1
2
|
postgres@知识产权- - - - - -10- - - - - -0- - - - - -0- - - - - -80:美元~psql- d雷竞技下载官网
- upostgrestc
“select count(*)从表1;”
1000001
|
Replica2:
|
1
2
3
4
|
postgres@知识产权- - - - - -10- - - - - -0- - - - - -0- - - - - -40:~ $psql- p5434年- d雷竞技下载官网
- upostgrestc
“选择pg_is_wal_replay_paused ();”
t
postgres@知识产权- - - - - -10- - - - - -0- - - - - -0- - - - - -40:~ $psql- p5434年- d雷竞技下载官网
- upostgrestc
“select count(*)从表1;”
1000000
|
第五步:注意的重播LSN replica2在主节点上(例如,0/1C8BEC40)
|
1
2
3
4
5
|
postgres@知识产权- - - - - -10- - - - - -0- - - - - -0- - - - - -25:~ $psql- d雷竞技下载官网
- c
“选择client_addr application_name replay_lsn从pg_stat_replication application_name = 'replica2“;”
client_addr|application_name|replay_lsn
- - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - -
10.0.0.40
|replica2
|0/1 c8bec40
(2
行)
|
第六步:转储只有从replica2表1的数据,我们已经在目标节点上的模式
|
1
|
postgres@知识产权- - - - - -10- - - - - -0- - - - - -0- - - - - -40:~ $pg_dump- d雷竞技下载官网
= table1 fc > table1_dmp.db——纯数据表
|
第七步:恢复目标节点上的数据
|
1
|
pg_restore- h10.0.0.221- upostgres- d雷竞技下载官网
table1_dmp.db
|
请注意:自定义压缩格式受雇于pg_dump有几个优点,如减少转储文件的大小和加快备份和恢复过程。它还允许恢复多个表同时利用工作开关。然而,当从一个转储文件恢复数据,包括约束是非常必要的,如果他们存在,在目标表恢复数据。这可以通过使用一节= post数据开关。
第八步:恢复逻辑复制工作进程为table1捕获连续数据更改
在主节点上,可能会有更多的数据相比,table1 replica2和目标逻辑复制节点。一旦我们启用逻辑复制,δ(即数据。,the changes that occur after the logical replication is set up) will be replicated by the logical replication worker to the target server. This ensures that any new changes made to table1 on the primary node will be accurately replicated to the target server through logical replication.
|
1
2
3
4
5
|
postgres@知识产权- - - - - -10- - - - - -0- - - - - -0- - - - - -25:~ $psql- d雷竞技下载官网
- c
“select count(*)从表1”
数
- - - - - - - - - - - -
1000100
(1
行)
|
步骤9:在目标服务器上,预先复制起源在目标位置上从replay_lsn(从replica2聚集)顾不上对于逻辑复制目标
|
1
2
3
4
5
6
7
8
9
|
雷竞技下载官网percona = #
选择
roident,subname,roname
从
pg_subscription子,pg_replication_origin罗依
在哪里
“pg_”
| |子。oid
=ro.roname;
roident|subname
|roname
- - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - -
1
|my_pub_subscription|pg_16407
(1
行)
雷竞技下载官网percona = #
选择
pg_replication_origin_advance (“pg_16407”,
“0/1C8BEC40”);
pg_replication_origin_advance
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(1
行)
|
pg_replication_origin_advance给定节点用于复制进展到给定的位置。这主要是用于设置初始位置或配置更改后设置一个新的位置,相似。
第十步:启用订阅
|
1
2
|
雷竞技下载官网percona = #
改变
订阅my_pub_subscription
启用;
改变
订阅
|
成功启用订阅后,我们可以观察到的变化逻辑复制到表1目标服务器。
|
1
2
3
4
5
6
7
8
9
|
postgres@知识产权- - - - - -10- - - - - -0- - - - - -0- - - - - -221:美元~psql- d雷竞技下载官网
psql(15.2(Ubuntu15.2- - - - - -1. pgdg22.04+1))
类型
“帮助”
为
的帮助。
雷竞技下载官网percona = #
选择
数(*)
从
表1;
- - - - - - (
记录
1]- - -
数
|1000100
|
这证实了表1中的数据被复制从源到目标服务器通过逻辑复制。展望未来,源服务器上的任何更改table1将被复制到目标服务器。重要的是要注意,恢复复制为replica2确保更改正确应用。这可以通过使用pg_wal_replay_resume PostgreSQL()函数:
|
1
2
3
4
|
postgres = #
选择
pg_wal_replay_resume ();
pg_wal_replay_resume
- - - - - - - - - - - - - - - - - - - - - - -
(1
行)
|
当考虑这个方法的实现相当大的表,必须密切关注复制槽年龄来避免任何潜在的并发症。此外,避免使用count(*)功能广泛的表,因为它可以消耗大量的资源,占用大量的时间。
雷竞技下载官网Percona分布PostgreSQL提供最好的和最重要的开源社区的企业组件,在一个单一的分布,设计和测试一起工作。






replay_lsn步骤5和步骤9是不同的。
你好,谢谢你的指出,这似乎是一个复制粘贴错误,纠正它!