【PG备份恢复】基于时间点的恢复(踩坑指南)

news2024/9/25 20:19:40

1 设置基于时间点恢复所需的配置

要启用WAL归档,

  • 需设置wal_level配置参数为replica或更高,
  • 设置archive_mode为on
  • 并且使用archive_command配置参数指定一个shell命令

1.1 修改配置文件 postgresql.conf

vim postgresql.conf
 

archive_mode = on
archive_command = 'cp %p /data1/backups/pg_wal_archive/%f'
wal_level = replica

1.2 生效配置

2 进行一次全备 

2.1 创建备份目录 


mkdir -p /data/backup/pg_backup

chown postgres:postgres /data/backup/pg_backup

2.2 进行一次全备 

pg_basebackup -D /data/backup/pg_backup  -v -P -R

备份输出日志 :

pg_basebackup -D /data/backup/pg_backup  -v -P -R
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/1F000028 on timeline 10
pg_basebackup: starting background WAL receiver
pg_basebackup: created temporary replication slot "pg_basebackup_20961"
57113/57113 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/1F000100
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: renaming backup_manifest.tmp to backup_manifest
pg_basebackup: base backup completed

3 模拟增量数据插入 

yanhaihang=#  insert into foo values  (100011),(100012),(100013);
INSERT 0 3

4 查看当前时间点,LSN号,XID 事务ID,当前的WAL 文件等

yanhaihang=#   select now();
              now
-------------------------------
 2024-09-25 17:16:45.699173+08
(1 row)

yanhaihang=#  select pg_current_wal_lsn();
 pg_current_wal_lsn
--------------------
 0/20000BD8
(1 row)

yanhaihang=# select txid_current();
 txid_current
--------------
          778
(1 row)

yanhaihang=#  select pg_walfile_name(pg_current_wal_lsn());
     pg_walfile_name
--------------------------
 0000000A0000000000000020
(1 row)

