PostgreSQL备份与恢复之pg_backup_start/pg_backup_stop/pg_basebackup/PITR(2)
david007Bili
编辑于 2024年09月14日 14:42
收录于文集
共11篇

      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

代码块
Shell
自动换行
复制代码
archive_mode = always          
archive_command = 'cp %p /home/postgres/pgdata1_wal/%f'         
复制成功

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

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

代码块
Shell
自动换行
复制代码
 ERROR:  function pg_start_backup(unknown)
复制成功

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

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

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

代码块
Shell
自动换行
复制代码
# 进入基础备份模式
# 在数据库运行状态直接对数据目录进行拷贝可能会导致数据不一致的情况
# 因此,在复制数据目录之前需要通过pg_backup_start做一个准备工作
postgres=# select pg_backup_start('baseline');
# 返回备份开始时WAL位置(LSN号)
 pg_backup_start
-----------------
 0/3000028
(1 row)
# 备份开始时LSN所在WAL段文件名
postgres=# select pg_walfile_name('0/3000028');
     pg_walfile_name
--------------------------
 000000010000000000000003
(1 row)
# 通过cp命令将pgdata目录拷贝到其他地方将其作为恢复的基础备份
cp -r ./pgdata ./backup_pgdata
# 结束基础备份模式
postgres=# select pg_backup_stop(false);
# 结束基础备份反馈的本次备份的重要基本信息
                              pg_backup_stop
