1. pg_basebackup 客户端进程

    pg_basebackup 的“客户端进程”,本质上就是在备份机上启动的那个前台工具进程。它不是数据库实例内部的常驻后台进程,而是一个 PostgreSQL 客户端程序:负责连到源库,发起基础备份请求,接收服务器发来的数据流,并把备份文件落到本地目录、tar 包,或者按参数写到目标位置。官方文档明确说,它通过 使用 replication protocol 的常规 PostgreSQL 连接 来完成备份。(PostgreSQL)
    可以把它理解成:备份任务的“控制端 + 接收端”
    它在备份过程中主要扮演这几个角色:
    1. 发起者
    pg_basebackup 先作为客户端连接到源库,连接用户需要具备 REPLICATION 权限或超级用户权限,并且 pg_hba.conf 要允许这种 replication 连接。它会向服务端发出 BASE_BACKUP 请求,告诉服务端“开始输出一个可恢复的一致性基础备份”。(PostgreSQL)
    2. 备份会话的协调者
    虽然真正读取数据文件的是服务端,但 pg_basebackup 负责把整个备份流程组织起来。官方文档说明,执行 BASE_BACKUP 时,系统会自动进入和退出 backup mode;而 pg_basebackup 会保证这个过程自动完成。也就是说,它不是简单地“拷文件”,而是在和服务端协同,拿到一个逻辑上一致、可用于恢复的基础备份。(PostgreSQL)
    3. 数据接收者
    服务端把数据目录/表空间内容通过复制协议流式发送出来,pg_basebackup 客户端进程负责持续接收这些数据块,并按你指定的格式写出:
    plain:写成目录结构
    tar:写成 base.tar 等归档文件
    也可以根据参数做压缩、表空间映射、指定输出路径等。(PostgreSQL)
    4. WAL 获取者
    基础备份只拿到数据文件还不够,要想恢复可用,还需要配套 WAL。pg_basebackup 客户端会根据 -X 选项决定怎么处理 WAL:
    -X stream边做基础备份,边再开第二条连接流式接收 WAL
    -X fetch:等基础备份结束后,再去取所需 WAL
    -X none:不取 WAL,由你自己另外保证 WAL 可获得。
    其中 -X stream 是默认方式,官方文档明确说这会打开 第二个连接,并行流式接收 WAL,因此需要 两个 replication 连接。(PostgreSQL)
    这一点很关键:
    -X stream 模式下,pg_basebackup 客户端不仅是“基础文件接收者”,还临时充当了 WAL receiver 的角色,只不过它接收 WAL 的目的不是持续复制,而是为了让这次备份在恢复时完整可用。(PostgreSQL)
    5. 备份结果的整理者
    客户端进程还会负责一些收尾工作,例如:
    写备份文件到目标目录
    可选生成/接收 backup_manifest
    可选写入 standby.signalpostgresql.auto.conf-R),方便把这份基础备份直接用来拉起一个 standby
    默认情况下还会等待文件安全落盘;除非显式指定 --no-sync。(PostgreSQL)

    它和服务端进程的分工
    可以这样区分:
    服务端(primary / standby 上的 walsender 等)负责:
    进入/退出 backup mode
    枚举并读取数据库集群文件
    按 replication protocol 把基础备份数据流发给客户端
    按需发送 WAL。(PostgreSQL)
    客户端 pg_basebackup 进程负责:
    建立 replication 连接
    发起 BASE_BACKUP
    接收基础备份数据
    接收或拉取 WAL
    写到本地/目标位置
    按参数做压缩、限速、进度显示、slot 使用等。(PostgreSQL)

    用一句话概括它的作用
    pg_basebackup 客户端进程的作用就是:
    作为备份任务的执行端,向 PostgreSQL 服务端发起基础备份请求,并把服务端输出的基础数据文件和所需 WAL 接收下来,组织成一份可恢复、可用于搭建 standby 的物理备份。 (PostgreSQL)

    一个很实用的理解方式
    把它类比成“拉流客户端”会更直观:
    服务端像“推流端”
    pg_basebackup 像“拉流端”
    拉的不是业务查询结果,而是 数据库物理文件 + WAL
    目标不是查询,而是生成一份 可恢复的物理备份。(PostgreSQL)

一张 pg_basebackup 备份时的 客户端 / walsender / WAL / 数据目录 交互流程图:


1)整体流程图

┌──────────────────────────────┐
│ 备份机 / 运维主机 │
│ │
│ pg_basebackup 客户端进程 │
│ ------------------------ │
│ 1. 建立 replication 连接 │
│ 2. 发送 BASE_BACKUP 请求 │
│ 3. 接收基础备份数据流 │
│ 4. 接收/获取 WAL │
│ 5. 写成本地备份文件 │
└──────────────┬───────────────┘
│ replication protocol


┌──────────────────────────────┐
│ PostgreSQL 源库服务器 │
│ │
│ postmaster │
│ └─ walsender 进程 │
│ ------------------ │
│ 1. 响应 BASE_BACKUP │
│ 2. 读取数据目录文件 │
│ 3. 流式发送备份内容 │
│ 4. 按需发送 WAL │
└───────┬──────────────────────┘