查看插入增量数据的时间点 (作为恢复的时间点

yanhaihang=#   select now();
              now
-------------------------------
 2024-09-25 17:16:45.699173+08
 

LSN号

yanhaihang=#  select pg_current_wal_lsn();
 pg_current_wal_lsn
--------------------
 0/20000BD8
 

XID 事务ID

yanhaihang=# select txid_current();
 txid_current
--------------
          778
 

当前的WAL 文件

yanhaihang=#  select pg_walfile_name(pg_current_wal_lsn());
     pg_walfile_name
--------------------------
 0000000A0000000000000020


5 进行一次WAL 日志的切换

yanhaihang=# SELECT pg_switch_wal();
 pg_switch_wal
---------------
 0/20000D38
 

再次查看当前的WAL日志,可以看到 由原来的20 变为了 21 

yanhaihang=#  select pg_walfile_name(pg_current_wal_lsn());
     pg_walfile_name
--------------------------
 0000000A0000000000000021
 

wal 日志目录 ,

查看归档目录 ,可以看到  0000000A0000000000000020 日志已经归档

6 模拟故障发生

假如以下场景发生: 有研发删除了foo全表 ,或者错误更新了foo全表 ,或者机房故障导致数据库启动不了。

如果只用全备恢复,从全备时刻到故障时刻的增量的DML 就会丢失 。

7 进行基于时间点的恢复

7.1 停止原实例

pg_ctl   -D /data/storage/pgsql/data stop

7.2 将原来的数据目录 mv 走,

mv data data_bak

7.3  将全备拷贝一份为pg 的数据目录:

 cp -R /data/backup/pg_backup/ /data/storage/pgsql/data

7.4  修改目录权限和属组用户

chown -R postgres:postgres /data/storage/pgsql/data

chmod 700  /data/storage/pgsql/data

7.5 配置增量恢复 修改文件 postgresql.auto.conf 

vim postgresql.auto.conf

restore_command = 'cp /data1/backups/pg_wal_archive/%f %p'
recovery_target_time = '2024-09-25 17:16:45'

7.6 创建recovery.signal文件

因为备份的时候加了-R 所以会创建 standby.signal 文件 ,如果你是想让改实例作为主库启动 将该文件删除

创建recovery.signal,

我这里直接mv 

mv standby.signal recovery.signal

7,7 启动恢复的实例 

pg_ctl   -D /data/storage/pgsql/data start

日志输出:

$pg_ctl   -D /data/storage/pgsql/data start
waiting for server to start....2024-09-25 17:35:02.439 CST [14388] LOG:  starting PostgreSQL 13.12 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
2024-09-25 17:35:02.440 CST [14388] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2024-09-25 17:35:02.441 CST [14388] LOG:  could not create IPv6 socket for address "::": Address family not supported by protocol
2024-09-25 17:35:02.441 CST [14388] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2024-09-25 17:35:02.443 CST [14395] LOG:  database system was interrupted; last known up at 2024-09-25 17:12:10 CST
cp: cannot stat ‘/data1/backups/pg_wal_archive/0000000B.history’: No such file or directory
2024-09-25 17:35:02.485 CST [14395] LOG:  starting point-in-time recovery to 2024-09-25 17:16:45+08
2024-09-25 17:35:02.487 CST [14395] LOG:  restored log file "0000000A.history" from archive
2024-09-25 17:35:02.501 CST [14395] LOG:  restored log file "0000000A000000000000001F" from archive
2024-09-25 17:35:02.515 CST [14395] LOG:  redo starts at 0/1F000028
2024-09-25 17:35:02.516 CST [14395] LOG:  consistent recovery state reached at 0/1F000100
2024-09-25 17:35:02.516 CST [14388] LOG:  database system is ready to accept read only connections
2024-09-25 17:35:02.529 CST [14395] LOG:  restored log file "0000000A0000000000000020" from archive
 done
server started
[postgres@erp-db-mysql-s17.ys:/data/storage/pgsql/data]$2024-09-25 17:35:02.538 CST [14395] LOG:  recovery stopping before commit of transaction 778, time 2024-09-25 17:16:58.116118+08
2024-09-25 17:35:02.538 CST [14395] LOG:  pausing at the end of recovery
2024-09-25 17:35:02.538 CST [14395] HINT:  Execute pg_wal_replay_resume() to promote.

8 检验数据

 select * from foo  order by id desc limit 10;

9 恢复可写 

写入数据报错 

 insert into foo values  (100014);

yanhaihang=#  insert into foo values  (100014);
2024-09-25 17:36:48.574 CST [18061] ERROR:  cannot execute INSERT in a read-only transaction
2024-09-25 17:36:48.574 CST [18061] STATEMENT:  insert into foo values  (100014);
ERROR:  cannot execute INSERT in a read-only transaction

恢复可写 

 select pg_wal_replay_resume();

yanhaihang=# select pg_wal_replay_resume();
 pg_wal_replay_resume
----------------------

(1 row)

yanhaihang=# 2024-09-25 17:37:52.704 CST [14395] LOG:  redo done at 0/20000BD8
2024-09-25 17:37:52.704 CST [14395] LOG:  last completed transaction was at log time 2024-09-25 17:14:27.560912+08
cp: cannot stat ‘/data1/backups/pg_wal_archive/0000000B.history’: No such file or directory
2024-09-25 17:37:52.708 CST [14395] LOG:  selected new timeline ID: 11
2024-09-25 17:37:52.727 CST [14395] LOG:  archive recovery complete
2024-09-25 17:37:52.729 CST [14395] LOG:  restored log file "0000000A.history" from archive
2024-09-25 17:37:52.737 CST [14388] LOG:  database system is ready to accept connections

常见报错 

报错1 使用了错误的恢复配置文件

报错关键字  FATAL:  using recovery command file "recovery.conf" is not supported

报错1原因 : 高版本移除了recovery.conf 文件

PostgreSQL12 附录 E. 版本说明

  • recovery.conf设置移动到postgresql.conf中。 (Masao Fujii, Simon Riggs, Abhijit Menon-Sen, Sergei Kornilov)

recovery.conf不再使用,如果该文件存在,服务器将无法启动。 recovery.signal和standby.signal文件现在用于切换到非主模式。 trigger_file设置已更名为promote_trigger_file。 删除了standby_mode设置。

官方文档参考

http://postgres.cn/docs/13/continuous-archiving.html

报错2 找不到需要的WAL日志

报错关键字

cp: cannot stat ‘/data1/backups/pg_wal_archive/0000000A.history’: No such file or directory

cp: cannot stat ‘/data1/backups/pg_wal_archive/00000009000000000000001C’: No such file or directory

FATAL: recovery ended before configured recovery target was reached

原因:需要的wal 没有被归档?

解决 : 进行一次WAL切换  SELECT pg_switch_wal(); 

TODO 

WAL的切换规则 

参考 

多种恢复方式  官方文档 中的 19.5.4. 归档恢复

http://postgres.cn/docs/13/runtime-config-wal.html#RUNTIME-CONFIG-WAL-RECOVERY-TARGET

WAL 日志 

http://postgres.cn/docs/13/wal.html 

基于时间点的恢复 官方文档

http://postgres.cn/docs/13/continuous-archiving.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

资深老师都在用的成绩发布小程序,月考发成绩就用它!

在教育的长河中,老师们一直扮演着知识传递者的角色。然而,随着时间的流逝,教育的方式也在不断地革新。过去,老师们发布成绩查询的方式既繁琐又耗时。 现在我们有了更高效、更便捷的成绩发布方式。在众多的成绩查询系统中&#xff…

2.数据结构研究

计算机解决问题的步骤 线性表 树 图(点线)

电脑录屏软件免费版,四款宝藏软件揭秘

在这个数字化时代,无论是教学演示、游戏直播还是软件教程分享,电脑录屏都成为了我们日常生活中不可或缺的一部分。然而,面对市面上琳琅满目的录屏软件,如何选择一款既免费又功能强大的工具,成为了不少小伙伴的难题。今…

桌面专业版【ssh配置】

UOS统信SSH协议的简单使用方法。包含软件安装,服务启动及常见问题等内容。 文章目录 功能概述一、SSH安装二、SSH使用方法三、SSH常见问题1. 无法使用root用户登陆。2. SSH登录提示”connect to hosts xxxx :Connection refused功能概述 SSH 为 Secure Shell 的缩写,由 IET…

手把手搞定VMware 的CentOS硬盘扩容

1.背景 用VMware虚拟机创建Centos系统时,选了40GB硬盘,用着用着发现硬盘不够用了。于是,我为了给硬盘扩容,实操了下centos的硬盘扩容。本文是记录下整个操作过程,方便后面查询和使用。 2.操作 2.1 VMware操作 2.2 Ce…

Goweb---Gorm操作数据库(二)

Gorm允许用户自己自定义钩子操作,使用这些钩子操作,可以在增删改查操作前进行相关的操作和检验,它会在创建、更新、查询、删除时自动被调用。如果任何回调返回错误,GORM 将停止后续的操作并回滚事务。 自定义钩子函数 package ma…

充电宝哪个牌子性价比高?2024年充电宝推荐!7款好用充电宝推荐

近年来,充电宝爆炸、自燃等安全事故屡见不鲜,给人们的生命财产安全带来了严重的威胁。比如 2023 年 1 月,广西桂平的一自建民房凌晨突发大火,经初步调查,起火原因就是充电宝发生短路。2024 年 2 月 19 日晚&#xff0c…

如何在项目申报中实施精细化管理?

项目申报作为企业获取资源、拓展市场、推动创新的关键环节,其成功与否往往直接关系到企业的战略发展。而要在众多申报者中脱颖而出,实现项目申报的成功,精细化管理成为关键因素之一。精细化管理强调的是对项目申报全过程的每一个细节进行精准…

2024 年 8 月公链行业研报:Layer 1、比特币 Layer 2 和以太坊 Layer 2 趋势分析

作者:Stella L (stellafootprint.network) 数据来源:Footprint Analytics 公链研究页面 8 月,加密货币市场波动剧烈,比特币和以太坊均遭遇了明显下跌。Layer 1 区块链普遍遭受市场颓势,然而,Tron 却逆势…

开源链动 2+1 模式 S2B2C 商城小程序助力品牌实现先营后销与品效合一

摘要:本文探讨了在当今市场环境下,如何做到先营后销、品效合一。通过研究社区用户喜好,打造适合家庭消费的商品,并结合开源链动 21 模式 S2B2C 商城小程序,实现品牌的精准定位、创新包装以及小规格产品供应&#xff0c…

单片机——ADC采样

1、什么是ADC采样? ADC是指将模拟信号转换成数字信号的过程。通俗理解ADC采样就是采集电路中的电压,通过数值的方式表现出来。以STM32F103系列为例,它可以反应0~4095,换句话说,它采集的电压数值上表现为0~4095&#xf…

文心快码获2024北京信息通信行业网络安全产品优秀应用

日前,2024北京互联网大会在京举办。在“网络安全与数据保护”分论坛上,百度智能代码助手文心快码Baidu Comate荣获北京信息通信行业网络安全产品优秀应用案例。  本场论坛聚焦“共筑安全底座 服务社会民生”主题,共商北京数字经…

江科大51单片机

文章目录 led灯led点亮led闪烁流水灯 独立按键按键点灯按键消抖按键实现二进制流水灯按键实现流水灯 数码管静态数码管显示动态数码管显示 矩阵键盘定时器/中断串口通信led点阵屏DS1302实时时钟蜂鸣器AT24C02DS18B20LCD1602直流电机驱动AD/DA红外遥控 led灯 创建项目&#xff…

2024自学网络安全的三个必经阶段(含路线图)

一、为什么选择网络安全? 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等 一系列政策/法规/标准的持续落地 ,网络安全行业地位、薪资随之水涨船高。 未来3-5年,是安全行业的黄金发展期,提前踏…

CoT让Transformer打破推理极限的讨论

论文简要 题目:Chain of Thought Empowers Transformers to Solve Inherently Serial Problems Denny Zhou等人提出的中间推理token,跟o1的核心技术CoT非常相似。 传统的Transformer模型的致命弱点,就是擅长并行计算,但不擅长串…

动物关键点数据集-yolov8 pose动物关键点识别-动物姿态估计-keypoints(代码+数据集)

跨域适应于动物姿态估计 概览 本文介绍了一个专门用于动物姿态估计的数据集,该数据集包含了五个不同种类的动物:狗、猫、牛、马和羊。整个数据集中共包含超过6000个实例,分布在4000多张图像上。此外,数据集还为另外七种动物提供…

QT创建线程,QT多线程的创建和使用,QT线程池

一、在Qt中创建多线程的原因和优势 1. **UI响应性:** - 在单线程模型中,如果需要执行长时间运行的任务(如网络请求、文件I/O、计算密集型操作等),这将会阻塞主线程,导致UI无响应。通过在单独的线程中执…

分布式框架 - ZooKeeper

一、什么是微服务架构 1、单体架构 顾名思义一个软件系统只部署在一台服务器上。 ​ 在高并发场景中,比如电商项目,单台服务器往往难以支撑短时间内的大量请求,聪明的架构师想出了一个办法提高并发量:一台服务器不够就加一台&am…

Bottleneck、CSP、DP结构详细介绍

文章目录 前言一、BottleneckDarknetBottleneck 二、CSPCSP思想pp-picodet中的CSPLayer DP卷积 前言 本篇文章详细介绍了三种神经网络中常见的结构,bottleneck、CSP、DP,并附上了代码加深理解。 一、Bottleneck Bottleneck出现在ResNet50/101/152这种…

矩阵特征值怎么求?矩阵特征值计算器来帮你

大家好,这里是效率办公指南! 📚今天我们要探讨一个数学和编程领域中经常遇到的问题——矩阵特征值的计算方式,以及如何计算一个2x2矩阵的特征值。无论你是数学爱好者,还是编程高手,这个主题都可能对你有所…