PostgreSQL 15版本在可靠性方面有不少改进,上一篇文章介绍了本地化规则的改进:<<PostgreSQL 15可靠性之本地化规则改进>>,本文将介绍另外一个关于备份模式的改进。
在介绍备份模式之前我们先了解一下备份函数名称在PostgreSQL 15的变化,大家如果有使用自定义脚本调用过备份函数做备份时,在PostgreSQL 15之前是下面的两个函数:
- pg_start_backup()
- pg_stop_backup()
从PostgreSQL 15开始名称变为:
- pg_backup_start()
- pg_backup_stop()
这样命名之后,方便进行TAB补全,也容易搜索和识记,不过重命名主要是为了区分以前的独占模式。
在PostgreSQL 15里我们如果仔细观察pg_backup_start()和pg_backup_stop()函数的参数列表,可以对比发现排他性备份模式"exclusive"参数消失了。
排他性备份模式一直以来并不被推荐使用,它带来最大的问题是如果数据库服务器在这种模式突然停止时,服务器可能无法随后启动。
因为排他性备份下,系统会在数据目录创建一个backup_label备份标签文件,其中包含启动备份的最新检查点位置。这能确保在启动服务时不会从控制文件pg_control中读取检查点位置。
但是它可能会导致数据损坏,因为备份可能包含该检查点之前的数据文件。系统业务如果比较繁忙,pg_wal目录中的WAL可能已经被归档和回收。随后服务启动将失败,此时必须手动删除备份中的标签文件才能重新启动数据库服务。
从PostgreSQL 15开始,删除了排他性备份模式,非排他性备份模式下通过pg_backup_stop函数返回检查点及表空间映射等信息,而不在数据目录中创建。
postgres=# select pg_backup_stop(); pg_backup_stop ------------------------------------------------------------------------ (0/83000138,"START WAL LOCATION: 0/83000060 (file 000000010000000000000083)+ CHECKPOINT LOCATION: 0/83000098 + BACKUP METHOD: streamed + BACKUP FROM: primary + START TIME: 2022-11-21 08:42:34 CST + LABEL: mybak1 + START TIMELINE: 1 + ","") (1 row)
复制
但是在备份期间需要保持数据库连接的连续性,如果客户端在进行备份时连接断开则备份将中止。
同时与独占模式相关的pg_is_in_backup()和pg_backup_start_time()这两个函数已经没有用武之地,也被删除了。
保持联系
从2019年12月开始写第一篇文章,分享的初心一直在坚持,本人现在组建了一个PG乐知乐享交流群,欢迎关注我文章的小伙伴加我微信进群吹牛唠嗑,交流技术。