前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PG原生解码工具pg_recvlogical的使用-在脑裂时帮我们找回丢失的数据

PG原生解码工具pg_recvlogical的使用-在脑裂时帮我们找回丢失的数据

作者头像
数据库架构之美
发布于 2020-08-18 06:13:31
发布于 2020-08-18 06:13:31
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

数据库逻辑解码很有必要,也很有用处,多用于异构数据库逻辑复制中。另外逻辑解码在某些关键时候可以救命,比如主从脑裂的场景,如果在主备切换后原主库还有业务写入会造成脑裂,这时候如果创建了逻辑复制槽,那么可以将某段时间的xlog日志解码成sql语句,找回丢失的数据,这一点很有用。

pg有很多逻辑解码的插件,其中pg原生的逻辑解码工具pg_recvlogical就可以使用,它使用默认的test_decoding的插件,该插件位于pg源码contrib/test_decoding目录下,需要先对该目录进行安装,安装完后会在pg安装目录的lib目录下创建test_decoding链接库文件。

下面具体看看pg_recvlogical的使用以及在主备脑裂时候如何找回丢失的数据。

安装test_decoding插件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@db1 ~]$ cd /pgsql/postgresql-11.3/contrib/test_decoding/
[postgres@db1 test_decoding]$ make && make install

创建逻辑复制槽

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@db1 share]$ pg_recvlogical --create-slot -S logicslot -d test
[postgres@db1 share]$ psql
psql (11.3)
Type "help" for help.


postgres=# select * from pg_replication_slots;
 slot_name |    plugin     | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
-----------+---------------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
 logicslot | test_decoding | logical   |  24760 | test     | f         | f      |            |      |    110980560 | 7F/B0178EB8 | 7F/B0178EF0
(1 row)

启动复制槽(后台启动会实时的将日志解码到制定的文件中,也可以不启动,在需要解码xlog时再启动解码)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@db1 pginst1]$ pg_recvlogical --start -S logicslot -d test -f logical_decoding.log &

测试一下实时解码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@db1 pginst1]$ psql test
psql (11.3)
Type "help" for help.


test=# create table test(id int);
CREATE TABLE
test=# insert into test values(1);
INSERT 0 1


[postgres@db1 pginst1]$ cat logical_decoding.log
BEGIN 110980560
COMMIT 110980560
BEGIN 110980561
table public.test: INSERT: id[integer]:1
COMMIT 110980561

模拟主备脑裂,找回原主库丢失的数据

先将流复制环境改为异步(如果同步的话,备库提升后原主库无法写入,无法模拟原主库脑裂写入)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
postgres=# alter system set synchronous_standby_names='';
ALTER SYSTEM
postgres=# \q
[postgres@HWFBS01 ~]$ pg_ctl reload
server signaled
[postgres@HWFBS01 ~]$ psql
psql (11.3)
Type "help" for help.


postgres=# show synchronous_standby_names;
 synchronous_standby_names
---------------------------


(1 row)

查询主库lsn位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
postgres=# select pg_current_wal_lsn();
 pg_current_wal_lsn
--------------------
 4C/47000060
(1 row)

备库直接提升为主库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@HWFBS02 ~]$ pg_ctl promote
waiting for server to promote.... done
server promoted

原主库继续写入数据,模拟脑裂

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
test=# delete from test;
DELETE 32
test=# insert into test values(1);
INSERT 0 1

查看原主库当前lsn位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
postgres=# select pg_current_wal_lsn();
 pg_current_wal_lsn
--------------------
 4C/470044E0
(1 row)

使用pg_recvlogical进行日志区间解码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@HWFBS01 ~]$ pg_recvlogical --start -S logicslot -d test -I 4C/47000060 -E 4C/470044E0 -f 1.log

查看解码的日志内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[postgres@HWFBS01 ~]$ cat 1.log
BEGIN 493416304
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
table public.test: DELETE: (no-tuple-data)
COMMIT 493416304
BEGIN 493416305
table public.test: INSERT: id[integer]:1
COMMIT 493416305
BEGIN 493416306
COMMIT 493416306

通过日志发现test发生了一次delete全部数据,insert了一条数据,通过这些内容可以将应用丢失的数据找回。

