PostgreSQL 数据备份恢复
文章目录
- PostgreSQL 备份方式
- SQL备份(逻辑备份)
- 文件系统备份(物理备份)
- 归档备份(物理备份)
- 逻辑备份&恢复
- 物理备份&恢复(全量)
- 备份
- 恢复
- 物理备份&恢复(某个时间点)
- 场景
- 具体操作
PostgreSQL 备份方式
防止数据丢失的第一道防线就是备份。数据丢失有的是硬件损坏,还有人为的误删之类的,也有BUG的原因导致误删数据。在PostgreSQL中,有三种备份方式。
SQL备份(逻辑备份)
SQL备份(逻辑备份) :利用数据库自带的类似dump的命令,或者是用图形化界面执行导入导出时,底层就是基于这个dump命令实现的。
- 优点:简单,方便操作,有手就行,还挺可靠。
- 缺点:数据数据量比较大,这种方式巨慢,可能导出一天,都无法导出完所有数据。
文件系统备份(物理备份)
文件系统备份(物理备份) :找到当前数据库数据文件在磁盘存储的位置,将数据文件直接复制一份或多份,存储在不同的物理机上。
- 优点:相比逻辑备份,恢复的速度快。
- 缺点:在备份数据时,可能数据还正在写入,一定程度上会丢失数据。 在恢复数据时,也需要注意数据库的版本和环境必须保持高度的一致。如果是线上正在运行的数据库,这种复制的方式无法在生产环境实现。
如果说要做数据的迁移,这种方式还不错滴。
归档备份(物理备份)
先了解几个概念,在PostgreSQL有多个子进程来辅助一些操作
-
BgWriter进程:BgWriter是将内存中的数据写到磁盘中的一个辅助进程。当向数据库中执行写操作后,数据不会马上持久化到磁盘里。这个主要是为了提升性能。BgWriter会周期性的将内存中的数据写入到磁盘。但是这个周期时间,长了不行,短了也不行。如果快了,IO操作频繁,效率慢。如果慢了,有查询操作需要内存中的数据时,需要BgWriter现把数据从内存写到磁盘中,再提供给查询操作作为返回结果。会导致查询操作效率变低。
考虑一个问题: 事务提交了,数据没落到磁盘,这时,服务器宕机了怎么办? -
WalWriter进程:WAL就是write ahead log的缩写,对应MYSQL的redo log。数据还在内存中时,其实已经写入到WAL日志中一份,这样一来,即便BgWriter进程没写入到磁盘中时,数据也不会存在丢失的问题。
-
PgArch进程:WAL日志会循环使用,数据会丢失。没关系,还有一个归档的进程,会在切换wal日志前,将WAL日志备份出来。PostgreSQL也提供了一个全量备份的操作。可以根据WAL日志,选择一个事件点,进行恢复。
查看WAL日志:

这些就是归档日志
> wal日志的名称,是三块内容组成,
>
> 每8个字符分成一组,用16进制标识的
>
> 00000001 00000000 0000000A
>
> 时间线 逻辑id 物理id
查询当前库用的是哪个wal日志
-- 查看当前使用的wal日志 查询到的lsn:0/47233270
select pg_current_wal_lsn();
-- 基于lsn查询具体的wal日志名称 000000010000000000000047
select pg_walfile_name('0/47233270');
归档默认不是开启的,需要手动开启归档操作,才能保证wal日志的完整性
修改postgresql.conf文件
# 开启wal日志的内容,注释去掉即可
wal_level = replica
fsync = on

# 开启归档操作
archive_mode = on
# 修改一小下命令,修改存放归档日志的路径
archive_command = 'test ! -f /archive/%f && cp %p /archive/%f'

修改完上述配置文件后,记得重启postgreSQL进程,才会生效!!!!
归档操作执行时,需要保证/archive存在,并且postgres用户有权限进行w操作
构建/archive路径
# postgres没有权限在/目录下构建目录
# 切换到root,构建目录,将目录的拥有者更改为postgres
mkdir /archive
chown -R postgres. archive
在当前库中做大量写操作,接入到wal日志,重置切换wal日志,再查看归档情况
发现,将当前的正在使用的wal日志和最新的上一个wal日志归档过来了,但是之前的没归档,不要慌,后期备份时,会执行命令,这个命令会直接要求wal日志立即归档,然后最全量备份。
逻辑备份&恢复
PostgreSQL提供了pg_dump以及pg_dumpall的命令来实现逻辑备份。 pg_dump这种备份,不会造成用户对数据的操作出现阻塞。

- 连接的信息,指定连接哪个库,用哪个用户。
- option的信息有就点多,查看官网。
- 备份的数据库名称。
恢复直接导入或者执行SQL就行。
物理备份&恢复(全量)
备份
需要基于前面的文件系统的备份和归档备份实现最终的操作,不推荐单独使用文件系统的方式,毕竟数据会丢失。
通过PostgreSQL提供的pg_basebackup命令来实现,pg_basebackup会做两个事情:
- 会将内存中的脏数据落到磁盘中,然后将数据全部备份。
- 会将wal日志直接做归档,然后将归档也备走。

