PostgreSQL教程(10)物理备份工具pg_basebackup使用教程

PostgreSQL教程(10)物理备份工具pg_basebackup使用教程

一、PostgreSQL 物理备份介绍

物理备份是通过复制整个数据目录来对数据库实现备份的一种高效手段,备份对象包括所有的数据文件、WAL 日志以及相关的配置文件。在 PostgreSQL 中核心物理备份工具为 pg_basebackup和pg_rman,二者都可以实现在线物理热备,并且可以结合归档日志实现基于时间点恢复(PITR),使用物理备份的前置条件是数据库需要开启归档模式

二、pg_basebackup 使用教程

pg_basebackup是PostgreSQL 9.1以后原生支持的物理备份工具,该工具支持远程备份、从库备份,备份对象为整个实例而不只是部分数据,全量备份时会对 WAL 日志单独进行备份

1、pg_basebackup 常用选项

-F:指定输出格式,t 表示 tar 文件,p表示直接把数据文件拷贝到指定目录

-D:指定备份存放目录

-v:显示备份过程中的详细信息

-X:指定 WAL 日志的处理方式,s 表示 stream 流格式,备份过程中会实时流式传输 WAL 日志到备份目录,确保备份的一致性,即备份完成时,数据和 WAL 都完整,可直接用于恢复;n 表示不包含 WAL;fetch表示备份完成后再把需要的 WAL fetch 到备份目录(一般不使用该模式)

-h:数据库服务器地址

-p:数据库端口

-U:备份所使用的用户名

-W:提示输入密码

2、pg_basebackup 备份示例

· 使用tar格式进行备份

备份完成后会将数据和WAL日志分别进行压缩

/usr/local/postgersql_16_10/bin/pg_basebackup -D /data/backup/ -F t -v -X s

basebackup1.png


· 使用plain格式进行备份

plain格式备份就相当于是直接对数据文件进行复制拷贝,没有任何多余的操作

/usr/local/postgersql_16_10/bin/pg_basebackup -D /data/backup/ -F p -v -X s

3、pg_basebackup还原示例

· 恢复plain格式完整备份

由于plain格式是直接复制了文件到备份目录,所以只需要把这些文件反向复制到数据目录和WAL目录即可,整个过程和tar格式备份基本没有差别

· 恢复tar格式完整备份

# 1、解压tar格式备份文件到数据目录,如果是plain格式的备份直接复制即可
tar xvf /data/backup/base.tar -C /data/postgres_16_10/
# 2、恢复WAL日志,pg_wal为WAL默认保存路径
tar xvf /data/backup/wal.tar -C /data/postgres_16_10/pg_wal
# 3、修改目录权限
chmod -R 700 /data/postgres_16_10/
# 由于已经将数据文件和WAL全部解压到对应目录,并且没有指定时间点,此时可直接启动数据库
/usr/local/postgersql_16_10/bin/pg_ctl -D /data/postgresql_16_10/data/ -l logfile start

4、pg_basebackup 恢复指定时间点(PITR)备份

在进行时间点恢复前需要有一个基础备份,基础备份就是把所有数据文件完整拷贝出来的过程。在进行时间点恢复时需要基础备份和 WAL 日志相配合,最终确保数据一致。常见的在线进行基础备份工具是pg_basebackup,或者手动执行 pg_start_backup() / pg_stop_backup()函数,而离线基础备份可以采用停库后打包数据目录的方法来实现。进行时间点恢复和普通恢复的区别在于读取WAL日志的方式不同,普通恢复时是把WAL日志手动还原到了pg_wal目录,而PITR恢复则是来自配置参数target_command中所指定的目录,并且恢复完成后数据库状态也为pause。

下面是一个指定时间点恢复数据的模拟过程,在恢复前需要确保已经做过一次数据库开启了归档模式、执行过一次基础备份。后续操作都是基于基础备份完成:

· 模拟数据变更

-- 记录当前时间点,用于后续恢复
SELECT now(); 
-- 模拟操作
INSERT INTO t1(id, name) VALUES (1, 'Alice');
INSERT INTO t2(id, value) VALUES (100, 'Test');
UPDATE t1 SET name='Bob' WHERE id=1;
DELETE FROM t2 WHERE id=100;

· 模拟故障

停止数据库并清空数据

pg_ctl stop -m fast -D /data/postgresql_16_10/data
rm -rf /data/postgresql_16_10/data

· 恢复备份

# 1、解压tar格式备份文件到数据目录,如果是plain格式的备份直接复制即可。由于WAL日志已经进行归档,所以这里不需要单独再对备份的wal.tar进行恢复
tar xvf /data/backup/base.tar -C /data/postgres_16_10/data

