阶段一:物理环境隔离与契约建立 (Initialization)
- 前因: 灾难恢复的工程基线要求备份数据必须脱离当前运行主机的故障域。同时,备份工具需要独立管理自身的元数据、压缩配置和保留策略。
- 执行过程: 1. 执行
pg_probackup init和add-instance。 2. 工具在指定的外部存储路径上调用 Linuxmkdir系统调用,建立严格的目录层级:包含存放数据块的backups/目录,以及专门用于存放归档日志的wal/目录。 3. 生成pg_probackup.conf,确立连接源数据库的通信协议(本地 Socket 或 SSH)和路径映射。 - 物理结果: 构建了一个独立于 PostgreSQL 守护进程(postmaster)的静态物理存储架构。
阶段二:建立物理一致性基线 (Full Backup)
- 前因: 任何增量备份都必须依赖一个起始时间点。该时间点的数据文件必须是完整、物理一致且未损坏的。
- 执行过程:
- 打下时空锚点: 主控进程通过 libpq 协议连接 PostgreSQL,下发
SELECT pg_start_backup()。该指令在数据库内核中触发强制检查点(Checkpoint),迫使shared_buffers中的脏页立刻刷入物理磁盘(调用write和fsync)。随后,内核在 WAL 流中记录此时的绝对字节偏移量,即 Anchor LSN(基础日志序列号)。 - 多进程旁路读取: pg_probackup 主进程调用
fork()产生多个工作进程(Worker)。为了防止海量数据读取导致 PostgreSQL 共享内存池(shared_buffers)被击穿,Worker 进程直接利用 Linux 文件描述符,调用pread()函数,绕过数据库内存,直接从文件系统中并行读取底层数据文件。 - 硬件级防腐校验: 每次
pread()读取 8192 字节(一个标准 PG 数据页)到内存后,Worker 进程会读取页头的pd_checksum字段。随后调用 CPU 的 SSE4.2 硬件指令集对该 8KB 数据重新计算 CRC32C 校验码并进行比对。若不一致,判定为静默损坏(Torn Page),立即中断备份;若一致,则调用 zlib/lz4 算法压缩落盘。 - 释放拦截: 调用
pg_stop_backup()获取结束 LSN。
- 打下时空锚点: 主控进程通过 libpq 协议连接 PostgreSQL,下发
- 物理结果: 获得了一个时间点定格在 Anchor LSN、经过逐页完整性校验且被高度压缩的全量数据副本。
了解 www.876873.xyz 的更多信息
订阅后即可通过电子邮件收到最新文章。
多进程旁路读取:等您坐沙发呢!