数据库内核月报 - 2015 / 10-PgSQL · 特性分析 · pg_receivexlog工具解析

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

最近遇到这样一个需求:在做时间点恢复时,需要从主库获取最近生成的那些xlog文件(需要获取的xlog文件名是已知的)。怎么办?一个想法是,利用scp等工具,直接从主库下载,这要求我们处理整个下载过程,比较麻烦。其实PG已经为我们准备了一个xlog传输工具——pg_receivexlog。这个工具可能很多人都没注意到,而且官方文档中介绍的很少。在这里我们为大家解析一下这个工具。

能做什么

pg_receivexlog能为我们做什么呢?它能够从一个PG服务器,获取你想要的那些xlog日志文件。初步研究后,我们可以得到以下信息:

  1. 它以类似流式复制(streaming replication)的方式,获取主库的xlog文件。这意味着你要以超级用户或有replication权限的用户,连接PG进行日志传输,且要在pg_hba.conf里面,对其做权限配置。在连接建立后,PG服务器会有一个独立的WAL sender进程,负责xlog的传输,所以max_wal_senders要至少为1,使我们能获得一个WAL sender。
  2. 它不会等待一个xlog文件写完后才开始传输。也就是说,正在被写的xlog文件,也会进行传输,因此可以通过这个工具实时获取最新的xlog内容。
  3. 可以使用replication slot,通过同步replication slot的方式进行日志传输。这样做的好处是,主库在xlog传输完成前不会删除xlog文件。不过可能的风险是,如果日志没有利用slot成功传输,可能导致日志堆积在PG里面,最终把磁盘占满。

如何启动

PG安装后的bin目录里面,一般包含了pg_receivexlog这个工具。可以使用下面的方式启动它:

pg_receivexlog -h <host name> -p <port> -U <user> -W <password> -D <local dir to store xlog files>

其中,-h -p -U -W 选项指定要连接的PG的主机名、端口、用户、密码,-D 选项指定本地的一个目录,用于存储下载的xlog文件。另外缺省情况下,如果连接无法建立,或传输过程中连接意外断开,pg_receivexlog会进行重试,如果不想重试,可以指定-n选项。

有个问题是,如何指定要传输哪些xlog文件?先来看看pg_receivexlog如何确定从哪个xlog文件开始传输的。从src/bin/pg_basebackup/pg_receivexlog.c 的FindStreamingStart函数可以看出,pg_receivexlog会扫描整个-D选项指定的目录,将扫描到的每个文件名,去掉其timeline部分,转换为64为整数。选取其中对应整数最大的文件,按如下方式选择开始下载的文件:如果这个文件是以.partial为后缀的,则重新下载此文件和后续文件;如果该文件不带.partial后缀,是一个完整的日志文件,则从此文件的下一个文件(文件名加1)开始下载。如果我们需要从00000001000000000000001B到00000001000000000000001D的几个文件,则只需要在-D指定的目录里面执行:

touch 00000001000000000000001B.partial

保证此目录没有其他文件,然后按上面列出的方式启动pg_receivexlog即可,pg_receivexlog会重新下载00000001000000000000001B和后续文件。

如何停止

如何停止pg_receivexlog的执行呢?pg_receivexlog已经下载了我们需要的文件后,并不会自动停止,我们也没有办法指定它下载到哪个文件结束。唯一的办法是通过Ctl-C命令向它发送SIGINT信号来结束它。类似的,可以直接向它的进程发生kill命令:

kill -SIGINT <pg_receivexlog pid>

注意,pg_receivexlog只在成功传输完一个xlog文件后,才检查是否收到了SIGINT信号,因此你只可能在一个文件接收完成后正常结束pg_receivexlog运行。其实更暴力的办法是直接kill -9 也是可以的。

从上面的分析可以看出,pg_receivexlog这个工具还是比较简单易用的。除了传输xlog日志,可以利用它做一个日志服务器,用来存储归档的日志;还可以做为一主多备方案。由此可见,pg_receivexlog既是一个很实用的工具,也是一个可以用于更多场景的让人充满想象的利器。

目录
相关文章
|
1月前
|
数据库 索引
深入探索数据库索引技术:回表与索引下推解析
【10月更文挑战第15天】在数据库查询优化的领域中,回表和索引下推是两个核心概念,它们对于提高查询性能至关重要。本文将详细解释这两个术语,并探讨它们在数据库操作中的作用和影响。
50 3
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
43 3
|
2月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
50 3
|
2月前
|
存储 NoSQL 关系型数据库
数据库技术深度解析:从基础到进阶
【10月更文挑战第17天】数据库技术深度解析:从基础到进阶
78 0
|
1月前
|
存储 负载均衡 监控
数据库多实例的深入解析
【10月更文挑战第24天】数据库多实例是一种重要的数据库架构方式,它为数据库的高效运行和灵活管理提供了多种优势。在实际应用中,需要根据具体的业务需求和技术环境,合理选择和配置多实例,以充分发挥其优势,提高数据库系统的性能和可靠性。随着技术的不断发展和进步,数据库多实例技术也将不断完善和创新,为数据库管理带来更多的可能性和便利。
100 57
|
29天前
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
39 7
C# 9.0 新特性解析
|
1月前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
108 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
28天前
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
33 2
|
1月前
|
PHP 开发者
PHP 7新特性深度解析及其最佳实践
【10月更文挑战第31天】本文将深入探讨PHP 7带来的革新,从性能提升到语法改进,再到错误处理机制的变革。我们将通过实际代码示例,展示如何高效利用这些新特性来编写更加健壮和高效的PHP应用。无论你是PHP新手还是资深开发者,这篇文章都将为你打开一扇窗,让你看到PHP 7的强大之处。
|
1月前
|
安全 编译器 PHP
PHP 8新特性解析与实践应用####
————探索PHP 8的创新功能及其在现代Web开发中的实际应用

推荐镜像

更多