1 主要文件wal记录
1.1 wal日志 简单介绍
1 记录了所有操作的节点信息,是备份恢复的必须条件!
2 存放位置:pg_wal目录;
3 会循环覆盖,所以配置自动需要备份;
4 可以根据wal日志,恢复数据到 指定的时间 或者 事务节点!
sql查看当前wal文件名:
-- 1 查看当前使用的wal日志 0/7B66DF8
select pg_current_wal_lsn();
-- 基于lsn查询具体的wal日志名称 000000010000000000000007
select pg_walfile_name('0/7B66DF8')
select pg_walfile_name(pg_current_wal_lsn())
查看日志:
--- 使用原生工具:pg_waldump
--- 命令:pg_waldump ./000000010000000000000008
1.2 wal日志 归档配置
解决wal日志循环覆盖的问题,配置归档配置,修改配置文件 postgresql.conf
#------------------------------------------------------------------------------
# WRITE-AHEAD LOG
#------------------------------------------------------------------------------
# - Settings -
# 1 wal日志复制级别 - 完整复制级别
wal_level = replica # minimal最小, replica完整, or logical逻辑
# (change requires restart)
# 2 开启同步写入磁盘
fsync = on # flush data to disk for crash safety
# - Archiving -
# 3 开启归档
archive_mode = on # enables archiving; off, on, or always
# (change requires restart)
# 4 与 archive_command 冲突,暂时不推荐使用
#archive_library = '' # library to use to archive a WAL file
# (empty string indicates archive_command should
# be used)
# 5 配置归档路径
archive_command = 'test ! -f /var/lib/postgresql/data/archive/%f && cp %p /var/lib/postgresql/data/archive/%f'
# command to use to archive a WAL file
# placeholders: %p = path of file to archive
# %f = file name only
1.3 创建归档路径
根据 archive_command 创建归档路径
1 进入容器
docker exec -it postgresql17 bash
2 切换到 postgres 用户
su - postgres
3 查看身份
whoami
4 切换路径
cd /var/lib/postgresql/data/
5 创建备份存储路径
mkdir archive
6 查看archive所属及权限(如果所属部队需要修改所属和权限)
ls -la
1.4 修改配置之后 重启PG服务 配置才能生效
--只有在切换wal日志之前归档备份wal日志
1.5 测试wal日志归档
写入10万条数据,查看wal日志的归档信息
2 物理备份
2.1 创建备份目录
1 进入容器
docker exec -it postgresql17 bash
2 切换到 postgres 用户
su - postgres
3 查看身份
whoami
4 切换路径
cd /var/lib/postgresql/data/
5 创建备份存储路径
mkdir pg_basebackup
6 查看archive所属及权限(如果所属部队需要修改所属和权限)
ls -la
2.2 修改备份权限
不修改备份权限,会被分失败,报错信息没有权限!
修改配置文件 pg_hba.config
# replication privilege.
host replication postgres 0.0.0.0/0 scram-sha-256
2.3 执行备份命令
pg_basebackup -D /var/lib/postgresql/data/pg_basebackup -Ft -Pv -Upostgres -h 192.168.1.44 -p 5432 -R
-D 指定备份文件的存储路径
-Ft 备份文件打包
-Pv 输出备份的详细信息
-U 用户名(要拥有备份的权限replication)
-h ip地址
-p 端口号
-R 复制写配置文件
2.4 查看备份数据
/var/lib/postgresql/data/pg_basebackup 路径下查看:
文件1:base.tar , 文件2:pg_wal.tar
3 物理备份&恢复 PITR
3.1 暂停服务、清除数据
注意:清除数据之前,一定要将备份数据放到宿主机非挂载的路径,否则你会哭的!!!
1 停止postgresql 服务;
2 清空data路径下的所有数据:
/var/lib/postgresql/data/ rm -rf *
3.2 备份文件恢复
tar -xf base.tar -C /var/lib/postgresql/data/
tar -xf base.tar -C /var/lib/postgresql/data/archive/
3.3 维护配置文件 postgresql.auto.config
# 指定归档位置
restore_command = 'cp /var/lib/postgresql/data/archive/%f %p'
# 最大程度的恢复 (如果指定恢复,需要关掉)
recovery_target = 'immediate'
# 指定节点恢复
# recovery_target_xid = '7796'
# 指定时间恢复
# recovery_target_time = '2025-10-31 14:48:28 UTC'
8.3 重启自动恢复备份数据
重启服务
检查备份数据是否成功
-- 1. 检查当前是否处于恢复模式
SELECT pg_is_in_recovery();
-- 如果返回 false,说明已不在恢复模式
-- 如果返回 true,说明还在恢复模式,需要执行下一步
-- 2. 如果还在恢复模式,完成恢复(让数据库可写)
SELECT pg_wal_replay_resume();
-- 3. 验证数据库现在可写
CREATE TABLE IF NOT EXISTS recovery_test (id int);
INSERT INTO recovery_test VALUES (1);
DROP TABLE recovery_test;