PostgreSQL码农集散地

为什么实例越大备份与恢复越难?

文章开始前推荐2个学习环境: 

1、欢迎使用镜像快速体验PostgreSQL/DuckDB强大功能:《最好的PostgreSQL学习镜像》

2、欢迎使用云起实验室: 《免费体验PolarDB开源数据库》

3、PolarDB开源数据库内核、应用等学习图谱:  https://www.aliyun.com/database/openpolardb/activity 

为什么实例越大备份与恢复越难?

https://www.bilibili.com/video/BV1bS4y1L7Bd/

  • 逻辑备份, 为保证DB层备份集的一致性, 需要开启RR或SSI隔离级别事务, 大库备份周期长, 这个窗口期产生的垃圾无法被回收, 引发膨胀

    • 也会引发无用的vacuum cpu和io消耗, 因为表到达垃圾回收阈值, 但是又一直回收不掉. vacuum 不断的被唤醒扫描表.

  • 逻辑备份, 需要加对象级别共享锁, 直到库级备份结束, 可能引发堵塞DDL操作

  • 物理备份, 不支持partial recovery, 因此恢复需要巨大存储资源

  • 物理备份, 不支持block 级增量备份, 因此每次基础备份都需要备份全量. 实例越大, 全量备份周期间隔、单次全量备份耗时都很长, 周期内的WAL日志越多, 应用WAL恢复到目标时间点的耗时也越长.

  • 物理备份, 一旦恢复到目标时间点, 就不能再往回退(例如恢复到2021-10-10 10:01:00但是发现恢复过头了, 想回退到2021-10-10 10:00:00), 需要回退的话, 还重新恢复一次

  • 备份需要预备大量存储空间(不管是逻辑备份、全量备份、还是归档备份)

社区版本优化方法:

  • 安装块级别增量备份插件, 跟踪备份后变化的block, 使用pg_probackup或者pg_rman来支持块级别增量备份

    • 使用增量备份, 降低全量备份频次

    • 使用增量恢复, 减少恢复需要的wal日志, 缩短恢复耗时

  • 采用standby + zfs文件系统, 在standby上使用zfs快照代替数据备份

    • 大幅度提升备份速度: 秒级快照

    • 减少备份存储空间消耗: zfs支持压缩

    • 提高还原速度: 秒级克隆

    • 减少备份、恢复存储空间消耗: zfs是cow的, 对于不变的数据快照几乎不占用空间

  • 《如何创建RDS PG 的秒级 flashback闪回实例, 实时容灾实例 - zfs - snapshot - clone - standby - compress》

  • 《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)验证 - recovery test script for zfs snapshot clone + postgresql stream replication + archive》

  • 《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)双机HA与块级备份部署》

  • 《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)单个数据库采用多个zfs卷(如表空间)时如何一致性备份》

  • 《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)备份集有效性自动校验》

  • 《PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)方案与实战》

  • 《PostgreSQL 快速大版本升级多种方案 - 含重点介绍fast & safe upgrade to PostgreSQL 9.4 use pg_upgrade & zfs》

PolarDB优化方法:

  • 使用存储快照代替全量备份. 与ZFS类似: 高效.

    • 支持本地快照、二级存储备份(将快照的全量数据转储到OSS或其他对象存储).

  • 恢复

    • 本地存储集群快照: 秒级恢复.

    • 远程快照: 拷贝到本地存储集群后再恢复.

本期问题1:
为什么数据库逻辑备份可能堵塞DDL?

  • a. 逻辑备份需要加排他锁, 在实例备份结束时释放

  • b. 逻辑备份需要加对象元数据共享锁, 在数据库备份结束时释放

  • c. 逻辑备份需要加数据行共享锁, 在实例备份结束时释放

  • d. 逻辑备份需要加页级别共享锁, 在数据库备份结束时释放

答案:

  • b

解释:

  • 参考本文内容

本期问题2:
为什么快照备份比全量备份更快且存储空间耗费更小?

  • a. 因为快照支持压缩, 全量备份不支持压缩

  • b. 因为快照备份使用了cow技术, 写时才需要拷贝, 对于未修改的数据几乎不占空间. 打快照时也不需要拷贝数据.

  • c. 快照的全量拷贝在存储内部完成, 不需要传输数据到外部

  • d. 快照备份支持更高的压缩比

答案:

  • b

解释:

  • 参考本文内容

本期问题3:
哪些方法可以提高备份和恢复的效率?

  • a. 跟踪block变化, 使用块级增量备份降低全量备份频率

  • b. 使用快照备份代替全量文件拷贝

  • c. 使用快照克隆代替全量文件拷贝恢复

  • d. 使用快照或克隆异步传输代替同步传输

答案:

  • abcd

解释:

  • 参考本文内容

本期问题4:
以下对PolarDB备份、恢复描述正确的是?

  • a. PolarDB 使用快照备份

  • b. PolarDB 云服务需要等待快照备份的内容全部拷贝到OSS才能用于修复因为存储损坏导致的故障. (或者切换到standby)

  • c. PolarDB 的快照是增量的, 不需要每次都拷贝全量数据

  • d. PolarDB 恢复时采用快照克隆+replay wal归档的方式

  • e. PolarDB 云服务支持本地快照和二级快照

答案:

  • abcde

解释:

  • 参考本文内容

欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.  

近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号:

Image

文章中的参考文档请点击阅读原文获得.