POSTGRESQL 12版本中通过pg_basebackup 备份数据并且进行PITR 数据恢复这个问题的需要谈谈. 顺便捋一捋POSTGRESQL 整个数据库备份的原理和恢复的原理. 实际上PG的物理备份是从POSTGRESQL 8.0 就开始支持的功能,同时也是在这个版本支持了PITR ,point in time recovery的功能,指定时间段进行数据备份的功能. 其实PITR 并不神秘,大白话就是在数据恢复的FULL 的过程中, 卡到你的时间点而已,如果你不提供时间点,他就将所有的日志都应用完. PITR 过程与普通的数据恢复的过程基本相同,不同点主要在于 1 普通的恢复读取的日志是从pg_wal中读取,而PITR的过程会从archive_command中读取archive 中的数据 2 普通的恢复的 checkpoint的位置获取是从pg_control 文件中,而PITR是从backup_label中获得的文件PITR的过程
由于需要,对数据库的基于时间点恢复(PITR)做了过程记录,以此来记录过程和问题。
1、任意时间点恢复▋恢复流程NineData 完成基于时间点恢复(PITR)的过程如下:新增新的一个数据库实例,为恢复所用,也可以用本地实例(需要修改恢复的库名);找到误删操作之前的最近一次全量备份,恢复到新实例
连续归档和时间点恢复(PITR) 在任何时间,PostgreSQL在数据集簇目录的pg_wal/子目录下都保持有一个预写式日志(WAL)。 关闭页快照并不会阻止使用日志进行PITR操作。一个未来的开发点是通过移除不需要的页拷贝来压缩归档的WAL数据,即使full_page_writes为on。
文章首先介绍了 PiTR 技术的基本概念和工作原理,接着探讨了 TiDB 对 PiTR 的优化,包括 PiTR 的技术指标,稳定性和性能提升。 最后,文章展望了 TiDB PiTR 未来的改进方向,将持续探索备份恢复的更多可能性。 PiTR 特性的工作机制 接下来,我们进一步看一下日志备份和恢复过程的工作机制。 TiDB 对 PiTR 的优化 从上面的工作机制可以看到, 无论是日志备份还是恢复,其过程都是比较复杂的,所以 TiDB 在PiTR 发布之后,一直对这个特性进行优化,不断的提升 PiTR 的技术指标, 我们在 PiTR 的稳定性上也做了很多的优化,其中包括: 通过优化 BR 与 PD 和 TiKV 的通信机制,在绝大多数 TiDB 集群异常场景和 TiKV 滚动重启场景,PiTR 都可以保证 RPO
希望本文能够帮助开发者和数据库管理员更好地理解 PiTR 的工作机制,有效地利用这一功能加固数据库基础设施。PiTR 是 TiDB 备份工具中必不可少的一部分。 在接下来的内容中,我们将详细展开 TiDB 的 PiTR 进度管理流程。从单个 TiKV 开始,逐步推进到整个集群。 对于 PiTR 而言,这个任务被称为 Task::BatchEvent5。 在 PiTR 流程中,这些 TiKV 也是各自将数据打包成文件,发送到远端储存上。这引出了一个重要的问题:如何进行进度管理? 或许在未来,我们能够实现 PiTR 的自动运维,当 checkpoint 恢复推进之后,可以自动重启这个任务。
PostgreSQL还在8.0版中引入了时间点恢复(Point-In-Time Recovery,PITR)。 这些命令对显然是理解PITR的关键点之一,我们将在后续章节中探讨它们。 {基础备份开始时的偏移量}.backup 时间点恢复(PITR)的工作原理 ---- 下图展示了PITR的基本概念。 PITR的基本概念 PITR是如下这样工作的。 PITR模式 —— 来自backup_label文件。
这些命令对显然是理解PITR的关键点之一,我们将在后续章节中探讨它们。 {基础备份开始时的偏移量}.backup 时间点恢复(PITR)的工作原理 下图展示了PITR的基本概念。 PITR的基本概念 PITR是如下这样工作的。 PITR过程几乎与常规恢复过程一模一样,唯一的区别只有以下两点: 从哪里读取WAL段/归档日志? PITR模式 —— 来自backup_label文件。
,它是PITR的核心概念。 这些命令对显然是理解PITR的关键点之一,我们将在后续章节中探讨它们。 {基础备份开始时的偏移量}.backup 时间点恢复(PITR)的工作原理 下图展示了PITR的基本概念。 PITR的基本概念 PITR是如下这样工作的。 PITR模式 —— 来自backup_label文件。
全库闪回和PITR技术的对比全库闪回与PITR的主要区别在于对数据库的回退处理方式,前者是整库回退,后者能实现精准回退。 PITR技术传统的PITR数据库恢复技术主要是通过备份集对数据库进行全量数据回退,再基于redo进行回放重演到目标时间点。 PITR的恢复时间通常与数据库的量级以及回放的redo量相关,通常数据库的量级都非常大,这就导致PITR非常耗时。 下面将从四个方面对比全库闪回和PITR两项技术。全库闪回应用场景全库闪回的应用场景十分广泛,下面通过两个具体业务场景的痛点问题,对比分析全库闪回相较于PITR在解决问题上的优势。 如图6所示,数据库量级越大的情况下,全库闪回的局部精准恢复相较于PITR的效果越好。
按照恢复方式大致可以分为如下两类: 恢复数据至误删除前的时间 回滚误删除操作 (一)恢复数据至误删除前的时间 1.基于 PITR Point-in-time Recovery(PITR): 顾名思义就是利用备份文件将数据库恢复到过去任意的时间点 PolarDB-X 的 PITR 的实现思路也是如此,不过由于分布式事务的存在,PolarDB-X 还做了更多的工作来保证分片间的数据一致性,这部分的工作将在后续的文章中详细介绍。 有了 PITR 的能力后,一旦出现数据误删,最直接的想法便是通过 PITR 将数据库恢复到数据被误删前的时间点,这种方案的好处是可以将数据库恢复到用户需要的任意时间点,但是也存在一些问题: 恢复时间长: Flashback Query 这种基于 Undo 信息恢复的方式,大大提高了数据恢复的速度,同时也无需额外的存储空间,相对于PITR,恢复效率更高。 当然,数据安全是一个永恒的话题,针对不同的数据误删场景,PolarDB-X 已经打造了多项利器来保障用户的数据:PITR、Recycle Bin、Flashback Query 等等。
Point-in-Time Recovery是v1.3.0加入的,需要手动启用pitr.enabled参数pbm config --set pitr.enabled=true 在启用Point-in-Time oplog保存在远程存储的pbmPitr子目录中,chunk的名称反映了开始时间和结束时间如果想要调整时间跨度,可以配置pitr.oplogSpanMinpbm config --set pitr.oplogSpanMin =5oplog备份也支持压缩,可以配置pitr.compressionpbm config --set pitr.compression=gzip数据恢复图片恢复注意事项通过pbm store命令并指定还原时间戳 =false关闭所有mongos,阻止客户端访问如果启用了PITR,则禁用该功能查看备份快照和PITR有效时间点pbm listBackup snapshots: 2023-02-22T07:18:40Z :45Z执行PITR恢复pbm restore --time="2023-02-22T08:30:00"恢复完成后重新启用PITR和balance进程,并开启mongos对外提供服务mongos> sh.startBalancer
PITR恢复起始点定位 PITR恢复过程重要的两个因素: 1、从哪里读取WAL段/归档日志? PITR mode–来自配置参数archive_command中设置的存档目录。 PITR模式–来自备份标签文件。
验证表空间的依赖性 1.1 查询 TS_PITR_CHECK conn / as sysdba set linesize 1000 col obj1_owner for a10 col obj2_owner 如果只恢复表空间DBS_D_JINGYU select OBJ1_OWNER, OBJ1_NAME, TS1_NAME, OBJ2_OWNER, OBJ2_NAME, TS2_NAME from TS_PITR_CHECK DBS_D_JINGYU,DBS_I_JINGYU select OBJ1_OWNER, OBJ1_NAME, TS1_NAME, OBJ2_OWNER, OBJ2_NAME, TS2_NAME from TS_PITR_CHECK 确定执行TSPITR后会丢失的对象 2.1 查询 TS_PITR_OBJECTS_TO_BE_DROPPED -- 查询执行TSPITR后会丢失的对象 select owner, name, tablespace_name , creation_time from TS_PITR_OBJECTS_TO_BE_DROPPED where tablespace_name in ('DBS_D_JINGYU','DBS_I_JINGYU
2.3 基于时间点的恢复(PITR)PITR功能允许数据库管理员恢复至特定的时间点,可用于应对数据破坏或误操作的场景。 选择合适的恢复方式(全量恢复、归档恢复或PITR),准备相关备份集。执行恢复操作,确保遵循操作手册和最佳实践。恢复后进行数据一致性校验,确保业务系统正常运行。总结本次故障经历,更新备份与恢复策略。
8.0实现PITR WAL的版图终于有所扩张,实现了基于时间点的还原(Point-in-time recovery)简称PITR。 这个博客是讲历史,不讲功能的使用,感兴趣这个博客的读者相信对PITR的使用一定也是了然于胸。 PITR的基本原理是,从基础备份的checkpoint点开始,对之后的wal日志进行重演,因此PostgreSQL需要保存基础备份之后所有的wal日志。 这里可以理解一下温备和PITR,事实上如果让PITR在wal重演完所有的wal日志后停下来等待后续wal的出现,这就是温备。 RECOVERY_TARGET_LSN 为PITR指定一个停止redo的lsn点。
基于时间点的恢复(PITR)PITR允许用户将数据库恢复到某个特定时间点。这种恢复方法经常用于修复由于用户误操作引起的数据丢失或错误。需要准备好基线备份以及在恢复时间点之后生成的归档日志。 为归档恢复和PITR预先准备好必要的备份集和日志,以便于迅速恢复数据。结论随着数据规模的不断增长,数据备份与恢复技术将成为企业核心竞争力的重要组成部分。
需要注意的是,在执行TSPITR之前可以使用SYS.TS_PITR_OBJECTS_TO_BE_DROPPED视图将执行TSPITR后将被删除的对象查询出来并使用expdp导出到本地,在执行完TSPITR TSPITR的相关数据字典视图: SELECT * FROM SYS.TS_PITR_CHECK;--检查表空间是否是自包含 SELECT * FROM SYS.TS_PITR_OBJECTS_TO_BE_DROPPED
而使用 TiCDC 或者 binlog 虽然可以精细地记录增量的事件,恢复数据到全量备份之后的任意时间点,但 BR 本身还没有原生支持 PiTR (point-in-time recovery)。 在此之前,备份 PiTR 、 TiUP 以及 SaaS 服务都是一些很零散的东西,但在这次效果展示中,我们要把它们整合在一起,这其实是要花一些功夫的。 例如将 TiUP 集成到 PiTR ,实际上背后是起了很多个组件去运行备份的,然后再把增量的数据写到 S3。 陈昱:我自己聊过一个类似的项目,他们的软件真要用起来的话,在做实施时要投入大量的人力物力。 黄东旭:需要分两部分看,第一是 PiTR 的成熟度,第二个是 pCloud 的成熟度。pCloud 蛮简单的,关键是 PiTR 的成熟度。我会确保它在 PingCAP 的 Roadmap 上。 栾成:没错,主要还是 PiTR 本身的质量、性能和所支持的场景。大家都知道, 1TB 数据和 1GB 数据肯定是不同数量级的难度,关键点还是要看这个工具的稳定性以及性是否能满足要求。
和云托管数据库无缝协作: 云服务支持: AWS RDS、Google Cloud SQL、Azure Database for PostgreSQL 自托管: 任何您自行管理的 PostgreSQL 实例 为何不支持 PITR : 云服务商已提供原生 PITR,且外部 PITR 备份无法恢复到托管的云数据库——这使得它们对于云托管的 PostgreSQL 不切实际 实用的粒度: 对于 99% 的项目而言,每小时和每日备份已足够