一个pg_basebackup的备份命令
# -D 指定备份文件的存储位置
# -Ft 备份文件打个包
# -Pv 输出备份的详细信息
# -U 用户名(要拥有备份的权限)
# -h ip地址 -p 端口号
# -R 复制写配置文件
pg_basebackup -D /pg_basebackup -Ft -Pv -Upostgres -h 192.168.11.32 -p 5432 -R
pg_basebackup命令执行前准备
- 创建/pg_basebackup目录并赋予postgres用户权限。
mkdir /pg_basebackup chown -R postgres. /pg_basebackup/ - 给postgres用户提供replication的权限,修改pg_hba.conf,记得重启生效。

- 执行备份

备份结果

恢复
模拟数据库崩盘,先停止postgresql服务,然后直接删掉data目录下的全部内容

将之前备份的两个文件准备好,一个base.tar,一个pg_wal.tar。
第一步:将base.tar中的内容,全部解压到 12/data 目录下
第二步:将pg_wal.tar中的内容,全部解压到 /archive 目录下

第三步:在postgresql.auto.conf文件中,指定归档文件的存储位置,以及恢复数据的方式
第四步:启动postgresql服务
systemctl start postgresql-12
第五步:启动后,发现查询没问题,但是执行写操作时出错,不让写。需要执行一个函数,取消这种恢复数据后的状态,才允许正常的执行写操作。
select pg_wal_replay_resume();
物理备份&恢复(某个时间点)
场景
场景:每天凌晨02:00,开始做全备,到了第二天,如果有人14:00分将数据做了误删,希望将数据恢复到14:00分误删之前的状态
- 恢复全备数据,使用全备数据恢复到凌晨02:00的数据。(数据会丢失很多)
- 归档恢复:备份中的归档,有02:00~14:00之间的额数据信息,可以基于归档日志将数据恢复到指定的事务id或者是指定时间点,从而实现数据的完整恢复。
具体操作
1、构建一张t3表查询一些数据
-- 构建一张表
create table t3 (id int);
insert into t3 values (1);
insert into t3 values (11);
2、模拟凌晨2点开始做全备操作
pg_basebackup -D /pg_basebackup -Ft -Pv -Upostgres -h 192.168.11.32 -p 5432 -R
3、再次做一些写操作,然后误删数据
-- 凌晨2点已经全备完毕
-- 模拟第二天操作
insert into t3 values (111);
insert into t3 values (1111);
-- 误删操作 2023年3月20日20:13:26
delete from t3;
4、恢复数据(确认有归档日志)
将当前服务的数据全部干掉,按照之前的全备恢复的套路先走着

然后将全备的内容中的base.tar扔data目录下,归档日志也扔到/archive位置。
5、查看归档日志,找到指定的事务id
查看归档日志,需要基于postgresql提供的一个命令
# 如果命令未找到,说明两种情况,要么没有这个可执行文件,要么是文件在,没设置环境变量
# 咱们这是后者
pg_waldump
# 也可以采用全路径的方式
/usr/pgsql-12/bin/pg_waldump


6、修改data目录下的恢复数据的方式
修改postgresql.auto.conf文件,将之前的最大恢复,更换为指定的事务id恢复

修改postgresql.auto.conf文件指定好事务ID

7、启动postgreSQL服务,查看是否恢复到指定事务ID

