PostgreSql 项目实战 6 - 物理备份PITR

43 阅读4分钟

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;