pg 备份恢复(三)—— 详解完整恢复及基于时间点的恢复

一、 恢复配置详解

1. 归档恢复配置

主库 postgresql.conf

  • archive_mode:是否开启归档,若要用归档方式搭建从库则必须开启
  • archive_command:归档命令,通常是cp
  • archive_timeout:在指定秒数后强制切换一个wal文件,注意被切换的文件会跟正常文件一样大,所以这个参数设置过小会导致wal大量占用空间

从库 recovery.conf

  • restore_command:告诉从库如何获取归档WAL文件段的命令,通常是cp
restore_command = 'cp /data/PRD/postgres/10.7/pg5432/pg_archlog/%f %p'
  • archive_cleanup_command:从库清理已不需要的wal日志,避免磁盘空间撑满
archive_cleanup_command='pg_archivecleanup /data/PRD/postgres/10.7/pg5432/pg_archlog %r'
  • recovery_end_command:恢复完成后执行指定命令

2. recovery target设置

下列选项进指定恢复目标

recovery_target:目前只能为immediate,指定恢复在达到一致状态后尽快结束,打开DB

recovery_target_name:由pg_create_restore_point()创建的还原点,用于恢复到指定还原点

recovery_target_time:恢复到指定时间点,最常用

recovery_target_xid:恢复到指定事务ID,在指定事务之前提交的事务将被恢复。注意事务ID是顺序分配的,但后分配的事务ID可能先完成。精确的停止点受recovery_target_inclusive影响。

recovery_target_lsn:恢复到WAL的指定LSN,精确的停止点也受 recovery_target_inclusive的影响。

 

下列选项进一步指定恢复目标,并且影响到达目标时会发生什么
recovery_target_inclusive:布尔值,指定恢复到恢复目标之后还是之前,默认为之后(true)

recovery_target_timeline:指定恢复的时间线。默认只沿着基础备份建立时时间线恢复而不会切换到新的时间线。通常设置为latest,这样便可恢复到该离当前最近的时间线。

recovery_target_action:指定在达到恢复目标时服务器采取的动作。

  • pause:默认值,表示恢复将被暂停
  • promote:表示恢复结束且服务器将开始接受连接
  • shutdown:表示在达到恢复目标之后停止服务器。

使用pause的目的是恢复到最想要的位置。当确定已恢复到最想要的位置,可以使用pg_wal_replay_resume()结束暂停的状态,这会让恢复终结。如果恢复的位置不是想要的,那么关闭服务器,重新设置恢复目标,然后启动DB继续恢复。

注意在recovery_target_action被设置为shutdown时,recovery.conf将不会被重命名,任何后续的启动都将会以立刻关闭为终结,除非该配置被改变或者recovery.conf文件被手工移除。

如果没有设置恢复目标,这个设置没有效果。如果没有启用hot_standby,pause设置的动作将和shutdown一样。

http://postgres.cn/docs/10/recovery-target-settings.html
 

二、 时间线——pg中的平行世界

这个概念感觉类似Oracle的化身(Incarnation)和小说电影里的平行世界。虽然可以通过PITR恢复到之前的时间点,相当于小说里时光倒流主角重生了,但回到的不再是原来的世界,而是去到了一个平行世界。

 

1. 为什么需要时间线

还是拿小说举例子,重生的主角通常都担心自己做了一点什么事情会影响历史的进程,当然小说电视剧里主角的影响最后总是会被历史修复。那pg能够修复回退后的更改吗?

比如某天17点开发来找你说误操作了,要恢复到15点的数据。好的,我们给他恢复了。恢复之后业务运行了半个小时,开发又来找你说,刚才搞错了应该恢复到16点的数据,能够做到吗?

如果没有时间线的概念而在15点后又没另外做备份,能用之前的备份+归档恢复到16点的数据吗?显然是不能的,因为在DB运行过程中产生了与旧WAL文件重名的文件,归档时覆盖原来的日志,导致恢复到16点需要的WAL文件丢失。

阿里云的博客有张图挺形象的

无时间线数据库恢复

 

2. 时间线的作用

为了解决这个问题,PostgreSQL引入了时间线的概念。每当归档文件恢复完成,创建一个新的时间线用来区别新生成的WAL记录。区别的方式很简单,就在WAL文件名里加入了时间线ID,由时间线和日志序号来组成WAL文件名,不会覆盖由以前的时间线生成的WAL。

$ ls -1
00000002.history
00000003.history
00000003000000000000001A
00000003000000000000001B

源码实现如下:

#define XLogFileName(fname, tli, log, seg)	\snprintf(fname, XLOG_DATA_FNAME_LEN + 1, "%08X%08X%08X", tli, log, seg)

