PostgreSQL码农集散地

为什么离职的多是好员工?

文章开始前推荐2个学习环境: 

1、懒人Docker镜像, 已打包200+插件:《最好的PostgreSQL学习镜像》

2、免费的云起实验室: 《免费体验PolarDB开源数据库》
3、PolarDB开源数据库内核、最佳实践等学习图谱:  https://www.aliyun.com/database/openpolardb/activity 
欢迎关注我的公众号, 持续发布PostgreSQL、PolarDB、DuckDB等开源相关技术文章. 

为什么要将物理从库转换为逻辑从库?     

创建PostgreSQL逻辑从库时, 耗时最长的是初始数据拷贝的阶段, 为了解决这个问题, 17版本可以使用pg_createsubscriber将物理从库转换为逻辑从库.

物理从库是文件级别拷贝, 快得不行, 如果你想建一个需要同步大部分数据的逻辑从库, 这个工具是必须要看看滴.  

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=d44032d0146306971cd5ccf232fe37269717d6f2

https://www.postgresql.org/docs/devel/app-pgcreatesubscriber.html

To create a logical replica for databases hr and finance from a physical replica at foo:

$ pg_createsubscriber -D /usr/local/pgsql/data -P "host=foo" -d hr -d finance

基本思想是: 源服务器有一个复制起点,激活物理从库后从该点开始进行逻辑复制:

1、使用指定的命令行选项启动目标服务器。如果目标服务器已经在运行,pg_createsubscriber将终止并出现错误。

2、检查目标服务器是否可以转换。源服务器上还有一些检查。如果不满足任何先决条件,pg_createsubscriber将终止并出现错误。

3、为源服务器上的每个指定数据库创建发布和复制槽。每个publication都使用FOR ALL TABLES创建。如果publication-name未指定选项,则其名称模式如下:“ pg_createsubscriber_%u_%x”(参数:database oid、random int)。如果replication-slot-name未指定,则复制槽具有以下名称模式:“ pg_createsubscriber_%u_%x”(参数:database oid、random int)。这些复制槽将在未来的步骤中由订阅使用。最后一个复制槽 LSN 用作recovery_target_lsn参数中的停止点,并由订阅用作复制起点。它保证不会丢失任何交易。

4、将恢复参数写入目标数据目录并重新启动目标服务器。它指定恢复将继续进行的预写日志位置的LSN ( recovery_target_lsn )。它还指定promote一旦达到恢复目标服务器应采取的操作。添加额外的恢复参数是为了避免恢复过程中出现意外行为,例如一旦达到一致状态就结束恢复(应应用 WAL 直到复制开始位置)以及可能导致失败的多个恢复目标。一旦服务器结束待机模式并接受读写事务,此步骤即完成。如果--recovery-timeout设置了选项,如果恢复在给定秒数之前没有结束,则pg_createsubscriber将终止。

5、为目标服务器上的每个指定数据库创建订阅。如果subscription-name未指定,则订阅具有以下名称模式:“ pg_createsubscriber_%u_%x”(参数:database oid、random int)。它不会从源服务器复制现有数据。它不会创建复制槽。相反,它使用在上一步中创建的复制槽。订阅已创建,但尚未启用。原因是在开始复制之前必须将复制进度设置为复制起点。

6、删除目标服务器上已复制的发布,因为它们是在复制开始位置之前创建的。它对订阅者没有任何用处。

7、将复制进度设置为每个订阅的复制起点。当目标服务器开始恢复过程时,它会赶上复制起始点。这是用作每个订阅的初始复制位置的确切 LSN。复制源名称是自创建订阅以来获取的。复制源名称和复制起点用于pg_replication_origin_advance()设置初始复制位置。

8、为目标服务器上的每个指定数据库启用订阅。订阅从复制起点开始应用事务。

9、如果备用服务器正在使用Primary_slot_name,那么从现在起它就没有用处了,所以请将其删除。

10、更新目标服务器上的系统标识符。运行 pg_resetwal 来修改系统标识符。根据要求停止目标服务器pg_resetwal。

其实这篇文章的内容和标题是匹配的, 只是我还没想好到底有什么关联.  

欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.  

近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号:

Image

文章中的参考文档请点击阅读原文获得.