│ 读取

┌──────────────────────────────┐
│ PGDATA / tablespace │
│ 数据文件、控制文件等 │
└──────────────────────────────┘

pg_basebackup 是 PostgreSQL 自带的客户端工具,用来对正在运行的数据库集群做 base backup;它通过 replication protocol 和服务器通信。服务器侧则由 WAL sender process 来执行 BASE_BACKUP 并流式发送备份内容。


2)如果使用默认的 -X stream,流程会多一条 WAL 通道

这是最常见、也最容易考察“客户端进程作用”的场景。

                主连接:基础备份数据
┌──────────────────────────────┐ ┌──────────────────────────────┐
│ pg_basebackup 客户端进程 │─────▶│ walsender #1 │
│ │ │ 执行 BASE_BACKUP │
│ - 接收 data files │◀─────│ 发送数据目录/表空间内容 │
│ - 写到 backup 目录或 tar │ └──────────────────────────────┘


│ 第二连接:WAL 流
│ │─────▶┌──────────────────────────────┐
│ - 接收 WAL │◀─────│ walsender #2 │
│ - 保证备份可恢复 │ │ 流式发送 WAL │
└──────────────────────────────┘ └──────────────────────────────┘

官方文档说明,-X stream 会在备份时 打开第二个连接来流式接收 WAL,所以此时通常需要 两个 replication 连接。同时 max_wal_senders 也必须配置得足够大,因为它限制了 standby 或 streaming base backup client 可并发占用的 WAL sender 数。


3)客户端进程在备份中具体起什么作用

第一层:发起者

它先连上源库,使用 replication 连接发起 BASE_BACKUP
没有这个客户端进程,服务端不会自己“主动备份”;它必须由 pg_basebackup 这类客户端触发。

第二层:协调者

它不是单纯拷文件,而是在和服务端协同拿一份 一致性基础备份
服务端负责执行 BASE_BACKUP,客户端负责驱动整个会话,把这次备份从“请求”推进到“完整落盘”。pg_stat_progress_basebackup 里也能看到正在运行 BASE_BACKUP 并流送备份的 WAL sender 进度。

第三层:接收者

服务端读取 PGDATA、表空间等文件后,不是直接写到你的备份目录;真正把这些数据 接下来并写出去 的,是 pg_basebackup 客户端进程。
也就是说:

  • 服务端负责“读源数据、发数据”
  • 客户端负责“收数据、写备份”
第四层:WAL 获取者

要让 base backup 可恢复,只拿数据文件还不够,还要拿到对应 WAL。
pg_basebackup 客户端根据参数决定 WAL 的获取方式:

  • -X stream:边备份边流式接收 WAL
  • -X fetch:备份后再取所需 WAL
  • -X none:不取 WAL,由外部自己保证 WAL 可用。

所以客户端进程不仅接收“静态数据文件”,还会接收“动态产生的 WAL”,它相当于这次备份任务里的 临时 WAL receiver。这个角色是保证“这份备份将来真的能恢复”的关键。

第五层:落盘者 / 封装者

客户端把收到的数据组织成你指定的输出形式,例如:

  • 普通目录格式
  • tar 格式
  • 压缩输出
  • 生成 backup manifest
  • 可选写 standby.signal 和连接配置(-R)以便直接启动成 standby。

4)一句话理解“客户端进程”的角色

pg_basebackup 客户端进程 = 备份任务的发起端 + 数据接收端 + WAL 接收端 + 备份落盘端。

它自己不负责在源库本地扫描并直接拷贝文件;真正读取数据库文件的是服务端的 walsender / BASE_BACKUP 执行端。客户端的核心职责是 发起、接收、组织、保存


5)最容易混淆的一点

很多人会误以为:

pg_basebackup 客户端进程就是在远程执行 cp / tar 拷文件”

这个理解不准确。

更准确地说,它是在 复制协议层 拉取一份服务端生成的物理备份数据流。
也就是说,它是 协议客户端,不是 SSH 上去直接扫目录的脚本。


6)这个流程

pg_basebackup 客户端

连接 primary(replication 连接)

发送 BASE_BACKUP

服务端 walsender 读取数据文件并流式发送

客户端接收并写备份

同时或随后获取 WAL

形成可恢复的物理基础备份

这份基础备份可用于 PITR,也可作为搭建 log-shipping / streaming-replication standby 的起点。




主库上会看到哪些进程(postmaster / walsender / checkpointer 等),其中 pg_basebackup 对应哪一个

pg_basebackup 客户端进程,不是在主库内部的某个常驻后台进程。
它是在备份机上运行的一个外部客户端;而它在主库上“对应出来”的,是一个或两个 walsender 进程pg_stat_progress_basebackup 里显示的也是 正在执行 BASE_BACKUP 并流式发送备份的 WAL sender

1)主库上的进程视角图

