PG 13 pg_basebackup 重建从库 — 操作与排坑文档环境项目详情主库MASTER_IPPG 13从库STANDBY_IPRHEL 9数据目录/var/lib/pgsql/13/data/复制用户replicator/REPL_PASSWORD零、重建前检查必做别跳过动手之前在主库上跑一遍确认三件事从库真坏了、归档开着、WAL 够用。0.1 从库 —— 确认真的需要重建-- 从库上查连得上查 SQL连不上看日志SELECTstatus,sender_host,pg_size_pretty(pg_wal_lsn_diff(pg_last_wal_receive_lsn(),pg_last_wal_replay_lsn()))ASlagFROMpg_stat_wal_receiver;streaming lag ≈ 0 → 正常不需要重建streaming lag 持续涨 → 先查磁盘/网络追不上再重建连不上 / 进程在但 SQL 不通 → 大概率要重建看日志确认# 从库连不上时直接看 PG 日志搜错误grep-Eincorrect prevlink|corrupt|FATAL|PANIC/var/lib/pgsql/13/data/log/postgresql-*.log|tail-20看到record with incorrect prev-link→ WAL 物理损坏必须重建。其余情况could not receive data、could not connect等先排查网络和主库状态。0.2 主库 —— 确认归档 WAL 保留-- 在主库一条 SQL 查完关键配置SELECTname,settingFROMpg_settingsWHEREnameIN(archive_mode,archive_command,wal_keep_size,wal_level);检查项正常值不正常的后果wal_levelreplica或logicalpg_basebackup 直接拒绝连接archive_modeon或always归档没开WAL 只能靠wal_keep_size或 slot 保留备份期间如果被清理就失败archive_command非空如pgbackrest archive-push ...空 归档没实际跑同上wal_keep_size非 0且 ≥ 备份期间主库产生的 WAL 量太小 没有 slot → WAL 被轮转清理备份报WAL segment removed-- 再看 replication slot有则额外保险SELECTslot_name,active,pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn))ASretainedFROMpg_replication_slots;-- active t → 有 slot 兜底WAL 不会被清结论archive_mode offwal_keep_size很小 没有 active slot → 危险。要么开归档要么重建前临时调大wal_keep_sizeALTERSYSTEMSETwal_keep_size10GB;SELECTpg_reload_conf();一般 10GB 足够了。除非数据目录几百 GB 以上、备份要跑半小时以上再酌情加大。0.3 从库到主库连通性# 在从库上测免得 firewall / pg_hba.conf 没配PGPASSWORDREPL_PASSWORD/usr/pgsql-13/bin/psql-hMASTER_IP-Ureplicator-dpostgres-cSELECT 1通了再往下走不通先查主库pg_hba.conf见下一节。0.4 记基线-- 主库执行备份跑完回来对比SELECTpg_current_wal_lsn()ASbefore_backup_lsn;一、主库配置一次性主库pg_hba.conf添加复制用户host replication replicator STANDBY_IP/32 md5创建复制用户CREATEROLE replicatorWITHREPLICATIONLOGIN PASSWORDREPL_PASSWORD;SELECTpg_reload_conf();二、pg_basebackup 重建从库2.1 停从库 清空数据目录sudo-upostgres /usr/pgsql-13/bin/pg_ctl stop-mfast-D/var/lib/pgsql/13/data/rm-rf/var/lib/pgsql/13/data/*2.2 执行 pg_basebackupsudo-upostgresenvPGPASSWORDREPL_PASSWORDnohup/usr/pgsql-13/bin/pg_basebackup\-hMASTER_IP-p5432-Ureplicator\-D/var/lib/pgsql/13/data-P-R-Xstream\/tmp/pg_basebackup.log21echoPID:$!参数含义-R自动生成standby.signalprimary_conninfo起库就是从库-X stream边备份边拉 WAL不依赖归档目录-P显示进度如194578343/194578343 kB (100%), 1/1 tablespace2.3 看进度# 实时看tail-f/tmp/pg_basebackup.log# 跑完后看最终结果tail-5/tmp/pg_basebackup.log# 看到 kB (100%), 1/1 tablespace 完成# 数据目录大小在涨就是在传du-sh/var/lib/pgsql/13/data/2.4 起库sudo-upostgres /usr/pgsql-13/bin/pg_ctl start-D/var/lib/pgsql/13/data/2.5 验证-- 1. 从库 walreceiver 状态SELECT*FROMpg_stat_wal_receiver;-- status streamingSELECTnow()-pg_last_xact_replay_timestamp();-- 延迟应接近 0-- 2. 看从库追到哪了SELECTpg_last_wal_replay_lsn()ASstandby_replay_lsn;-- 3. 切到主库看主库当前写到哪了-- (从库上跑也行连主库查)-- 对比 0.4 记录的 before_backup_lsn-- - 从库 replay_lsn before_backup_lsn → 重建成功且已经追过备份起点 ✅-- - 从库 replay_lsn before_backup_lsn → 重建完成了但在备份点没动 ⚠️ 等一会再查-- - 从库 replay_lsn before_backup_lsn → 不正常检查日志三、常见问题坑 1command not foundsudo -u postgres不加载/usr/pgsql-13/bin/。用完整路径/usr/pgsql-13/bin/pg_basebackup。坑 2could not change directory to /rootsudo -u postgres在/root下执行时 postgres 用户无权访问打印这行警告。不影响备份或者在/tmp下跑就不会出现。坑 3密码不传卡死.pgpass位置或权限不对时会卡住等密码。用env PGPASSWORD...直接传零依赖。坑 4进程残留多次失败后ps aux | grep pg_basebackup看到一堆僵尸进程pkill-9-fpg_basebackup四、完整执行脚本可复用#!/bin/bash# pg_basebackup 从库重建后台执行 du 监控MASTER_HOSTMASTER_IPMASTER_USERreplicatorMASTER_PASSREPL_PASSWORDPG_DATA/var/lib/pgsql/13/dataPG_BIN/usr/pgsql-13/bin# 1. 停从库sudo-upostgres${PG_BIN}/pg_ctl stop-mfast-D${PG_DATA}2/dev/null# 2. 清空rm-rf${PG_DATA}/*# 3. 后台拉cd/tmpsudo-upostgresenvPGPASSWORD${MASTER_PASS}nohup${PG_BIN}/pg_basebackup\-h${MASTER_HOST}-p5432-U${MASTER_USER}-D${PG_DATA}-P-R-Xstream\/tmp/pg_basebackup.log21echoPID:$!# 4. 看日志echotail -f /tmp/pg_basebackup.log 看进度# 5. 起库sudo-upostgres${PG_BIN}/pg_ctl start-D${PG_DATA}echo从库已启动确认sudo-upostgres${PG_BIN}/psql-cSELECT * FROM pg_stat_wal_receiver;文档日期2026-06-25适用PG 13 pg_basebackup 重建从库