---------------------------------------------------------------------------
 # 备份开始时WAL位置(LSN号)
 (0/3000138,"START WAL LOCATION: 0/3000028 (file 000000010000000000000003)+
 # 记录由该命令创建checkpoint对应的LSN位置
 CHECKPOINT LOCATION: 0/3000060                                           +
 # 做基础备份的方法,表示流复制
 BACKUP METHOD: streamed                                                  +
 # 备份来源,表示主节点
 BACKUP FROM: primary                                                     +
 # 执行pg_backup_start函数时间戳
 START TIME: 2024-09-12 15:51:21 CST                                      +
 # 在pg_backup_start中指定的备份标签
 LABEL: baseline                                                          +
 # 时间线信息
 START TIMELINE: 1                                                        +
 ","")
(1 row)
复制成功

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

代码块
Shell
自动换行
复制代码
postgres@DESKTOP-4LUMFT6:~$ ll pgdata1_wal/
total 49164
drwxr-xr-x  2 postgres postgres     4096 Sep 12 16:12 ./
drwxr-xr-x 17 postgres postgres     4096 Sep 12 17:48 ../
-rw-------  1 postgres postgres 16777216 Sep 12 15:36 000000010000000000000001
-rw-------  1 postgres postgres 16777216 Sep 12 15:51 000000010000000000000002
-rw-------  1 postgres postgres 16777216 Sep 12 16:12 000000010000000000000003
-rw-------  1 postgres postgres      321 Sep 12 16:12 000000010000000000000003.00000028.backup
postgres@DESKTOP-4LUMFT6:~$ ll pgdata1/pg_wal/
total 32784
drwx------  3 postgres postgres     4096 Sep 12 16:16 ./
drwx------ 19 postgres postgres     4096 Sep 12 15:27 ../
-rw-------  1 postgres postgres      321 Sep 12 16:12 000000010000000000000003.00000028.backup
-rw-------  1 postgres postgres 16777216 Sep 12 18:03 000000010000000000000004
-rw-------  1 postgres postgres 16777216 Sep 12 16:12 000000010000000000000005
drwx------  2 postgres postgres     4096 Sep 12 16:16 archive_status/
复制成功

物理备份--pg_basebackup

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

代码块
Shell
自动换行
复制代码
$ pg_basebackup -D /home/postgres/backup_basebackup_20240913_14 -Ft -Pv -U postgres -W -R
Password:
# 创建checkpoint
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/B000110 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created temporary replication slot "pg_basebackup_12078"
102366/102366 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/B0001E8
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: renaming backup_manifest.tmp to backup_manifest
pg_basebackup: base backup completed
复制成功

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

代码块
Shell
自动换行
复制代码
postgres@DESKTOP-4LUMFT6:~$ ll pgdata1/pg_wal/
total 98320
drwx------  3 postgres postgres     4096 Sep 13 14:08 ./
drwx------ 19 postgres postgres     4096 Sep 13 13:52 ../
-rw-------  1 postgres postgres 16777216 Sep 13 14:08 00000001000000000000000B
# 本次全量备份生成的标签文件
-rw-------  1 postgres postgres      338 Sep 13 14:08 00000001000000000000000B.00000110.backup
-rw-------  1 postgres postgres 16777216 Sep 13 14:08 00000001000000000000000C
-rw-------  1 postgres postgres 16777216 Sep 13 14:03 00000001000000000000000D
-rw-------  1 postgres postgres 16777216 Sep 13 14:02 00000001000000000000000E
-rw-------  1 postgres postgres 16777216 Sep 13 14:03 00000001000000000000000F
-rw-------  1 postgres postgres 16777216 Sep 13 14:08 000000010000000000000010
drwx------  2 postgres postgres     4096 Sep 13 14:08 archive_status/
postgres@DESKTOP-4LUMFT6:~$ ll pgdata1_wal/
total 180244
drwxr-xr-x  2 postgres postgres     4096 Sep 13 14:08 ./
drwxr-xr-x 19 postgres postgres     4096 Sep 13 14:07 ../
-rw-------  1 postgres postgres 16777216 Sep 12 15:36 000000010000000000000001
-rw-------  1 postgres postgres 16777216 Sep 12 15:51 000000010000000000000002
-rw-------  1 postgres postgres 16777216 Sep 12 16:12 000000010000000000000003
-rw-------  1 postgres postgres      321 Sep 12 16:12 000000010000000000000003.00000028.backup
-rw-------  1 postgres postgres 16777216 Sep 12 20:13 000000010000000000000004
-rw-------  1 postgres postgres 16777216 Sep 12 20:13 000000010000000000000005
-rw-------  1 postgres postgres      338 Sep 12 20:13 000000010000000000000005.00000028.backup
-rw-------  1 postgres postgres 16777216 Sep 13 14:02 000000010000000000000006
-rw-------  1 postgres postgres 16777216 Sep 13 14:03 000000010000000000000007
-rw-------  1 postgres postgres 16777216 Sep 13 14:03 000000010000000000000008
-rw-------  1 postgres postgres 16777216 Sep 13 14:03 000000010000000000000009
-rw-------  1 postgres postgres 16777216 Sep 13 14:08 00000001000000000000000A
-rw-------  1 postgres postgres 16777216 Sep 13 14:08 00000001000000000000000B
# 本次全量备份生成的标签文件
-rw-------  1 postgres postgres      338 Sep 13 14:08 00000001000000000000000B.00000110.backup
postgres@DESKTOP-4LUMFT6:~$ more pgdata1_wal/00000001000000000000000B.00000110.backup
START WAL LOCATION: 0/B000110 (file 00000001000000000000000B)
STOP WAL LOCATION: 0/B0001E8 (file 00000001000000000000000B)
CHECKPOINT LOCATION: 0/B000148
BACKUP METHOD: streamed
BACKUP FROM: primary
START TIME: 2024-09-13 14:08:29 CST
LABEL: pg_basebackup base backup
START TIMELINE: 1
STOP TIME: 2024-09-13 14:08:30 CST
STOP TIMELINE: 1
复制成功

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

代码块
Shell
自动换行
复制代码
postgres@DESKTOP-4LUMFT6:~$ cd backup_basebackup_20240912_20/
postgres@DESKTOP-4LUMFT6:~/backup_basebackup_20240912_20$ ll
total 68196
drwx------  2 postgres postgres     4096 Sep 12 20:13 ./
drwxr-xr-x 18 postgres postgres     4096 Sep 12 20:13 ../
-rw-------  1 postgres postgres   249966 Sep 12 20:13 backup_manifest
-rw-------  1 postgres postgres 52787712 Sep 12 20:13 base.tar
-rw-------  1 postgres postgres 16778752 Sep 12 20:13 pg_wal.tar
复制成功

pg_basebackup命令详解

代码块
Shell
自动换行
复制代码
pg_basebackup 对正在运行的 PostgreSQL 服务器进行基础备份。

用法:
  pg_basebackup [选项]...

控制输出的选项:
  -D, --pgdata=目录    将基础备份接收至目录
  -F, --format=p|t    输出格式(普通(默认)、tar)
  -r, --max-rate=速率  传输数据目录的最大传输速率(以 kB/s 为单位,或使用后缀“k”或“M”)
  -R, --write-recovery-conf
                      写入用于复制的配置
  -t, --target=目标[:详细信息]
                      备份目标(如果不是客户端)
  -T, --tablespace-mapping=旧目录=新目录
                      将旧目录中的表空间重定位到新目录
      --waldir=WAL 目录  预写日志目录的位置
  -X, --wal-method=none|fetch|stream
                      以指定方法包含所需的 WAL 文件
  -z, --gzip            压缩 tar 输出
  -Z, --compress=[{客户端|服务器}-]方法[:详细信息]
                      在客户端或服务器端按指定方式压缩
  -Z, --compress=none  不压缩 tar 输出

通用选项:
  -c, --checkpoint=fast|spread
                      设置快速或分散检查点
  -C, --create-slot     创建复制槽
  -l, --label=标签      设置备份标签
  -n, --no-clean        在错误后不清理
  -N, --no-sync         不等待更改安全写入磁盘
  -P, --progress        显示进度信息
  -S, --slot=槽名称     要使用的复制槽
  -v, --verbose         输出详细消息
  -V, --version         输出版本信息,然后退出
      --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE
                      使用算法计算清单校验和
      --manifest-force-encode
                      对清单中的所有文件名进行十六进制编码
      --no-estimate-size 不在服务器端估计备份大小
      --no-manifest      禁止生成备份清单
      --no-slot          防止创建临时复制槽
      --no-verify-checksums
                      不验证校验和
  -?, --help            显示此帮助,然后退出

连接选项:
  -d, --dbname=连接字符串  连接字符串
  -h, --host=主机名      数据库服务器主机或套接字目录
  -p, --port=端口号      数据库服务器端口号
  -s, --status-interval=间隔
                      发送到服务器的状态数据包之间的时间间隔(以秒为单位)
  -U, --username=用户名  以指定的数据库用户进行连接
  -w, --no-password      从不提示输入密码
  -W, --password         强制密码提示(应自动发生)
复制成功


备份恢复

       有了基础备份以及一段连续的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

代码块
Shell
自动换行
复制代码
# 用于获取 WAL 文件系列的一个已归档段的本地 shell 命令。
# 此参数对于归档恢复是必需的,但对于流复制是可选的。
# 字符串中的任何 % f 都会被要从归档中检索的文件的名称替换
# 任何 % p 都会被服务器上的复制目标路径名称替换。
# 对于归档中不存在的文件名,也会向该命令请求;在这种情况下,它必须返回非零值。
restore_command = 'cp /home/postgres/pgdata1_wal/%f "%p"'
复制成功

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

代码块
Shell
自动换行
复制代码
# 默认情况下,恢复会恢复到 WAL 日志的末尾。

# 目前只有immediate一个值
# 此参数指定恢复应在达到一致状态后尽快结束,即尽早结束。
# 从在线备份恢复时,这意味着备份结束的点。
recovery_target = 'immediate'

# 恢复到指定的LSN为止
# 精确的停止点也受 recovery_target_inclusive 的影响。
recovery_target_lsn = '0/B000110'

# 恢复到已命名的恢复点
# 数据库运行中,通过pg_create_restore_point函数创建一个还原点
recovery_target_name = ''

# 恢复到指定时间点对应的数据位置
# 精确的停止点也受 recovery_target_inclusive 的影响。
recovery_target_time = '2024-09-13 14:08:29'

# 恢复到某一个事务id所在的数据位置
recovery_target_xid = ''

# 指定是在指定的恢复目标之后停止(on),还是在恢复目标之前停止(off)。
# 当指定 recovery_target_lsn、recovery_target_time 或 recovery_target_xid 时适用。
# 默认值为 on。
recovery_target_inclusive(布尔值)
复制成功

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

代码块
Shell
自动换行
复制代码
# 指定恢复到特定的时间线。
# 该值可以是数字时间线 ID 或特殊值。
# “current” 值沿着进行基础备份时的相同时间线恢复。
# “latest” 值恢复到归档中找到的最新时间线,这在备用服务器中很有用。
# 默认值为 “latest”。
recovery_target_timeline(字符串)
复制成功

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

代码块
Shell
自动换行
复制代码
# 指定服务器在达到恢复目标时应采取的操作。
# 默认值为 “pause”,这意味着恢复将暂停。
# “promote” 意味着恢复过程将完成,服务器将开始接受连接。
# “shutdown” 将在达到恢复目标后停止服务器。
recovery_target_action = 'promote'
复制成功


备份及恢复示例

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

代码块
Shell
自动换行
复制代码
wal_level = replica
archive_mode = always
archive_command = 'cp %p /home/postgres/pgdata_arch/%f'
复制成功

2、生成正常运行数据。

代码块
Shell
自动换行
复制代码
# 创建一张测试表
create table david1(id INT, name varchar(32));
# 随机生成一些数据,代表正常业务数据
insert into david1 select generate_series(1,100) as id, md5(random()::text) as name;
复制成功

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

4、模拟误操作删库

代码块
Shell
自动换行
复制代码
postgres=# drop table david1;
DROP TABLE
复制成功

5、关闭数据库

代码块
Shell
自动换行
复制代码
pg_ctl -D /home/postgres/pgdata1 stop -mi
复制成功

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

代码块
Shell
自动换行
复制代码
# 通过查询备份信息,可以定位删除操作的大概位置为003文件之后
$ more backup_label
START WAL LOCATION: 0/3000028 (file 000000010000000000000003)
CHECKPOINT LOCATION: 0/3000060
BACKUP METHOD: streamed
BACKUP FROM: primary
START TIME: 2024-09-14 11:16:19 CST
LABEL: pg_basebackup base backup
START TIMELINE: 1

# pg_waldump命令可以解析对应的WAL文件,查找对应日志的信息
# 查看可以找到对应的事务ID为936
l$ pg_waldump 000000010000000000000004
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/04000028, prev 0/03000100, desc: RUNNING_XACTS nextXid 936 latestCompletedXid 935 oldestRunningXid 936
rmgr: Standby     len (rec/tot):     42/    42, tx:        936, lsn: 0/04000060, prev 0/04000028, desc: LOCK xid 936 db 5 rel 24888
rmgr: Heap        len (rec/tot):     59/  2151, tx:        936, lsn: 0/04000090, prev 0/04000060, desc: DELETE off 11 flags 0x00 KEYS_UPDATED , blkref #0: rel 1663/5/1247 blk 14 FPW
rmgr: Heap        len (rec/tot):     59/  4163, tx:        936, lsn: 0/040008F8, prev 0/04000090, desc: DELETE off 67 flags 0x00 KEYS_UPDATED , blkref #0: rel 1663/5/2608 blk 13 FPW
复制成功

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

代码块
Shell
自动换行
复制代码
# 将基础备份数据拷贝到指定目录
tar -xf ./backup/base.tar -C ./pgdata2/
# 将WAL目录中的数据拷贝到指定目录中
cp -r ./pgdata1/pg_wal/* ./pgdata2/pg_wal/
复制成功

8、配置恢复参数

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

代码块
Shell
自动换行
复制代码
restore_command = 'cp /home/postgres/pgdata_arch/%f "%p"'
recovery_target_xid = '936'
recovery_target_action = 'promote'
recovery_target_inclusive = off
复制成功

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

代码块
Shell
自动换行
复制代码
touch recovery.signal 
复制成功

9、启动数据库

代码块
Shell
自动换行
复制代码
pg_ctl -D ./pgdata2 start
复制成功

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)

代码块
Shell
自动换行
复制代码
$ pg_ctl -D ./pgdata2/ start
waiting for server to start....2024-09-14 13:50:56.010 CST [3603] LOG:  starting PostgreSQL 15.5 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0, 64-bit
2024-09-14 13:50:56.010 CST [3603] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2024-09-14 13:50:56.014 CST [3603] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2024-09-14 13:50:56.019 CST [3606] LOG:  database system was interrupted; last known up at 2024-09-14 11:16:19 CST
cp: cannot stat '/home/postgres/pgdata_arch/00000002.history': No such file or directory
2024-09-14 13:50:56.163 CST [3606] LOG:  starting point-in-time recovery to XID 936
2024-09-14 13:50:56.174 CST [3606] LOG:  restored log file "000000010000000000000003" from archive
2024-09-14 13:50:56.199 CST [3606] LOG:  redo starts at 0/3000028
cp: cannot stat '/home/postgres/pgdata_arch/000000010000000000000004': No such file or directory
2024-09-14 13:50:56.202 CST [3606] LOG:  consistent recovery state reached at 0/3000100
2024-09-14 13:50:56.202 CST [3603] LOG:  database system is ready to accept read-only connections
2024-09-14 13:50:56.202 CST [3606] LOG:  recovery stopping before commit of transaction 936, time 2024-09-14 11:17:20.563665+08
2024-09-14 13:50:56.202 CST [3606] LOG:  redo done at 0/4007930 system usage: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s
cp: cannot stat '/home/postgres/pgdata_arch/00000002.history': No such file or directory
2024-09-14 13:50:56.209 CST [3606] LOG:  selected new timeline ID: 2
cp: cannot stat '/home/postgres/pgdata_arch/00000001.history': No such file or directory
2024-09-14 13:50:56.257 CST [3606] LOG:  archive recovery complete
2024-09-14 13:50:56.259 CST [3604] LOG:  checkpoint starting: end-of-recovery immediate wait
2024-09-14 13:50:56.273 CST [3604] LOG:  checkpoint complete: wrote 10 buffers (0.1%); 0 WAL file(s) added, 0 removed, 1 recycled; write=0.003 s, sync=0.003 s, total=0.017 s; sync files=8, longest=0.002 s, average=0.001 s; distance=16414 kB, estimate=16414 kB
2024-09-14 13:50:56.281 CST [3603] LOG:  database system is ready to accept connections
 done
server started
复制成功

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

代码块
Shell
自动换行
复制代码
postgres=# \c postgres
You are now connected to database "postgres" as user "postgres".
postgres=# \dt
         List of relations
 Schema |  Name  | Type  |  Owner
--------+--------+-------+----------
 public | david1 | table | postgres
(1 row)

postgres=# select * from david1 limit 10;
 id |               name
----+----------------------------------
  1 | 94610ad6f75c3c30359181d0e3b6b632
  2 | a2d66a2683376596475d562c39cb5bc2
  3 | 566759dad92ce040216e9751bb90e446
  4 | eb927ffeec35239365db88ff0a04d849
  5 | 530aa308911e251b4ebccec7716868a6
  6 | 55b436918391f027b977e9ddcfef3d88
  7 | 227f60ebfa62fb97f985a3812e31bc24
  8 | d8f7f2f1f68e137b08ed346451fe6ad8
  9 | 193ee4c79e46ab4f6ab8b12d552f67d3
 10 | 16148dbb0abfeaa9207a80bb1cc80a34
(10 rows)
复制成功

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

代码块
Shell
自动换行
复制代码
postgres=# select pg_current_wal_lsn();
 pg_current_wal_lsn
--------------------
 0/600F958
(1 row)

postgres=# select pg_walfile_name('0/600F958');
     pg_walfile_name
--------------------------
 000000020000000000000006
(1 row)
复制成功


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