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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

最近遇到这样一个需求:在做时间点恢复时,需要从主库获取最近生成的那些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既是一个很实用的工具,也是一个可以用于更多场景的让人充满想象的利器。

目录
相关文章
|
13天前
|
存储 中间件 关系型数据库
数据库切片大对决:ShardingSphere与Mycat技术解析
数据库切片大对决:ShardingSphere与Mycat技术解析
21 0
|
1天前
|
Rust 安全 程序员
Rust vs Go:解析两者的独特特性和适用场景
在讨论 Rust 与 Go 两种编程语言哪种更优秀时,我们将探讨它们在性能、简易性、安全性、功能、规模和并发处理等方面的比较。同时,我们看看它们有什么共同点和根本的差异。现在就来看看这个友好而公平的对比。
|
2天前
|
SQL druid Java
Javaweb之数据库连接池以及lombok类库的详细解析
Javaweb之数据库连接池以及lombok类库的详细解析
15 0
|
2天前
|
SQL 存储 关系型数据库
数据库开发之图形化工具以及表操作的详细解析
数据库开发之图形化工具以及表操作的详细解析
18 0
|
2天前
|
SQL 存储 关系型数据库
数据库开发之mysql前言以及详细解析
数据库开发之mysql前言以及详细解析
10 0
|
12天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【4月更文挑战第12天】 在多任务操作系统如Linux中,进程调度机制是系统的核心组成部分之一,它决定了处理器资源如何分配给多个竞争的进程。本文深入探讨了Linux内核中的进程调度策略和相关算法,包括其设计哲学、实现原理及对系统性能的影响。通过分析进程调度器的工作原理,我们能够理解操作系统如何平衡效率、公平性和响应性,进而优化系统表现和用户体验。
20 3
|
15天前
|
JavaScript API UED
Vue3.0新特性解析与实战:Composition API、Teleport与Suspense
【4月更文挑战第6天】Vue3.0引入了颠覆性的Composition API,通过函数式方法提升代码可读性和复用性,例如`setup()`、`ref`等,便于逻辑模块化。实战中,自定义的`useUser`函数可在多个组件中共享用户信息逻辑。另外,Teleport允许组件渲染到DOM特定位置,解决模态框等场景的上下文问题。再者,Suspense提供异步组件加载的延迟渲染,使用fallback内容改善用户体验。这些新特性显著优化了开发和性能,适应现代Web需求。
19 0
|
19天前
|
负载均衡 算法 Linux
深度解析:Linux内核调度器的演变与优化策略
【4月更文挑战第5天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分——内核调度器。文章将首先回顾Linux内核调度器的发展历程,从早期的简单轮转调度(Round Robin)到现代的完全公平调度器(Completely Fair Scheduler, CFS)。接着,分析当前CFS面临的挑战以及社区提出的各种优化方案,最后提出未来可能的发展趋势和研究方向。通过本文,读者将对Linux调度器的原理、实现及其优化有一个全面的认识。
|
20天前
|
测试技术 PHP 开发者
PHP 7.4新特性深度解析
【4月更文挑战第4天】 本文将深入探讨PHP 7.4的新特性,包括预加载,数组解构,扩展的箭头函数等。我们将详细解释这些新特性的作用,以及如何在项目中使用它们来提高代码的效率和可读性。
|
5天前
|
关系型数据库 MySQL 分布式数据库
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
35 2

推荐镜像

更多