使用逻辑解码有几点需要注意:

1、逻辑复制槽使用一定要注意因为无法消费造成主库的xlog堆积的问题

2、如果之前已经解码过一段区间的xlog,restart_lsn会进行推进,这时如果新解码的区间包含原有lsn区间,会忽略原来的xlog日志,也就是说连续对某段xlog进行两次解码,第二次是解码不出来内容的。

3、逻辑解码需要设置wal_level=logic,这个会大大增加wal大小,对性能有很大的损害,如果是高并发insert环境下,写逻辑解码日志的速度可能会成为瓶颈。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据库架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
进阶数据库系列(二十一):PostgreSQL 数据目录同步工具 pg_rewind
pg_rewind 相比 pg_basebackup 和 rsync 这样的工具来说,优势是它不需要从源目录拷贝所有的数据文件,而是会对比时间线发生偏离的点,只拷贝变化过的文件,这样对于数据量很大的情况下速度更快。
民工哥
2023/08/22
1.9K0
进阶数据库系列(二十一):PostgreSQL 数据目录同步工具 pg_rewind
pg_rewind到底能做什么?
我们知道postgresql的主从切换有点麻烦,或者说操作步骤要求很严格。可能我们经常遇到这种情况,在没有将主库杀死的情况下将备库提升为主,这时主备库可能由于某种原因都在提供写入操作,这时发生脑裂,如果不考虑数据丢失因素,这时我们可能想将原来的主库以备库的模式重新加入集群,但是主备库此时的时间线已经偏离了,这时就需要我们的pg_rewind工具了。
数据库架构之美
2019/12/18
7880
用Java获取PostgreSQL变更数据
上期示例了一下 Oracle CDC的配置 过程,本期我们再来看一下 用 Java 程序实现 PostgreSQL 如何实现变更数据的获取。
Yunjie Ge
2022/04/24
1.7K3
Postgresql主从复制
Postgresql主从复制 主备数据库启动,备库启动wal_receiver进程,wal进程向主库发送连接请求; 主库收到连接请求后启动wal_sender进程,并与wal_receiver进程建立tcp连接; 备库wal_receiver进程发送最新的wal lsn 给主库; 主库进行lsn 对比,定期向备库发送心跳信息,来确认备库的可用性,并且将没有传递的wal日志文件进行发送,同时调用SyncRepWaitForLSN()函数来获取锁存器,并且等待备库响应;锁存器的释放时机和主备同步模式的选择有
用户7353950
2022/05/11
8690
Postgresql主从复制
聊聊PostgreSQL的Replication
CAP理论 consistency:在整个集群角度来看,每个节点是看到的数据一致的;不能出现集群中节点出现数据不一致的问题 vailability:集群中节点,只有有一个节点能提供服务 partitioning:集群中的节点之间网络出现问题,造成集群中一部分节点和另外一部分节点互相无法访问 基本术语 Master节点:提供数据写的服务节点 Standby节点:根据主节点(master节点)数据更改,这些更改同步到另外一个节点(standby节点) Warm Standby节点:可以提升为master节点的s
用户4700054
2022/08/17
1.5K0
聊聊PostgreSQL的Replication
PostgreSQL 通过pg_waldump 来分析pg_wal日志
读取MYSQL的binlog 并将其解析为可读的日志是一件简单的事情,mysqlbinlog 命令就可以将bin 日志解析, 那postgresql是否可以将pg_wal 中的日志进行解析,并且提供一些特殊的功能,如题目给出的,想查询某个时间短插入的数据量。
AustinDatabases
2021/09/26
2.6K0
[译]PG复制和自动故障转移--2
6)通过pg_waldump --path=/tmp/sd/pg_wal -start=0/1C420B8看下日志文件里内容。使用的是步骤3中的起始LSN。注意WAL中包含创建物理文件的指令:
yzsDBA
2022/04/28
7030
[译]PG复制和自动故障转移--2
PostgreSQL从小白到高手教程 - 第44讲:pg流复制部署
PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。
用户5892232
2024/02/02
4680
PostgreSQL从小白到高手教程 - 第44讲:pg流复制部署
【DB宝91】PG高可用之主从流复制+keepalived 的高可用
通过keepalived 来实现 PostgreSQL 数据库的主从自动切换,以达到高可用。当主节点宕机时,从节点可自动切换为主节点,继续对外提供服务。
AiDBA宝典
2022/02/23
2.9K0
【DB宝91】PG高可用之主从流复制+keepalived 的高可用
使用pg_resetwal时空穿梭找回“幽灵”元组
pg_resetwal工具是个很有用的工具,我们使用它来修改控制文件的一些信息,可能用的最多的地方是应急清理wal日志并更新lsn信息。但是pg_resetwal这个功能你可能没听说过,可以使用pg_resetwal修改当前事务号来达到查看死元组的信息,这些死元组随着事务号的推进可能会像“幽灵”一样出现,然后消失,通过这种方法可以找回以前的行记录信息。下面具体来看看。
数据库架构之美
2020/12/01
7110
PostgreSQL主备流复制搭建
Postgresql9开始支持流复制(stream replication),作为pg原生的复制技术,有着很好的性能。本文从几个方面全面介绍pg的流复制技术。
数据库架构之美
2019/12/18
3K0
PostgreSQL主备流复制搭建
PostgreSQL从小白到高手教程 - 第48讲:PG高可用实现keepalived
PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。
用户5892232
2024/03/22
3430
PostgreSQL从小白到高手教程 - 第48讲:PG高可用实现keepalived
【DB宝60】PG12高可用之1主2从流复制环境搭建及切换测试
PostgreSQL在9.x之后引入了主从的流复制机制,所谓流复制,就是备服务器通过tcp流从主服务器中同步相应的数据,主服务器在WAL记录产生时即将它们以流式传送给备服务器,而不必等到WAL文件被填充。
AiDBA宝典
2021/07/29
3.3K0
PostgreSQL 备份与恢复(第一章)
PostgreSQL官方文档指定了以下三种备份方法,详见:https://www.postgresql.org/docs/current/backup.html
DB之路
2021/07/14
9.9K0
PostgreSQL主从复制--逻辑复制
逻辑复制是基于逻辑解析,其核心原理是逻辑主库将Publication中表的WAL日志解析成一定格式并发送给逻辑备库,逻辑备库Subscription接收到解析后的WAL日志后进行重做,从而实现表数据同步。
俊才
2019/10/14
4.6K0
PostgreSQL主从复制--逻辑复制
PostgreSQL PG15 新功能 PG_WALINSPECT
开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 liuaustin3 (共1250人左右 1 + 2 + 3 +4)新人会进入3群(即将关闭自由申请) 默认会进入4群
AustinDatabases
2023/09/06
3460
PostgreSQL  PG15 新功能 PG_WALINSPECT
Postgresql主从复制--物理复制
PostgreSQL支持物理复制(流复制)及逻辑复制2种。通过流复制技术,可以从实例级复制出一个与主库一模一样的实例级的从库。流复制同步方式有同步、异步两种。
俊才
2019/09/26
6.8K0
进阶数据库系列(二十):PostgreSQL 数据库备份与恢复
此种方式是直接备份数据库物理文件,在pg数据库里,这通常指的是PGDATA变量定义的文件夹,例如:
民工哥
2023/08/22
7.7K0
进阶数据库系列(二十):PostgreSQL 数据库备份与恢复
PostgreSQL 14中两阶段提交的逻辑解码
Fujitsu OSS团队和PostgreSQL开源社区合作在PG14中添加了在逻辑复制中对两阶段提交进行解密的功能。下面看看这项功能是什么?
yzsDBA
2021/11/26
1.5K0
PostgreSQL 14中两阶段提交的逻辑解码
PostgreSQL13流复制主从同步配置,切换步骤
本文档详细记录如何一步一步在两台Linux服务器上,搭建PostgreSQL数据库主从模式的高可用数据库环境,以及如何手工切换主备库,及其注意事项。
用户8006012
2022/05/31
7.5K0
推荐阅读
相关推荐
进阶数据库系列(二十一):PostgreSQL 数据目录同步工具 pg_rewind
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验