PostgreSQL

备份

  1. pg_basebackup -D /tmp/pg_backup/ -Ft -Pv -U postgres -h 1.15.57.253 -p5432 -R
  • -D 空文件,没有该目录会自动创建
  • F 格式化
  • t 打包为tar包
  • Pv 显示备份的详细过程
  • -u 用户
  • -p 端口

备份报错:
PostgreSQL的pg_basebackup备份恢复详解 - 图1
在配置文件pg_hba.conf增加一行:
PostgreSQL的pg_basebackup备份恢复详解 - 图2
备份流程:
PostgreSQL的pg_basebackup备份恢复详解 - 图3

  1. pg_basebackup: initiating base backup, waiting for checkpoint to complete #开始基础备份,等待检查点完成
  2. pg_basebackup: checkpoint completed #已完成检查点
  3. pg_basebackup: write-ahead log start point: 0/2000028 on timeline 1 #预写日志起始于时间点: 0/2000028, 基于时间轴1
  4. pg_basebackup: starting background WAL receiver #启动后台 WAL 接收进程
  5. pg_basebackup: created temporary replication slot "pg_basebackup_24583" #已创建临时复制槽"pg_basebackup_24583"
  6. 24598/24598 kB (100%), 1/1 tablespace
  7. pg_basebackup: write-ahead log end point: 0/2000138 #预写日志结束点: 0/2000138
  8. pg_basebackup: waiting for background process to finish streaming ... #等待后台进程结束流操作...
  9. pg_basebackup: syncing data to disk ... #同步数据到磁盘
  10. pg_basebackup: base backup completed #基础备份已完成

备份出来的结果:
PostgreSQL的pg_basebackup备份恢复详解 - 图4

恢复

  1. [root@VM-0-9-centos data]# rm -rf /pgdata/12/data
  2. [root@VM-0-9-centos data]# rm -rf /pgdata/12/arch
  3. tar -xvf base.tar -C /pgdata/12/data
  4. tar -xvf pg_wal.tar -C /pgdata/12/arch

vi postgresql.auto.conf 追加:

  1. restore_command = 'cp /pgdata/12/arch/%f %p'
  2. recovery_target = 'immediate'
  1. touch /pgdata/12/recovery.signal

恢复成功:
PostgreSQL的pg_basebackup备份恢复详解 - 图5 :::tips 注意:data目录需要有700权限。 ::: PostgreSQL的pg_basebackup备份恢复详解 - 图6
需要进行操作:

  1. select pg_wal_replay_resume();

恢复到某个时刻

假设每天凌晨有一次全备,某天中午14点误删数据,如何恢复?

恢复原理:

全备+归档+在线redo

模拟测试:

周一数据:
PostgreSQL的pg_basebackup备份恢复详解 - 图7
全备:
PostgreSQL的pg_basebackup备份恢复详解 - 图8
周二数据:
PostgreSQL的pg_basebackup备份恢复详解 - 图9

此时14点,误删了库:

PostgreSQL的pg_basebackup备份恢复详解 - 图10
切一下归档:
PostgreSQL的pg_basebackup备份恢复详解 - 图11
PostgreSQL的pg_basebackup备份恢复详解 - 图12
PostgreSQL的pg_basebackup备份恢复详解 - 图13

关库:

  1. pg_ctl -D /pgdata/12/data stop -mi

删除数据:

  1. rm -rf /pgdata/12/data/*

将备份解压到数据目录:

  1. tar -xvf base.tar -C /pgdata/12/data

使用pg_waldump查看需要恢复到哪个事务之前。
恢复到502之前:
PostgreSQL的pg_basebackup备份恢复详解 - 图14

编辑配置文件:

postgresql.auto.conf追加:

  1. restore_command = 'cp /pgdata/12/arch/%f %p'
  2. recovery_target_xid='501'

启动数据库:

  1. pg_ctl -D /pgdata/12/data -l logfile start

将恢复停止:

  1. select pg_wal_replay_resume();

恢复成功:

PostgreSQL的pg_basebackup备份恢复详解 - 图15