LVM快照是Linux逻辑卷管理器提供的一项块设备级功能,配合PostgreSQL的在线备份模式,可以在几乎不影响业务的情况下拿到一份完整的物理备份。整个过程的核心思路是:先让PostgreSQL进入备份模式,冻结数据目录对应的逻辑卷,创建一个快照卷,然后立刻结束备份模式恢复业务写入,最后再慢慢拷贝快照卷里的数据。真正需要暂停或影响写入的窗口只有几秒钟,剩下的拷贝工作可以离线慢慢做。

一、LVM快照的底层原理:写时复制机制
理解LVM快照,关键在于理解写时复制(Copy-On-Write,简称COW)。创建快照的瞬间,系统并不会复制原始卷上的任何数据,只是记录了一个时间点的元数据,快照卷里最初几乎是空的。之后原始卷上每发生一次写入操作,LVM都会先把即将被覆盖的旧数据块搬到快照卷中保存,再往原始卷写入新数据。
这个机制带来两个直接的好处。第一,创建快照几乎是瞬时完成的,不管你的数据目录是10GB还是1TB,快照的生成都只涉及元数据操作,耗时以秒计。第二,快照卷呈现的永远是创建那一刻的数据状态,之后原始卷怎么变化都与它无关,这就保证了备份内容的时间一致性。
快照卷也有一个必须重视的局限:它需要预留空间来存放被搬移的旧数据块。如果快照存在期间原始卷的写入量超过了预留空间,快照就会失效,变成不可用的状态。所以快照空间大小的估算非常重要,一般建议按照拷贝快照所需时间乘以业务写入速率来估算,再留出充足余量。举个例子,如果拷贝快照需要30分钟,业务高峰每分钟写入量约为200MB,那么至少要预留6GB,实际操作中给到10GB会更稳妥。
二、备份前的准备工作:检查环境与规划卷布局
动手之前先确认几件事。首先,PostgreSQL的数据目录必须放在LVM逻辑卷上,这是整个方案的前提。可以用下面的命令检查数据目录所在的文件系统和挂载点:
# 查看 PostgreSQL 数据目录位置 sudo -u postgres psql -c "SHOW data_directory;" # 查看挂载信息,确认是否在逻辑卷上 df -h /var/lib/postgresql/16/main # 查看卷组剩余空间,快照需要有空间可分 sudo vgs
其次要确认卷组(VG)里有足够的空闲Extent。快照卷的空间要从同一个卷组中分配,如果卷组已经满了,快照创建会直接失败。另外,务必开启归档模式或者至少保证WAL在备份期间不会丢失,因为快照只是冻结了数据文件的状态,备份开始点之后产生的WAL日志必须完整保留,恢复时才能达到一致状态。
修改postgresql.conf中的归档参数并重启后,可以用下面的SQL确认归档已经生效:
# postgresql.conf 中开启归档 archive_mode = on archive_command = 'cp %p /archive/%f' archive_timeout = 300 # 重启后确认 sudo -u postgres psql -c "SELECT pg_is_in_backup();" sudo -u postgres psql -c "SHOW archive_mode;"
三、完整备份操作步骤:从开始备份到快照拷贝
万事俱备后,正式的备份流程分为四个阶段。第一个阶段是让PostgreSQL进入备份模式,这一步会强制发生一次检查点,并在数据目录中写入backup_label文件,标记备份的起始位置:
# 以超级用户身份执行开始备份指令
sudo -u postgres psql -c "SELECT pg_start_backup('lvm_backup_001', true);"
第二个参数true表示使用快速检查点,能缩短指令执行时间。第二个阶段立刻创建快照卷,这是整个流程中时间敏感的一步:
# 假设数据目录在 /dev/vg_data/lv_pgdata 上 sudo lvcreate --size 10G --snapshot --name lv_pgdata_snap /dev/vg_data/lv_pgdata # 确认快照已创建 sudo lvs
第三个阶段马上结束备份模式,恢复PostgreSQL的正常写入节奏:
sudo -u postgres psql -c "SELECT pg_stop_backup();"
到这里业务影响就结束了,加起来通常不超过几秒到几十秒。第四个阶段挂载快照卷并拷贝数据,这一步完全离线化,想拷多久都行:
# 以只读方式挂载快照 sudo mkdir -p /mnt/pg_snap sudo mount -o ro /dev/vg_data/lv_pgdata_snap /mnt/pg_snap # 用 tar 打包拷贝到备份存储 sudo tar -czf /backup/pgdata_snap_001.tar.gz -C /mnt/pg_snap . # 完成后卸载并删除快照,释放空间 sudo umount /mnt/pg_snap sudo lvremove -f /dev/vg_data/lv_pgdata_snap
四、恢复验证与常见踩坑点
备份做出来只是第一步,能恢复才算真正可用。恢复时把tar包解压到新的数据目录,注意文件属主必须改成postgres用户,然后配置recovery指向归档WAL的位置,启动数据库让它回放备份结束点之后的日志,最终达到一致状态。如果恢复了replication相关文件,记得清理掉旧的standby.signal等内容,避免以备机身份启动。
实践中最常见的坑有三个。第一是快照空间给太小,拷贝还没做完快照就失效了,表现为读取快照卷时报I/O错误,务必通过lvs命令中的Data%字段监控快照使用率,一旦超过八成就应该加快拷贝速度或者提前规划更大的快照空间。第二是忘记开启归档,导致备份结束点之后的WAL被回收覆盖,备份虽然拷出来了却无法恢复到一致状态。第三是数据目录和WAL日志放在同一个卷上时,pg_stop_backup之后的WAL增长也会消耗快照空间,规划时要一并算进去。把这些细节都照顾到,LVM快照备份就是一种既快又稳的物理备份手段。
PostgreSQL备份LVM快照pg_start_backup修改时间:2026-09-03 02:02:41