当前位置:首页|资讯

PostgreSQL备份与恢复之pg_backup_start/pg_backup_stop/pg_basebackup/PIT

作者:david007Bili发布时间:2024-09-14

      postgreSQL备份从数据形态上分为逻辑备份和物理备份。

      PostgreSQL 9的流复制是基于WAL日志的物理复制,其原理是主库不间断地发送WAL日志流到备库,备库接收主库发送的WAL日志流后回放WAL; 

      PostgreSQL10版本中增加了一个新特性,即逻辑复制(Logical Replication)。逻辑复制是基于逻辑解析(Logical Decoding),其核心原理是主库将WAL日志流解析成一定格式的数据流,订阅节点收到解析后的WAL数据流后进行回放,从而实现数据同步,逻辑复制并不是使用WAL原始日志文件进行复制。 

      物理备份一般可以分为冷备和热备。

      冷备需要停止数据库实例,因此,只需要将磁盘中的相关数据库目录复制到其他介质保存即可。但是由于需要停止运行,应用场景相对受限。

      热备是指在数据库正常运行的情况下进行数据库备份。如果直接进行磁盘文件拷贝会存在数据一致性问题,因此需要在相应的保护逻辑下才能进行热备处理,本章介绍postgres中常用的物理逻辑备份工具使用方法、备份恢复方法以及一次完整的数据丢失恢复示例。


命令实验环境

1、数据库目录 /home/postgres/pgdata1

2、WAL归档日志 /home/postgres/pgdata1_wal

3、数据库版本号: postgres15.5

4、数据库规格:单节点

5、操作系统:Ubuntu 20.04.6 LTS

6、恢复数据库目录 /home/postgres/pgdata2


物理备份

物理备份--pg_backup_start/pg_backup_stop

      pg15对基础备份命令名称进行了调整,之前的命令名为pg_start_backup/pg_stop_backup

以下为使用旧函数报错信息

      pg_backup_start命令主要功能为做一些创建基础备份前的准备工作,已克服直接拷贝文件带来的数据不一致问题。主要为强制开启全页写模式,强制WAL日志切换,强制创建检查点三部分工作(pogstgres中的WAL日志FPW会解释数据不一致的原因)。

      pg_stop_backup用于结束基础备份操作,pg_backup_start开启备份后必须要调用此函数结束备份。该函数主要做一些备份善后操作,如关闭全页写模式,记录备份WAL日志,创建本次备份关键信息文件等。

      下面介绍使用pg_backup_start/pg_backup_stop进行基础备份流程

      在执行pg_backup_stop命令后,查看数据库目录空间如下,可以看到WAL归档日志目录下生成000000010000000000000003.00000028.backup文件,在pg_wal目录下也生成000000010000000000000003.00000028.backup文件,该文件记录了本次基础备份的基本信息,该文件非常重要,在后续基于基础备份进行数据恢复会使用该文件信息。


物理备份--pg_basebackup

      pg_basebackup工具为更加自动化的一种基础备份方法,其底层实现整合了pg_backup_start/pg_backup_stop命令。该方法会自动将数据文件传输到备份目录,将上述三步合并执行,下面为pg_basebackup备份流程。

        执行pg_basebackup后查看归档日志目录以及数据库目录如下,与pg_backup_start/pg_backup_stop保持一致。

      pg_basebackup归档文件目录如下,base.tar表示基础备份数据,pg_wal.tar表示备份时数据库目录中的WAL日志目录,实际不使用该文件(增量数据恢复依赖归档目录以及数据库当前目录下的pg_wal目录中的WAL文件)。

pg_basebackup命令详解

备份恢复

       有了基础备份以及一段连续的WAL日志,就可以恢复到任意时间点的数据,postgres采用时间点故障恢复(point-in-time recovery)。

        “恢复” 包括将服务器用作备用服务器或执行有针对性的恢复(targeted recovery)。通常,备用模式将用于提供高可用性或读取可扩展性,而有针对性的恢复用于从数据丢失中恢复。

        要以备用模式启动服务器,请在数据目录中创建一个名为 standby.signal 的文件。服务器将进入恢复状态,并且在到达归档 WAL 的末尾时不会停止恢复,而是会通过连接由 primary_conninfo 设置指定的发送服务器和 / 或使用 restore_command 获取新的 WAL 段来继续尝试恢复。

        要以有针对性的恢复模式启动服务器,请在数据目录中创建一个名为 recovery.signal 的文件。有针对性的恢复模式在归档 WAL 完全重放或达到 recovery_target 时结束。

        如果同时创建了 standby.signal 和 recovery.signal 文件,则备用模式优先。

        恢复命令指定: restore_command

        恢复位置点指定: recovery_target、recovery_target_lsn、recovery_target_name、recovery_target_time 或 recovery_target_xid 最多只能使用其中一个;如果在配置文件中指定了多个,将会引发错误。这些参数只能在服务器启动时设置。

        以上为指定精确的恢复位置,还可以指定恢复到某个时间线。

        恢复后运行模式: recovery_target_action参数控制备份恢复后,数据库运行的模式

备份及恢复示例

1、启动数据库,需要开启归档功能。

2、生成正常运行数据。

3、利用pg_basebackup进行全量备份。

4、模拟误操作删库

5、关闭数据库

6、查找drop语句对应的事务id(936)

7、将备份数据拷贝到新的数据库目录中

8、配置恢复参数

          在postgresql.auto.conf配置文件中修改恢复参数如下:

        在pgdata2目录下增加recovery.signal 文件表示为数据恢复目的。

9、启动数据库

10、验证是否正确恢复数据

        通过pg_ctl启动数据库,开始数据恢复,我们会看到“cp: cannot stat '/home/postgres/pgdata_arch/000000010000000000000004': No such file or directory”错误,这部分可以忽略。

参考官方文档: PostgreSQL: Documentation: 15: 26.3. Continuous Archiving and Point-in-Time Recovery (PITR)

        通过psql连接服务,从下图可以看到已经恢复到删除表格之前的数据状态。

        验证当前LSN号对应文件,可知时间线已递增修改为2。

        文章主要介绍了 PostgreSQL 的备份和恢复相关内容,包括备份的分类(逻辑备份和物理备份)、物理备份的两种方法(pg_backup_start/pg_backup_stop 和 pg_basebackup)、备份恢复的相关设置(如恢复命令 restore_command、恢复位置点、恢复时间线、恢复后运行模式等),并通过一个完整的数据丢失恢复示例展示了具体的操作流程。


Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1