开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2720人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6群均已爆满,群430+,开8群200+ 9群)
PostgreSQL 数据库的逻辑复制槽是一项非常重要的功能,通过逻辑复制槽本身,可以提供多种多样的功能。这里我们画一个思维导图进行一个全方面的分析和梳理。

逻辑复制槽的功能可以用到多种途径,满足多种业务的需求。 这里总结:
数据库升级 PostgreSQL数据库升级中,有如下的需求,则需要考虑使用逻辑复制槽的方式来进行数据库的升级。
系统不能停机太长时间,或根本无法停机,通过逻辑复制槽的方式来进行数据的同步到目的主机(已经升级的PostgreSQL系统)
系统升级有负担,需要进行验证,或灰度的升级,程序是两份需要连接到不同的数据库版本中,需要动态数据的支持。(需要注意,验证正能验证 Query SQL)
数据库备份
数据备份中,仅仅针对表级别进行实时的数据备份
数据备份中,需要动态的只读类的逻辑库备份
数据备份中,需要对表进行改造后,进行数据备份,或备份不在主机中尽显,而是在备库中进行。
数据异步同步
针对Saas类的需求,进行异步的部分数据同步到甲方
数据逻辑库异步同步到备库,已被进行非实时的查询
远程可接受的数据远程传输和移动,且保证数据的异步实时同步
异构数据库输出
通过不同的插件输出数据库中的CDC,来捕捉数据库中数据的变化,来进行预估触发事件
通过不同的插件来完成数据库审计操作的部分功能
通过不同的插件来进行异构数据的捕捉和清洗等,在将数据通过kafka等二次传输给异构的数据库产品,进行异构的数据同步功能。
不同的支持逻辑复制的插件
插件名称 | 输出格式 | 适用场景 | 默认安装 |
---|---|---|---|
test_decoding | 文本 | 测试和开发环境 | ✅ 是 |
pgoutput | 内部格式 | 逻辑复制、主备同步 | ✅ 是 |
wal2json | JSON | Kafka、Debezium、数据湖 | ❌否 |
pg_recvlogical | 文本 | 轻量级日志分析 | ✅ 是 |
decoderbufs | Protobuf | 高性能数据流 | ❌ 否 |
下面是简单的实际操作案例 (版本PG16) 注意事项: 1.在数据复制中,需要保持复制中的所有表均有主键,或唯一索引,如表中无这两项,也可以进行逻辑复制但会严重影响性能,或导致逻辑复制报错
2.数据复制中需要源库需要保证有足够的空间存留WAL日志,避免数据延迟中WAL日志空间不足导致的数据库停机的风险
3.数据复制中需要严格监控复制槽的状态,避免订阅端出现问题,导致复制中断后,主库WAL不断挤压导致的磁盘空间异常问题。
4.逻辑复制槽最大的单位是针对逻辑库,而不是实例这点需要注意
psql
1 进行单逻辑库的数据库传输
在源库上创建逻辑复制槽,注意逻辑复制槽最好带有对应数据库的名字。
SELECT pg_create_logical_replication_slot('test_database', 'pgoutput');
//创建一个发布名字为 test_all_tables
CREATE PUBLICATION test_all_tables FOR ALL TABLES;
postgres=# create database test;
CREATE DATABASE
postgres=# \c test
You are now connected to database "test" as user "postgres".
test=# create table test(id int primary key,name varchar(20),age int);
CREATE TABLE
test=# insert into test(id,name,age) values (1,'Simon',33),(2,'Kim',23);
INSERT 0 2
test=# SELECT pg_create_logical_replication_slot('test_database', 'pgoutput');
pg_create_logical_replication_slot
------------------------------------
(test_database,0/60DA2E0)
(1 row)
test=# CREATE PUBLICATION test_all_tables FOR ALL TABLES;
CREATE PUBLICATION
2 在目的库建立同名的test库,同时建立同名的表,同结构的表,然后创建订阅,最后查询当前的订阅情况
test=# CREATE SUBSCRIPTION test CONNECTION 'host=192.168.198.100 port=5432 dbname=test user=admin password=admin' PUBLICATION test_all_tables;
NOTICE: created replication slot "test" on publisher
CREATE SUBSCRIPTION
test=#
test=# select * from pg_subscription;
oid | subdbid | subskiplsn | subname | subowner | subenabled | subbinary | substream | subtwophasestate | subdisableonerr | subpasswordrequire
d | subrunasowner | subconninfo | subslotname | subsynccommit | subpublications | subo
rigin
-------+---------+------------+---------+----------+------------+-----------+-----------+------------------+-----------------+-------------------
--+---------------+----------------------------------------------------------------------+-------------+---------------+-------------------+-----
------
16421 | 16414 | 0/0 | test | 16387 | t | f | f | d | f | t
| f | host=192.168.198.100 port=5432 dbname=test user=admin password=admin | test | off | {test_all_tables} | any
(1 row)
test=# select * from test;
id | name | age
----+-------+-----
1 | Simon | 33
2 | Kim | 23
(2 rows)
下面我们换另一个实例,我们创建一个不完全同步的表,只同步部分的字段,这里我们在源库创建新的逻辑复制槽,test_id_name
test=# create publication test_id_name for table test (id,name);
CREATE PUBLICATION
test=# select * from pg_publication;
oid | pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate | pubviaroot
-------+-----------------+----------+--------------+-----------+-----------+-----------+-------------+------------
16860 | test_all_tables | 10 | t | t | t | t | t | f
16862 | test_id_name | 10 | f | t | t | t | t | f
(2 rows)
test=#
然后我们在目的库的另一逻辑库引用这个新的publication
test=# create database test2;
CREATE DATABASE
test=# \c test2
You are now connected to database "test2" as user "admin".
test2=#
test2=# create table test(id int primary key,name varchar(20));
CREATE TABLE
test2=# CREATE SUBSCRIPTION test_id_name_s CONNECTION 'host=192.168.198.100 port=5432 dbname=test user=admin password=admin' PUBLICATION test_id_name;
NOTICE: created replication slot "test_id_name_s" on publisher
CREATE SUBSCRIPTION
test2=#
test2=#
test2=# select * from test;
id | name
----+-------
1 | Simon
2 | Kim
(2 rows)
test2=#
通过以上的两个小的实验我们获得了2个逻辑复制槽进行PostgreSQL 逻辑库和单表(选择非全部列)的工作方式。
这里还需要注意,如果源库新加表等,都需要运行如下的命令来刷新订阅接受命令。 ALTER SUBSCRIPTION 订阅的名字 REFRESH PUBLICATION;
对于逻辑复制槽的监控需要注意
1 需要定期发现逻辑复制槽的状态 2 发现逻辑复制槽挤压WAL的文件的情况
::如果发现逻辑复制槽失效,或由于WAL源库的文件丢失等原因逻辑复制槽无法再消费,则必须马上删除订阅,删除逻辑复制槽。
通过如下的命令来针对逻辑复制槽进行监控
test2=# SELECT subname, pid, relid, received_lsn, last_msg_send_time,
test2-# last_msg_receipt_time, latest_end_lsn, latest_end_time
test2-# FROM pg_stat_subscription;
subname | pid | relid | received_lsn | last_msg_send_time | last_msg_receipt_time | latest_end_lsn | latest_en
d_time
----------------+------+-------+--------------+-------------------------------+-------------------------------+----------------+-----------------
--------------
test | 5478 | | 0/60DF6F8 | 2024-11-29 12:16:11.152715-05 | 2024-11-29 12:16:11.152782-05 | 0/60DF6F8 | 2024-11-29 12:16
:11.152715-05
test_id_name_s | 5635 | | 0/60DF6F8 | 2024-11-29 12:16:10.476948-05 | 2024-11-29 12:16:10.47766-05 | 0/60DF6F8 | 2024-11-29 12:16
:10.476948-05
(2 rows)
下面的命令并不准确,尤其在主库并未有真实的数据变动或插入则这个语句就会产生问题,但如果能保证主库持续有数据,则这个语句可以观察逻辑复制的从库与主库的数据之间的延迟
test2=# SELECT subname,
test2-# EXTRACT(EPOCH FROM (now() - last_msg_receipt_time)) AS delay_seconds
test2-# FROM pg_stat_subscription;
subname | delay_seconds
----------------+---------------
test | 4.555973
test_id_name_s | 5.372016
(2 rows)
检查逻辑复制槽的状态,明显active=F 的逻辑复制出现问题,可能是网络,也可能是WAL丢失,或者是订阅端出现问题等等,都需要后续的分析和排除故障。
test=# SELECT slot_name, plugin, active, restart_lsn, confirmed_flush_lsn
test-# FROM pg_replication_slots
test-# WHERE slot_type = 'logical';
slot_name | plugin | active | restart_lsn | confirmed_flush_lsn
----------------+----------+--------+-------------+---------------------
test_database | pgoutput | f | 0/60DA2A8 | 0/60DA2E0
test | pgoutput | t | 0/60DF6C0 | 0/60DF6F8
test_id_name_s | pgoutput | t | 0/60DF6C0 | 0/60DF6F8
(3 rows)
置顶
临时工:数据库人生路,如何救赎自己 -- 答某个迷茫DBA的职业咨询
开源软件是心怀鬼胎的大骗局 -- 开源软件是人类最好的正能量 --- 一个人的辩论会
宇宙的“PostgreSQL” 说 “地球上的PG” 都是“小垃圾”
天上的“PostgreSQL” 说 地上的 PostgreSQL 都是“小垃圾”
云数据库核爆在内部,上云下云话题都是皮外伤!--2025云数据库专栏(二)
PolarDB 相关文章
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
POLARDB 添加字段 “卡” 住---这锅Polar不背
PolarDB 版本差异分析--外人不知道的秘密(谁是绵羊,谁是怪兽)
PolarDB 答题拿-- 飞刀总的书、同款卫衣、T恤,来自杭州的Package(活动结束了)
PolarDB for MySQL 三大核心之一POLARFS 今天扒开它--- 嘛是火星人
PolarDB-MySQL 并行技巧与内幕--(怎么薅羊毛)
PolarDB 并行黑科技--从百套MySQL撤下说起 (感谢8018个粉丝的支持)
PolarDB 杀疯了,Everywhere Everytime Everydatabase on Serverless
POLARDB 从一个使用者的角度来说说,POALRDB 怎么打败 MYSQL RDS
PolarDB 最近遇到加字段加不上的问题 与 使用PolarDB 三年感受与恳谈
PolarDB 从节点Down机后,引起的主从节点强一致的争论
PolarDB serverless 真敢搞,你出圈了你知道吗!!!!
PolarDB VS PostgreSQL "云上"性能与成本评测 -- PolarDB 比PostgreSQL 好?
临时工访谈:PolarDB Serverless 发现“大”问题了 之 灭妖记 续集
临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一
PolarDB for PostgreSQL 有意思吗?有意思呀
PolarDB Serverless POC测试中有没有坑与发现的疑问
临时工说:从人性的角度来分析为什么公司内MySQL 成为少数派,PolarDB 占领高处
POLARDB -- Ausitndatabases 历年的文章集合
PolarDB for PostgreSQL 有意思吗?有意思呀
PostgreSQL 相关文章
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
PostgreSQL 添加索引导致崩溃,参数调整需谨慎--文档未必完全覆盖场景
PostgreSQL SQL优化用兵法,优化后提高 140倍速度
PostgreSQL 运维的难与“难” --上海PG大会主题记录
PostgreSQL 什么都能存,什么都能塞 --- 你能成熟一点吗?
全世界都在“搞” PostgreSQL ,从Oracle 得到一个“馊主意”开始
PostgreSQL 加索引系统OOM 怨我了--- 不怨你怨谁
PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!
病毒攻击PostgreSQL暴力破解系统,防范加固系统方案(内附分析日志脚本)
PostgreSQL 远程管理越来越简单,6个自动化脚本开胃菜
PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆
PostgreSQL 分组查询可以不进行全表扫描吗?速度提高上千倍?
POSTGRESQL --Austindatabaes 历年文章整理
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
PostgreSQL 字符集乌龙导致数据查询排序的问题,与 MySQL 稳定 "PG不稳定"
PostgreSQL Patroni 3.0 新功能规划 2023年 纽约PG 大会 (音译)
PostgreSQL 玩PG我们是认真的,vacuum 稳定性平台我们有了
PostgreSQL DBA硬扛 垃圾 “开发”,“架构师”,滥用PG 你们滚出 !(附送定期清理连接脚本)
MySQL相关文章
MySQL 内存那点事你还不会--PS分析+自动历史SQL分析(2)
MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验
用MySql不是MySQL, 不用MySQL都是MySQL 横批 哼哼哈哈啊啊
MYSQL --Austindatabases 历年文章合集
OceanBase 相关文章
OceanBase 6大学习法--OBCA视频学习总结第四章 --数据库安装
OceanBase 6大学习法--OBCA视频学习总结第三章--数据库引擎
OceanBase 架构学习--OB上手视频学习总结第二章 (OBCA)
OceanBase 6大学习法--OB上手视频学习总结第一章
没有谁是垮掉的一代--记 第四届 OceanBase 数据库大赛
跟我学OceanBase4.0 --阅读白皮书 (OB分布式优化哪里了提高了速度)
跟我学OceanBase4.0 --阅读白皮书 (4.0优化的核心点是什么)
跟我学OceanBase4.0 --阅读白皮书 (0.5-4.0的架构与之前架构特点)
跟我学OceanBase4.0 --阅读白皮书 (旧的概念害死人呀,更新知识和理念)
OceanBase 学习记录-- 建立MySQL租户,像用MySQL一样使用OB
临时工访谈:OceanBase上海开大会,我们四个开小会 OB 国产数据库破局者
临时工说:OceanBase 到访,果然数据库的世界很卷,没边
数据库信息速递 阿里巴巴的分布式数据库OceanBase旨在进军中国以外的市场 (翻译)
MongoDB 相关文章
MongoDB 大俗大雅,上来问分片真三俗 -- 4 分什么分
MongoDB 大俗大雅,高端知识讲“庸俗” --3 奇葩数据更新方法
MongoDB 大俗大雅,高端的知识讲“通俗” -- 2 嵌套和引用
MongoDB 大俗大雅,高端的知识讲“低俗” -- 1 什么叫多模
MongoDB 合作考试报销活动 贴附属,MongoDB基础知识速通
MongoDB 使用网上妙招,直接DOWN机---清理表碎片导致的灾祸 (送书活动结束)
数据库 《三体》“二向箔” 思维限制 !8个公众号联合抽奖送书 建立数据库设计新思维
MongoDB 是外星人,水瓶座,怎么和不按套路出牌的他沟通?
17000多张MongoDB表的锅 自动分析删除表数据难题--从头到尾的处理过程(文尾有MongoDB开发规范)
MongoDB 插入更新数据慢,开发问哪的问题?附带解决方案和脚本
MongoDB 挑战传统数据库聚合查询,干不死他们的MongoDB 2023纽约 MongoDB 大会 -- 我们怎么做的新一代引擎 SBE Mongodb 7.0双擎力量(译)
MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
MongoDB 双机热备那篇文章是 “毒”
MongoDB 会丢数据吗?在次补刀MongoDB 双机热备
MONGODB ---- Austindatabases 历年文章合集
PolarDB 相关文章
POLARDB 添加字段 “卡” 住---这锅Polar不背
PolarDB 版本差异分析--外人不知道的秘密(谁是绵羊,谁是怪兽)
PolarDB 答题拿-- 飞刀总的书、同款卫衣、T恤,来自杭州的Package(活动结束了)
PolarDB for MySQL 三大核心之一POLARFS 今天扒开它--- 嘛是火星人
PolarDB-MySQL 并行技巧与内幕--(怎么薅羊毛)
PolarDB 并行黑科技--从百套MySQL撤下说起 (感谢8018个粉丝的支持)
PolarDB 杀疯了,Everywhere Everytime Everydatabase on Serverless
POLARDB 从一个使用者的角度来说说,POALRDB 怎么打败 MYSQL RDS
PolarDB 最近遇到加字段加不上的问题 与 使用PolarDB 三年感受与恳谈
PolarDB 从节点Down机后,引起的主从节点强一致的争论
PolarDB serverless 真敢搞,你出圈了你知道吗!!!!
PolarDB VS PostgreSQL "云上"性能与成本评测 -- PolarDB 比PostgreSQL 好?
临时工访谈:PolarDB Serverless 发现“大”问题了 之 灭妖记 续集
临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一
PolarDB for PostgreSQL 有意思吗?有意思呀
PolarDB Serverless POC测试中有没有坑与发现的疑问
临时工说:从人性的角度来分析为什么公司内MySQL 成为少数派,PolarDB 占领高处
POLARDB -- Ausitndatabases 历年的文章集合
PolarDB for PostgreSQL 有意思吗?有意思呀
临时工访谈系列
国内最大IT服务公司-招聘DBA “招聘广告”的变化--分析与探讨
没有谁是垮掉的一代--记 第四届 OceanBase 数据库大赛
SQL SERVER 系列
SQL SERVER 如何实现UNDO REDO 和PostgreSQL 有近亲关系吗
SQL SERVER 我没有消失,SQL SERVER下一个版本是2025 (功能领先大多数数据库)
SQL SERVER 2022 针对缓存扫描和Query Store 的进步,可以考虑进行版本升级
阿里云系列
阿里云数据库产品权限设计缺陷 ,六个场景诠释问题,你可以做的更好?
阿里云数据库--市场营销聊胜于无--3年的使用感受与反馈系列
阿里云数据库产品 对内对外一样的卷 --3年阿里云数据库的使用感受与反馈系列
阿里云数据库使用感受--客户服务问题深入剖析与什么是廉价客户 --3年的使用感受与反馈系列
阿里云数据库使用感受--操作界面有点眼花缭乱 --3年的使用感受与反馈系列