PostgreSQL基于时间点恢复(PITR)

环境说明

操作系统:redhat 7.9

数据库版本:pg 13

第一部分 备份工具介绍

自postgresql8.0之后才开始提供在线的全量物理备份。和oracle rman的原理一样,通过一个基础备份,追加日志,到达恢复至基础备份后任意一时间点的目的。

pg_basebackup被用于获得一个正在运行的PostgreSQL数据库集簇的基础备份。获得这些备份不会影响连接到该数据库的其他客户端,并且可以被用于时间点恢复以及用作一个日志传送或流复制后备服务器的开始点。

第二部分 备份参数

参数选项 解释说明
-D, --pgdata=DIRECTORY 接收基本备份的目录
-F, --format=p|t 输出的文件类型(默认是plain)
-r, --max-rate=RATE 最大的传输速度(in kB/s, or use suffix "k" or "M")
-R, --write-recovery-conf 备份结束后生成恢复的文件(recovery.conf,在12后被合并到postgres.conf)
-T,--tablespace-mapping=OLDDIR=NEWDIR 将旧的表空间目录定位到新的表空间目录
--waldir=WALDIR wal日志目录的存储位置
-X,--wal-method=none|fetch|stream 指定备份wal的模式,none:在备份中不包括wal日志,fetch:在备份最后收集wal日志,stream:在备份被创建流传输wal日志。
-z, --gzip 压缩成tar文件输出
-Z, --compress=0-9 压缩的等级

通用选项:

参数选项 解释说明
-c, --checkpoint=fast|spread 选择checkpoint的模式
-C, --create-slot 创建复制槽
-l, --label=LABEL 设置备份标签
-n, --no-clean 在出现error时不清理
-N, --no-sync 不等待改变被安全的写入磁盘
-P, --progress 显示进程信息,备份信息
-S, --slot=SLOTNAME 指定要使用的复制槽
-v, --verbose 输出详细信息
-V, --version 输出版本信息后退出
--manifest-hecksums=SHA{224,256,384,512}|CRC32C|NONE 对清单进行校验并指定算法
--manifest-force-encode 十六进制编码的所有文件名称清单
--no-estimate-size 不顾及服务端备份的大小
--no-manifest 精致生成备份清单
--no-slot 不创建临时复制槽
--no-verify-checksums 不验证校验和
-?, --help 帮助

连接参数:

参数选项 解释说明
-d, --dbname=CONNSTR 连接的数据库命
-h, --host=HOSTNAME 备份的数据库IP
-p, --port=PORT 数据库服务的端口号
-s,--status-interval=INTERVAL 状态数据包发送到服务器之间的时间(以秒为单位)
-U, --username=NAME 连接的用户名
-w, --no-password 不使用密码
-W, --password 强制指定密码

第三部分 备份开始

3.1 创建基础备份

shell 复制代码
pg_basebackup -Ft -Pv -Xs -z -Z5 -p5432 -D /home/postgres/pgbak

3.2 插入测试数据

创建测试表,插入数据(带有时间信息的数据)。

shell 复制代码
postgres=#  CREATE TABLE test(id SERIAL PRIMARY KEY, time TIMESTAMPTZ NOT NULL DEFAULT now());
postgres=#  INSERT INTO test values(default,default);              #执行4次

删除测试表中的数据

shell 复制代码
postgres=#  delete from test;
DELETE 4
postgres=#  select * from test;
 id | time 
----+------
(0 rows)
postgres=# insert into test values (default,default);  #再次插入,让测试表处于非空状态

3.2 关停原库

将老的库关掉,移除$PGDATA目录。

shell 复制代码
$ pg_ctl -D stop $PGDATA
$ mv /home/postgres/data /home/postgres/data.bak
$ mv /home/postgres/pgbak $PGDATA

第四部分 恢复开始

4.1 解压备份文件

解压base.tar.gz,和pg_wal.tar。和其他的tar文件,解压到对应表空间路径(如果有的话,先解压base然后启动,因为是recovery模式,可以查看表空间位置)。

4.2 配置 recover.conf文件

shell 复制代码
# vi /$PGDATA/recover.conf
restore_command = ' cp /home/postgres/archivebak/%f %p '
recovery_target_time = '2020-02-26 22:34:00.211243+08'     #时间点可以自选

4.3 基于时间点恢复

启动数据库,开始追日志。

shell 复制代码
$ pg_ctl start database -D $PGDATA 

4.4 更改为可读写

恢复完成后,数据库处于read-only模式,对于数据库的操作会出现以下报错。

shell 复制代码
postgres=# delete from test;
ERROR:  cannot execute DELETE in a read-only transaction

执行以下函数,将只读库更改为可读写。

shell 复制代码
postgres=# select pg_wal_replay_resume();
相关推荐
聚美智数1 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
瀚高PG实验室1 小时前
瀚高数据库常用系统表查询入门指南(附常用SQL)
数据库·sql·postgresql·瀚高数据库
ben9518chen2 小时前
mysql数据库基本操作
数据库·mysql
2603_965148112 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
土豆.exe2 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
缓慢更新3 小时前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
Web3&Basketball4 小时前
实测Gemini4Argon:ERQA 87%登顶长程任务榜
数据库·python·大模型·多模态·gemini·长上下文·推理优化
xiaogai_gai5 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
注塑机数据采集联网5 小时前
注塑机数据采集网关对接MES系统数字化技术方案
大数据·网络·数据库·物联网·数据挖掘·数据分析
像风一样自由20205 小时前
56.实战PostgreSQL-pgvector-FastAPI构建轻量级RAG
数据库·人工智能·postgresql·大模型·fastapi·智能体