有了时间线,只要备份和归档还在,我们小说的主角就能够重生到任意时间点了,但每次其实都相当于去到了一个平行世界,保证主角重生之后的所作所为不影响原来的世界。每个时间线也类似一个分支,在当前时间线的操作不会对其他时间线WAL造成影响。

有时间线数据库恢复

 

3. 何时会产生新时间线

  • 利用归档进行恢复,完整恢复和PITR都会

  • 从库激活为主库,即执行 pg_ctl promote –D $PGDATA

 

4. history文件

  • 何时产生:与时间线相同,每当创建一个新的时间线,pg都会创建一个“时间线历史”文件,文件名类似.history。
  • 内容:原时间线history文件的内容+一条当前时间线切换记录。

假设数据库恢复启动后,切换到新的时间线ID=5,那么文件名就是00000005.history ,该文件记录了自己是从什么时间哪个时间线什么原因分出来的(相当于主角重生之后还有记忆),该文件可能含有多行记录,每个记录的内容格式如下:

 * <parentTLI> <switchpoint> <reason>**      parentTLI       ID of the parent timeline*      switchpoint     XLogRecPtr of the WAL position where the switch happened*      reason          human-readable explanation of why the timeline was changed

例如:

$ cat 00000004.history
1	0/140000C8	no recovery target specified
2	0/19000060	no recovery target specified
3	0/1F000090	no recovery target specified

当数据库在从包含多个时间线的归档中恢复时,这些history文件允许系统选取正确的WAL文件,当然,它也能像WAL文件一样被归档到WAL归档目录里。历史文件只是很小的文本文件,所以保存它们的代价很小。

当我们在recovery.conf指定目标时间线tli进行恢复时,程序首先寻找.history文件,根据.history文件里面记录的时间线分支关系,找到从pg_control里面的startTLI到tli之间的所有时间线对应的日志文件,再进行恢复。

 

参考

http://mysql.taobao.org/monthly/2015/07/03/

待补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/61176.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

postgresql使用pg_basebackup备份与恢复

postgresql可以使用pg_dump,pg_restore等命令来进行备份与恢复&#xff0c;那种情况不用停止pgsql服务&#xff0c;只需要执行备份恢复命令即可。 今天介绍的这种备份方式&#xff0c;类似于文件系统的备份与恢复&#xff0c;它需要使用pg_basebackup命令来进行备份&#xff0c…

使用pgAdmin4备份恢复(爬坑)

使用pgAdmin4备份恢复&#xff08;爬坑&#xff09; 1 通过Windows的pg客户端安装后&#xff0c;将会默认安装pgAdmin4 2 开始菜单搜索&#xff1a;pgAdmin4 打开 3 在Windows Server上&#xff0c;可能会出现&#xff1a; pgAdmin4被默认的IE浏览器打开&#xff0c;且IE浏览…

物联网如何为智慧城市提供动力

智慧城市可以创造一个基础设施顺畅、效率提升的乌托邦&#xff0c;改善城市地区的生活质量&#xff0c;促进当地经济发展。 其影响意义重大&#xff0c;预计到 2024 年智慧城市基础设施的收入将超过 1000 亿美元。 从改善公共交通到解决犯罪问题和提高能源效率——应有尽有&am…

爱的魔力转圈圈

题目链接&#xff1a; https://nuoyanli.com/contest/19/problem/B 题面&#xff1a; 题意&#xff1a;给定r和R,求最小的R数量在r外面围一圈包围住r球 思路&#xff1a; 首先&#xff1a;得知道相切的时候数量最小 其次&#xff1a;我们只需要算每一个R最大能占360的多少…

Discord一直连不上,转圈圈打不开——解决办法

首先更新下你的梯子服务器订阅&#xff0c;如果出现端口1080被占用的错误&#xff0c;则很有可能可以通过以下方法解决该问题。【如果不可以&#xff0c;可以先卸载掉你的discord软件再来一遍】 查看你的1080端口被哪个程序占用了&#xff1f; 1. windr打开命令窗口 2. cd …

win10状态栏一直转圈圈(重装系统后出问题)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、方法二、步骤总结 前言 记录一下个人经历&#xff1a; 昨天在给同学重装系统&#xff0c;重装好后出现了桌面操作无问题&#xff0c;但状态栏出现了假死现…

新建springboot项目一直转圈圈

哎&#xff0c;可能是我好久没有创建过后端springboot项目了,一直再搞前端&#xff0c;今天新建项目的时候就死活一直转圈圈&#xff0c;我一直以为网络不好&#xff0c;从头到尾换了三次网络&#xff0c;idea关了开&#xff0c;开了关&#xff0c;看还不行电脑都重启了&#x…

Qt+百度API实现人脸对比寻找明星脸

