详解PostgreSQL 12.2时间点恢复 (PITR)
gudong366 2025-04-27 14:58 6 浏览
概述
PostgreSQL 提供了不同的方法来备份和恢复数据库,可以是某一时刻数据库快照的完整备份或增量备份,可以使用 SQL 转储或文件系统级别的备份,在增量备份的基础上还可以实现基于时间点恢复。 这里主要介绍增量备份和基于时间点恢复(PITR)
实现增量备份的思路是
1) 记录数据库系统的操作记录(WAL归档)
2) 在某一时刻进行一次完整的数据库备份
3) 需要恢复时,还原上一次完整的数据库备份,根据操作记录恢复数据库至指定的某个时刻(即可以实现PITR 时间点恢复)
一、增量备份
PostgreSQL 在做写入操作时,对数据文件做的任何修改信息,首先会写入WAL 日 志(预写日志),然后才会对数据文件做物理修改。 当数据库服务器掉电或意外宕机, PostgreSQL 在启动时会首先读取 WAL 日志,对数据文件进行恢复。 因此,从理论上讲, 如果我们有一个数据库的基础备份(也称为全备),再配合 WAL 日志,是可以将数据库恢复到任意时间点的。
1、修改wal_level参数
wal_level 参数可选的值有 minimal、 replica 和 logical ,从 minimal到 replica 再到 logical 级别, WAL 的级别依次增高,在 WAL 中包含的信息也越多。由于 minimal 这一级别的 WAL 不包含从基本的备份和 WAL 日志中重建数据的足够信息,在 minimal 模式下无法开启 archive_mode,所以开启 WAL 归档 wal_level 至少设置为 replica,如下所示 :
--命令行
ALTER SYSTEM SET wal_level = 'replica';
--配置文件postgresql.conf
wal_level = replica
2、修改archive_mode参数
archive_mode 参数可选的值有 on、off 和 always,默认值为 off,开启归档需要修改为 on,重启生效。
archive_command 参数的默认值是个空字符串,它的值可以是一条 shell 命令或者一个复杂的 shell 脚本。 在 archive_command 的 shell 命令或脚本中可以用“%p”表示将要归档 的 WAL 文件的包含完整路径信息的文件名,用
“%f”代表不包含路径信息的 WAL 文件的文件名,修改后不需要重启,reload即可。
--linux环境
archive_mode = on
archive_command = 'test ! -f /data/pgarch/%f && cp %p /data/pgarch/%f'
--windows环境
archive_mode = on
archive_command = 'copy "%p" "D:\\ProgramFiles\\pgdata\\archive\\%f"'
3、基于pg_basebackup创建基础备份
--创建REPLICATION角色
CREATE ROLE replica login replication encrypted password 'replica@1234';
--配置pg_hba.conf,允许远程流式备份
echo "host replication replica 0.0.0.0/0 md5" >> pg_hba.conf
--远程使用pg_basebackup备份
systemctl stop postgresql
rm -rf /data/pgdata/* && rm -rf /data/pgtablespace/*
#-Fp表示以plain格式数据,-Xs表示以stream方式包含所需的WAL文件,-P表示显示进度,-R表示为replication写配置信息。
#备份完成,使用-R选项,在data目录下自动生成standby.signal“信号”文件(可手工使用touch命令生成)以及更新了postgresql.auto.conf文件
#postgresql.auto.conf中写入了主库的连接信息(可手工添加primary_conninfo信息)。
pg_basebackup --progress -D /data/pgdata -h xx.142 -p 55432 -U replica --password -Fp -Xs -P -R
二、PG12 PITR
恢复过程完成后,服务器将删除recovery.signal(以防止以后意外重新进入恢复模式),然后开始正常的数据库操作。
1、环境准备
create table hwb(a int);
insert into hwb values (generate_series(1,1000000));
select now();
-- 2020-12-15 15:16:03.645+08
select pg_switch_wal();
delete from hwb;
select now();
-- 2020-12-15 15:17:55.078991+08
select pg_switch_wal();
--传输归档日志到异地服务器恢复
scp -r /data/pgarch/* postgres@172.16.1.143:/data/pgarch
2、恢复到指定时间点
--配置postgresql.conf(注释archive相关参数)
touch recovery.signal
cat >> postgresql.conf <<EOF
restore_command = 'cp /data/pgarch/%f %p'
recovery_target_time = '2020-12-15 15:16:03.645+08'
EOF
--启动数据库(这时候就恢复了)
systemctl start postgresql
--恢复正常使用
rm -rf recovery.signal
在 postgresql.conf注释restore相关参数后重启
3、恢复到最近时间点
cat > recovery.signal <<EOF
restore_command = 'cp /data/pgarch/%f %p'
recovery_target_timeline='latest'
EOF
配置文件 recovery.conf 添加上面两项。12 通过 recovery.signal 文件触发
4、恢复到指定还原点
postgres=# select pg_create_restore_point('my-restore-point1');
pg_create_restore_point
-------------------------
0/8000290
(1 row)
restore_command = 'cp /data/pgarch/%f %p'
recovery_target_name='my-restore-point1'
配置文件 recovery.conf 添加上面两项。12 通过 recovery.signal 文件触发
5、恢复到指定事务
select txid_current(); --查询当前事务 xid
restore_command = 'cp /data/pgarch/%f %p'
recovery_target_xid=723
配置文件 recovery.conf 添加上面两项。12 通过 recovery.signal 文件触发
6、恢复到指定时间线
restore_command = 'cp /data/pgarch/%f %p'
recovery_target_timeline=2
recovery_target_time='2020-12-15 15:15:00'
配置文件 recovery.conf 添加上面两项。12 通过 recovery.signal 文件触发
后面会分享更多devops和DBA方面内容,感兴趣的朋友可以关注下!
相关推荐
- 由浅入深学shell,70页shell脚本编程入门,满满干货建议收藏
-
不会Linux的程序员不是好程序员,不会shell编程就不能说自己会Linux。shell作为Unix第一个脚本语言,结合了延展性和高效的优点,保持独有的编程特色,并不断地优化,使得它能与其他脚本语言...
- 小白7天掌握Shell编程:脚本的创建和执行
-
一、课前声明1、本分享仅做学习交流,请自觉遵守法律法规!2、搜索:Kali与编程,学习更多网络攻防干货!二、知识点详解Shell脚本的格式要求:脚本要以!#/bin/bash开头,其中bash可以替换...
- 飞牛fnNAS搭建Web版Linux系统(飞牛网改版升级说明)
-
飞牛NAS本身就是Linux内核(Debian发行版),那为何还要安装一个Linux呢?因为飞牛的Linux是特殊版本,并不能运行PC端的带UI的程序,比如我需要登录微信,需要使用wps打字……,这是...
- 如何在 Linux 中使用 Sysctl 命令?
-
sysctl是一个用于配置和查询Linux内核参数的命令行工具。它通过与/proc/sys虚拟文件系统交互,允许用户在运行时动态修改内核参数。这些参数控制着系统的各种行为,包括网络设置、文件...
- Apple尝试使用轻量级Linux虚拟机实现容器化
-
Apple于本周一发布了一个开源的容器化框架,用于在Mac上创建和运行Linux容器镜像。软件容器将应用程序及其依赖项组合成一个单元,在主机上运行于隔离环境中。由于它们基于符合OCI标准...
- Docker 安全与权限控制:别让你的容器变成“漏洞盒子”
-
在享受容器带来的轻量与灵活的同时,我们也必须面对一个现实问题:安全隐患。容器并不是天然安全,错误配置甚至可能让攻击者“越狱”入侵主机!本篇将带你从多个层面强化Docker的安全防护,构建真正可放心...
- 网络安全必备!Linux firewalld 防火墙原理 + 配置实战(放行http)
-
5.1了解firewall防火墙基础概念与原理5.1.1Linux防火墙概述在网络安全领域,防火墙是保障网络安全的关键屏障,Linux系统中的firewall防火墙(firewalld服...
- 从零开始搭建 Linux PXE 无盘启动服务器
-
在企业环境或实验室中,PXE(PrebootExecutionEnvironment,无盘启动)被广泛用于大规模批量部署操作系统。通过PXE,无需U盘或CD,就能远程启动和安装Linux...
- [250417] Fedora 42 正式发布,搭载 Linux 6.14 内核和 GNOME 48 桌面环境
-
Fedora42正式发布FedoraLinux42现已正式发布!此版本基于最新的Linux内核6.14构建,带来了众多激动人心的新特性和改进,旨在提供更现代化、更强大、更易用的Li...
- Linux Kernel学习003——内核源码
-
Linux学习笔记:老版本内核的坑,新工具救场,代码门道藏着啥秘密.最近想学Linux内核,网上查资料发现现在的稳定版本都已经到5.x了,但我跟着教程选的是2.6.34。官网下载链接卡着老卡,后来用清...
- Linux:实现Hadoop集群Master无密码登录
-
以下所介绍的安装方式都是在线安装方式,如果你需要连网请参考:Linux:宿主机通过桥接方式连接的VMware内部Linux14.04虚拟机(静态IP)实现上网方案环境:OS:LinuxUbuntu1...
- 除了Win10,微软还发布了一套“专业版Linux”系统
-
IT之家讯9月21消息,不知道大家是否还记得,微软CEO纳德拉曾在去年的一次活动中公开宣称“微软爱Linux”,其实那个时候的微软就已经在服务器方面拥抱Linux了。而最近,除了最新Windows1...
- Linux系统匿名上网小技巧(linux匿名文件)
-
Tails可以做什么+优点Tails所有数据连接通过Tor网络传输,可以为个人用户提供最好的匿名性和安全性,并且它是一个Linux系统,不会感染Windows系统的病毒,它可以存储在闪存盘上运行。-...
- Linux环境中DeepSeek AI大模型使用与管理之七:安装Cherry Studio
-
简介:在Linux系统中成功通过Ollama部署DeepSeek-R1大模型后,用户通常需要一个直观且易于操作的客户端来访问和交互。为了满足这一需求,本文将详细介绍如何在Linux环境中安装和配置Ch...
- Linux系统部署Go编程环境(一)使用Go语言编写简单web服务器
-
摘要:Go语言是一个开源的编程语言,Go语言被称为“互联网时代的C语言”。Go语言的风格类似于C语言。其语法在C语言的基础上进行了大幅的简化,去掉了不需要的表达式括号,循环也只有for一种表示...
- 一周热门
- 最近发表
-
- 由浅入深学shell,70页shell脚本编程入门,满满干货建议收藏
- 小白7天掌握Shell编程:脚本的创建和执行
- 飞牛fnNAS搭建Web版Linux系统(飞牛网改版升级说明)
- 如何在 Linux 中使用 Sysctl 命令?
- Apple尝试使用轻量级Linux虚拟机实现容器化
- Docker 安全与权限控制:别让你的容器变成“漏洞盒子”
- 网络安全必备!Linux firewalld 防火墙原理 + 配置实战(放行http)
- 从零开始搭建 Linux PXE 无盘启动服务器
- [250417] Fedora 42 正式发布,搭载 Linux 6.14 内核和 GNOME 48 桌面环境
- Linux Kernel学习003——内核源码
- 标签列表
-
- linux一键安装 (31)
- linux运行java (33)
- ln linux (27)
- linux 磁盘管理 (31)
- linux 内核升级 (30)
- linux 运行python (28)
- linux 备份文件 (30)
- linux 网络测试 (30)
- linux 网关配置 (31)
- linux jre (32)
- linux 杀毒软件 (32)
- linux语法 (33)
- linux博客 (33)
- linux 压缩目录 (37)
- linux 查看任务 (32)
- 制作linux启动u盘 (35)
- linux 查看存储 (29)
- linux乌班图 (31)
- linux挂载镜像 (31)
- linux 软件源 (28)
- linux题目 (30)
- linux 定时脚本 (30)
- linux 网站搭建 (28)
- linux 远程控制 (34)
- linux bind (31)