# 2、创建recovery.signa1文件,当数据库启动时发现该文件就会进入恢复模式。一旦创建了该文件,必须配置restore相关配置。
touch /data/postgres_16_10/recovery.signal

# 3、修改目录权限
chmod -R 700 /data/postgres_16_10/data

# 4、修改postgresg1.conf,进行物理备份恢复配置
vi /data/postgresql_16_10/data/postgresql.conf
restore_command = 'cp /data/postgresql_16_10/archive/%f %p’ #如果需要的WAL不在默认的pg_wal目录,就通过restore_command取回
recovery_target_time = "2025-09-16 20:23:12"     #指定恢复到某一时刻
# recovery_target = immediate    #恢复到一致性状态后就停止恢复
# recovery_target_name = "my_restore_point"      #指定恢复点,恢复点需要pg_create_restore_point()函数提前创建 
# recovery_target_xid = 764    #恢复到指定事务号  
# recovery_target_timeline = 'latest'     #恢复到最新的状态 
# recovery_target_inclusive = true  #恢复时是否包含目标点本身位置,使用于time、xid、lsn三种
recovery_target_action = 'pause'  #备份恢复后数据库的默认状态,默认为pause暂停,可选pause、promote、shutdown

# 5、启动数据库
/usr/local/postgersql_16_10/bin/pg_ctl -D /data/postgresql_16_10/data/ -l logfile start

# 6、此时数据库处于恢复模式pause状态,无法正常使用,需要手动进行切换恢复数据库状态
#方法1
pg_ctl promote -D $PGDATA

#方法2
sql > SELECT pg_wal_replay_resume();

# 7、验证数据,此时应该只看到 recovery_target_time 之前的数据,recovery_target_time 之后的变更将不存在

三、pg_rman使用方法

pg_rman则是第三方物理备份工具

pg_rman常用选项

-B:指定备份数据存放路径

-D:指定需要备份的数据路径

-b:指定备份方式,如full、incremental

pg_rman -B /data/backup/pgsql/ -D /data/postgresql/data/  init  #初始化备份目录
pg_rman -h 192.168.0.104 -Upostgres -B /data/backup/pgsql/ -D /data/postgresql/data/ -d linuxe -b full  backup #全备
pg_rman -h 192.168.0.103  -D /data/postgresql/ -b incremental backup  #增量备份
pg_rman -B /data/backup/pgsql/ validate  #备份后需要进行数据校验
pg_rman show  #查看历史备份
pg_rman delete "2020-08-28 22:16:22"  #删除某个历史备份
#恢复数据
rm -rf /data/postgresql/data/*
pg_rman restore  #一条命令完成恢复

文章评论

猜你喜欢

MySQL教程(11)物理备份工具Xtrabackup使用教程

MySQL MySQL教程(11)物理备份工具Xtrabackup使用教程

一、Xtrabackup 介绍Xtrabackup是Percona出品的一款针对MySQL的物理备份工具。物理备份通常是指直接对数据文件、日志文件、配置文件等对象直接进行复制的一种备份方法。...

MySQL教程(10)逻辑备份工具mysqldump使用教程

MySQL MySQL教程(10)逻辑备份工具mysqldump使用教程

一、MySQL逻辑备份介绍逻辑备份是指通过导出数据库中的逻辑信息(如表结构、视图、索引、存储过程、数据内容等)并保存为可读格式的过程。它将数据库数据以SQL语句或其他标准格式(如CSV、JSON)输出...

PostgreSQL教程(12)基于流复制的主从集群

PostgreSQL PostgreSQL教程(12)基于流复制的主从集群

一、PostgreSQL 流复制概念在PostgreSQL中,通过流复制(Streaming Replication)实现主从架构,保证数据安全性的同时提高读写性能与容灾能力。流复制的实现方...

PostgreSQL教程(11)第三方物理备份工具pg_rman使用教程

PostgreSQL PostgreSQL教程(11)第三方物理备份工具pg_rman使用教程

pg_rman是一款PostgreSQL第三方物理备份工具,支持对整个数据库集群、归档日志和服务器日志进行在线备份。由于pg_rman是基于本地数据拷贝的方式,而不是流式备份,所以要求 pg...

PostgreSQL教程(9)逻辑备份工具pg_dump使用教程

PostgreSQL PostgreSQL教程(9)逻辑备份工具pg_dump使用教程

一、PostgreSQL 逻辑备份介绍PostgreSQL 原生支持的逻辑备份工具为pg_dump和pgdump_all。数据库逻辑备份的原理都相同,都是将数据以SQL语句的形式输出到一个文本文件,然...