一、要求 1、使用百度人脸识别库 2、识别对比图片&#xff0c;获取图片相似度 3、显示最相似的明星照片、显示本人照片 4、调用摄像头拍照、比对查找最相似的明星脸 5、录入明星照片、查看照片列表、修改、删除照片 二、实现方式 2.1百度API封装 1、获取Token 鉴权认证参考…

根据姓名判断性别-人工智能

本帖训练一个可以根据姓名判断性别的CNN模型&#xff1b;我使用自己爬取的35万中文姓名进行训练。 使用同样的数据集还可以训练起名字模型&#xff0c;参看&#xff1a; TensorFlow练习7: 基于RNN生成古诗词https://github.com/tensorflow/models/tree/master/namignizerTensor…

一个很强大的人脸识别库face_recognition

官方网址&#xff1a;https://github.com/ageitgey/face_recognition 在图片中查找面孔&#xff1a; import face_recognition image face_recognition.load_image_file("your_file.jpg") face_locations face_recognition.face_locations(image) 查找和操作图片中…

人脸性别识别与表情识别代码——基于python深度学习的人脸属性识别

最近又到了毕业设计开题阶段了&#xff0c;想起当年毕业的时候因为不懂深度学习&#xff0c;做了很多功课&#xff0c;翻阅论文、Github&#xff0c;查找各类资源网站去学习&#xff0c;最后在公开资源的基础上调试了无数次&#xff0c;成功实现了基于深度学习的人脸属性识别课…

Java使用百度AI实现识别图片文字信息、身份证信息

百度AI识别API http://ai.baidu.com/docs#/OCR-API/top 这个官网里有丰富的识别示例文档、本文以识别身份证信息作为例子讲解 1、首先登录自己的 “百度智能云-管理中心” 创建应用获取app账号密码等信息 网址&#xff1a;https://console.bce.baidu.com 找到 “人工智能-文字…

Python实现AI图像识别-身份证识别

图像识别说白了就是把一张照片上面的文字进行提取&#xff0c;提供工作效率 需求分析 身份证识别主要是把一张身份证照片上面的文字信息进行提取&#xff0c;不用再使用人工去手动抄写了&#xff0c;下面给大家说的这个身份识别主要是使用pythonflask华为云OCR进行实现的。 …

QT对接百度云实现人脸注册和识别

文章目录 目录 一.UI界面设计 1.获取Access Token 二 http协议头构造 三.对接百度云人脸注册和识别 四.json数据处理 五&#xff0c;数据----->UI界面 六&#xff0c;效果 ​编辑 总结&#xff1a; 一.UI界面设计 左上lineedit是处理后的解析的json数据 下方的linee…

基于MobileNetv3实现人脸面部表情识别

前言 大家好,我是阿光。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPy…

Qt+百度AI实现人脸识别之人脸检测

文章目录 简单需求Demo运行结果百度AI人脸识别接入为什么使用百度AI接口接入步骤如何获取Access Token Qt软件开发人脸检测Qt编程步骤知识点网络编程get、put、post请求方式的区别简述POST 提交数据方式如何对图片进行BASE64编码JSON数据解析 核心代码数据上传请求反馈数据解析…

眼见不为“实”,人们更信任人工智能合成的假脸

常言道&#xff0c;耳听为虚&#xff0c;眼见为实。但是现在随着人工智能技术的发展&#xff0c;眼见可不一定为实。而造成这一结果的全都是因为深度伪造技术&#xff0c;简称深伪技术或者深度伪造。是Deep Learing&#xff08;深度学习&#xff09;和Fake&#xff08;伪造&…

LiveData数据倒灌?你真的用对了吗?源码解析

文章目录 livedata/lifecycleandroidx-lifecycle基本使用uml-关键角色关系观察者模式关键源码分析 livedata基本使用源码分析还是从observe开始livedata变化通知观察者 viewmodel源码分析 FAQlifecycle用到的设计模式lifecycle是如何监听aty生命周期的一些废弃和原因为什么废弃…

Spring Boot 优雅实现多租户架构,so easy~!

点击关注公众号&#xff0c;Java干货及时送达 国内最强微服务框架&#xff0c;没有之一&#xff01; 几乎覆盖 Spring Boot 所有操作&#xff01; 一、概述 1.什么是多租户架构&#xff1f; 多租户架构是指在一个应用中支持多个租户&#xff08;Tenant&#xff09;同时访问&…

Jenkins + Docker 一键自动化部署 Spring Boot 项目,步骤齐全,少走坑路!

点击关注公众号&#xff0c;Java干货及时送达 国内最强微服务框架&#xff0c;没有之一&#xff01; 几乎覆盖 Spring Boot 所有操作&#xff01; 本文章实现最简单全面的 Jenkinsdockerspringboot 一键自动部署项目&#xff0c;步骤齐全&#xff0c;少走坑路。 环境&#xff1…