8、记得执行会后的函数,避免无法执行写操作
select pg_wal_replay_resume();
相关文章:
PostgreSQL 数据备份恢复
文章目录 PostgreSQL 备份方式SQL备份(逻辑备份)文件系统备份(物理备份)归档备份(物理备份) 逻辑备份&恢复物理备份&恢复(全量)备份恢复 物理备份&恢复(某个…...
线性代数的本质(七)——特征值和特征向量
特征值和特征向量 本章特征值和特征向量的概念只在方阵的范畴内探讨。 相似矩阵 Grant:线性变换对应的矩阵依赖于所选择的基。 一般情况下,同一个线性变换在不同基下的矩阵不同。仍然以平面线性变换为例,Grant 选用标准坐标系下的基向量 i…...
c语言进阶部分详解(指针初阶)
大家好!,前段时间一直在准备数学建模竞赛,现在也是忙完了。抓紧继续给大家带来c语言的内容。今天给大家带来指针初阶部分的讲解 当我们谈论C语言中的指针时,实际上是在讨论一种非常重要的概念,因为指针是C语言的核心之…...
Socks5代理IP在跨境电商与网络游戏中的网络安全应用
在数字化时代,跨境电商和网络游戏已成为全球网络世界中的两大热门领域。然而,这两者都面临着相似的网络安全挑战,需要高效的网络代理来解决。本文将讨论Socks5代理IP在跨境电商和网络游戏中的关键作用,以及如何通过这一技术增强网…...
Gin框架---基础综述
目录 一:经典入门案例二:请求参数2.1: API参数2.2: URL参数2.3: 表单参数 三: 响应参数四:数据解析和绑定4.1: JSON数据解析绑定4.2: FROM表单数据解析和绑定 五: 路由组六:异步处理七:中间件7.…...
排序算法-快速排序
属性 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元 素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有 …...
【Spring容器的启动过程】
Spring容器的启动过程 Spring 在初始化过程中有二个非常重要的步骤,容器的初始化与刷新。 初始化流程 如果想生成 bean 对象,那么就需要一个 beanFactory 工厂(DefaultListableBeanFactory)如果想让加了特定注解(如 …...
普通二本+转专业学计算机是什么感受
目录 自我介绍转入前为什么转专业为什么转入机械专业 转入后转入后感受确定自学计算机自学计算机的时间分配 自我介绍 作者现在是大二,由于当时高考考砸了,分数在重本线左右,为了去一个稍微好一点的学校,于是填报了化学工程与工艺(并不是说这专业不好,只是填报化工更容易进这个…...
力扣1、两数之和
转到力扣 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可…...
一百七十三、Flume——Flume写入HDFS后的诸多小文件问题
一、目的 在用Flume采集Kafka中的数据写入HDFS后,发现写入HDFS的不是每天一个文件,而是一个文件夹,里面有很多小文件,浪费namenode的宝贵资源 二、Flume的配置文件优化(参考了其他博文) (一&a…...
Android.mk中C++使用
参考: https://gerrit.twrp.me/c/android_bootable_recovery//4366/1/Android.mk ifeq ($(BOARD_USES_RECOVERY_AS_BOOT), true) LOCAL_CFLAGS -DBOARD_USES_RECOVERY_AS_BOOT endif ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE), true) LOCAL_CFLAGS -DBOA…...
K8S:Pod概念、分类及相关的策略
文章目录 一.pod相关概念1.Pod基础概念2.Kubrenetes集群中Pod两种使用方式3.pause容器的Pod中的所有容器共享的资源4.kubernetes中的pause容器主要为每个容器提供功能:5.Kubernetes设计这样的Pod概念和特殊…...
【Java杂谈】#1 【MCA JAVA后端架构师】
文章目录 巧用弱引用 解决 TreadLocal内存泄漏问题P5,P6,P7Spring 巧用弱引用 解决 TreadLocal内存泄漏问题 < Treadlocal > 本地调用框架使用(Spring) IOC,AOP注解transactional,自动支持事务处理…...
Vue3路由
文章目录 Vue3路由1. 载入vue-router 库2. 实例2.1 Vue.js vue-router 实现单页应用2.2 router-link创建链接2.3 router-view显示与url对应组件2.4 <router-link> 相关属性 Vue3路由 1. 载入vue-router 库 Vue.js 路由需要载入vue-router 库 安装直接下载地址…...
Android Studio的笔记--aidl实现和调用
android AIDL接口使用 aidl实现新建aidl实现工程build.gradleproguard-rules.pro增加aidl文件 增加aidl实现aidl实现服务打开aidl服务 aidl使用新建aidl使用工程增加aidl文件使用aidl方法 相关回显 aidl实现 新建aidl实现工程 新建一个工程。工程名testaidl。包名com.lxh.tes…...
大模型从入门到应用——LangChain:代理(Agents)-[工具包(Toolkit)]
分类目录:《大模型从入门到应用》总目录 工具包是工具的集合,这些工具被设计成一起用于特定的任务,并且具有方便的加载方法。常见的工具包如下: CSV代理JiraJSON代理OpenAPI代理自然语言APIPandas数据框架代理PlayWright浏览器工…...
VR全景算不算好的创业项目?有哪些特性?
现在是全民创业的时代,大家都在找创业项目,那么什么是好的创业项目呢?有人会问VR全景算不算创业好项目呢?一般情况下好的创业项目,发展前景和市场消费群体都是比较大的,市场需求大才能满足多数消费者的需求…...
Spring系列文章:Spring集成Log4j2⽇志框架、整合JUnit
一、集成Log4j2⽇志框架 从Spring5之后,Spring框架⽀持集成的⽇志框架是Log4j2.如何启⽤⽇志框架: 第⼀步:引⼊Log4j2的依赖 <!--log4j2的依赖--> <dependency><groupId>org.apache.logging.log4j</groupId><a…...
flink的网络缓冲区
背景 在flink的taskmanager进行数据交互的过程中,网络缓冲区是一个可以提升网络交换速度的设计,此外,flink还通过网络缓冲区实现其基于信用值credit的流量控制,以便尽可能的处理数据倾斜问题 网络缓冲区 在flink中每个taskmana…...
产品经理学习笔记
产品文档之BRD、MRD和PRD - 知乎BRD、MRD和PRD一起被认为是从市场到产品需要形成的标准规范文档: 1、BRD(Business Requirement Document),商业需求文档,是一份产品商业论证报告,基于商业目标或价值所描述的…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
