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、恢复位置点、恢复时间线、恢复后运行模式等),并通过一个完整的数据丢失恢复示例展示了具体的操作流程。