主库服务器(PostgreSQL)postmaster
├─ checkpointer
├─ background writer
├─ walwriter
├─ autovacuum launcher
├─ autovacuum worker(s)
├─ archiver (如果开启归档)
├─ postgres backend(s) (普通客户端会话)
└─ walsender(s)
├─ walsender #1 <== 被 pg_basebackup 客户端占用
│ 作用:执行 BASE_BACKUP,读取数据目录并发送基础备份数据

└─ walsender #2 <== 仅在 -X stream 时常见
作用:流式发送 WAL 给 pg_basebackup 客户端

也就是说:

  • 你在备份机上看到的是pg_basebackup 客户端进程
  • 你在主库上看到的是:它建立出来的 walsender 连接
  • 不是 checkpointer / walwriter / bgwriter 在“替代”它做备份
    这些进程仍做各自的数据库后台工作,只是为系统正常运行提供环境。

2)它在主库上到底“对应哪一个进程”

最准确的说法是:

在主库上,pg_basebackup 对应的是 WAL sender process

官方进度视图说明得很直接:
pg_stat_progress_basebackup 中每一行,对应一个 正在运行 BASE_BACKUP 并流式发送备份的 WAL sender process

所以当你问:

pg_basebackup 客户端进程在主库上对应哪个进程?”

答案是:

对应主库上的 walsender 进程,而不是普通 postgres backend


3)为什么是 walsender,不是普通 backend

因为 pg_basebackup 不是走普通 SQL 查询路径来“select 数据文件”,而是通过 replication protocol 发起 BASE_BACKUP
pg_basebackup 官方文档也明确说,它使用的是 replication protocol 的常规 PostgreSQL 连接。这类连接在服务端侧由 walsender 处理。

所以这里要分清两类服务端进程:

普通业务连接

  • 对应主库上的普通 backend
  • 执行 SELECT / INSERT / UPDATE / DELETE

复制 / 备份连接

  • 对应主库上的 walsender
  • 执行 BASE_BACKUP、发送 WAL、提供流复制数据

pg_basebackup 属于第二类。


4)备份时各个进程分别干什么

① 备份机上的 pg_basebackup 客户端进程

它负责:

  • 发起 replication 连接
  • 发送 BASE_BACKUP
  • 接收主库发来的基础备份数据
  • 接收或获取 WAL
  • 把内容写到本地目录 / tar / 压缩包。

② 主库上的 walsender

它负责:

  • 接收客户端发来的 BASE_BACKUP 请求
  • 读取数据目录、表空间等内容
  • 将这些内容流式发送给客户端
  • 在需要时发送 WAL。

③ 主库上的其他后台进程

例如:

  • checkpointer
  • bgwriter
  • walwriter
  • archiver

它们不是 pg_basebackup 专属进程,但会影响备份环境的正常运行。
比如 WAL 会持续生成,归档可能在同步归档 WAL,checkpoint 会影响脏页刷盘节奏,但它们不是“备份会话的直接执行者”。这一点和 walsender 不一样。


5)-X stream 时为什么会看到两个相关连接

这是最容易在现场排查里碰到的点。

当你使用默认常见模式 -X stream 时:

  • 一个 walsender 用来执行 BASE_BACKUP,发送基础备份内容
  • 另一个连接用来 stream WAL

因此通常会占用 两个 replication 连接,也就可能在主库上看到两个相关的 walsender。官方文档明确写了:-X stream 会为 WAL 再打开一个第二连接。

所以你现场如果问:

“为什么一跑 pg_basebackup,主库上多了两个复制相关进程?”

很可能就是这个原因。


6)你在库里一般怎么识别它

可以从两个视角看:

视角 A:看进度

pg_stat_progress_basebackup
这里看到的是 执行 base backup 的 walsender 进度

视角 B:看活动连接/复制连接

pg_stat_activity / pg_stat_replication
官方统计文档说明,pg_stat_replication每个 walsender 一行

也就是说,排查时你可以这样理解:

  • pg_stat_activity:看连接和进程类型
  • pg_stat_replication:看复制发送侧状态
  • pg_stat_progress_basebackup:看 base backup 具体进度

7)一句话定性

你可以直接这样记:

pg_basebackup 是客户端;它在主库上体现为一个或多个 walsender 进程。
其中负责真正执行 BASE_BACKUP、把数据文件流出来的,是主库上的 walsender;客户端只负责发起、接收和落盘。


8)最适合面试/排障时的标准表述

你可以这样回答:

pg_basebackup 本身是运行在备份端的客户端程序,不属于主库内部后台进程。它通过 replication protocol 连接主库,在主库侧会对应一个执行 BASE_BACKUPwalsender 进程;如果使用 -X stream,还会再占用一个 walsender 用于流式接收 WAL。客户端负责发起备份、接收备份流并写到目标介质,服务端 walsender 负责读取集群文件并发送数据。


了解 www.876873.xyz 的更多信息

订阅后即可通过电子邮件收到最新文章。

pg_basebackup进程相关:等您坐沙发呢!

发表评论