Postgres备份总结

对于数据库而言备份是必不可少的。备份数据的方法多种多样,此文总结了多种工具。

pg_dump/pg_restore

pg_dumppg_dumpall将数据库抽取为一个脚本文件或其他归档文件。这种备份被分类为逻辑备份,其大小可能比物理备份小得多。这部分是由于索引未存储在SQL转储中。从逻辑备份还原时,只存储CREATE INDEX命令,并且必须重建索引。

SQL 转储方法的一个优点是输出数据文件后可以重新加载到较新版本的 Postgres 中,因此这种转储和恢复方式在版本升级和迁移中常被选择。另一个优点是这些工具可以指定备份特定的数据库对象并忽略其他对象。例如,如果只需要在测试环境中备份表的某个子集。或者在数据库运行状态下执行一些有风险的单表备份。

Postgres 即使数据库正在并发使用,它也能创建一致的备份。不阻塞其他用户访问数据库(读取或写入)。这说明转储在内部也是一致的,意味着转储代表dump启动时数据库的快照。转储虽然不会阻止其他操作,但备份可能会长时间运行(数小时或数天,具体取决于硬件和数据库大小)。由于 Postgres 用于实现并发的方法(多版本并发控制),长时间运行的备份可能会导致 Postgres 的性能下降,直到转储完成。

要转储单个数据库表,可以运行如下命令:

pg_dump -t my_table > table.sql

恢复以上备份,运行以下命令:

psql -f table.sqld

当然dump工具的参数不止这么点。可以参考pg官网手册http://postgres.cn/docs/11/app-pgdump.html

pg_dump在创建文件时顺序扫描整个数据集。读取整个数据库是对所有表数据(而不是索引)的基本损坏检查。如果数据损坏,pg_dump将抛出异常。pg_dump在内部执行SELECT语句。如果你运行pg_dump时出现问题,可以尝试在psql中确认能够从正在使用的数据库中获取到数据。

服务器和文件系统备份

对于Linux 管理员习惯使用rsync或其他工具为运行数据库的整台机器进行备份。Postgres 在运行时无法使用面向文件的工具进行安全备份,而且也没有简单的方法来停止写入。要使数据库进入可以使用rsync访问数据的状态,要么必须将数据库关闭,要么完成设置更改存档的所有工作

物理备份和 WAL 归档

除了基本的转储文件之外,更复杂的 Postgres 备份方法都依赖于保存数据库的预写日志 (WAL) 文件。WAL 跟踪对所有数据库块的更改,将它们保存到默认大小为 16MB 的段中。服务器的 WAL 文件的连续集合称为其 WAL 流。在安全复制数据库之前,必须开始归档WAL流的文件,然后执行生成“基本备份”(即pg_basebackup)的过程。WAL能够增量备份使得恢复功能成为可能,当然这些恢复是在时间点恢复工具的基础之上。

使用 pg_basebackup工具创建一个基本备份:

$ sudo -u postgres pg_basebackup -h localhost -p 5432 -U postgres \
	-D /var/lib/pgsql/15/backups -Ft -z -Xs -P -c fast
  • 此命令应以postgres用户身份运行。
  • -D参数指定保存备份的位置。
  • -Ft参数指示备份出的文件存储方式使用 tar 格式。
  • -Xs参数表示 WAL 文件将流式传输到备份。这很重要,因为在进行备份时可能会发生大量 WAL 活动,并且您可能不希望在此期间将这些文件保留在主要文件中。这是默认行为,但值得指出。
  • -z参数表示将压缩 tar 文件,只有使用 tar 格式时压缩才可用, 并且后缀.gz将自动添加到所有tar文件名。
  • -P参数表示实时的打印备份的进度。
  • fast-c参数表示立即采取检查点。如果未指定此参数,则备份将不会开始,直到 Postgres 自己触发检查点。

输入命令后,备份立即开始。根据集群的大小,可能需要一些时间才能完成。但是,备份操作不会中断与数据库的任何其他连接。

使用 pg_basebackup 进行的备份恢复的步骤

  • 确保数据库已关闭。
$ sudo systemctl stop postgresql-15.service
$ sudo systemctl status postgresql-15.service
  1. 删除 Postgres 数据目录的内容来模拟灾难。
  • $ sudo rm -rf /var/lib/pgsql/15/data/*
    
  • 将 base.tar.gz 提取到数据目录中。
$ sudo -u postgres ls -l /var/lib/pgsql/15/backups
total 29016
-rw-------. 1 postgres postgres   182000 Nov 23 21:09 backup_manifest
-rw-------. 1 postgres postgres 29503703 Nov 23 21:09 base.tar.gz
-rw-------. 1 postgres postgres	17730 Nov 23 21:09 pg_wal.tar.gz


$ sudo -u postgres tar -xvf /var/lib/pgsql/15/backups/base.tar.gz \
     -C /var/lib/pgsql/15/data
  • 将 pg_wal.tar.gz 提取到数据目录之外的新目录中。在此案例中,在备份目录中创建了一个名为 pg_wal 的目录。
$ sudo -u postgres ls -l /var/lib/pgsql/15/backups
total 29016
-rw-------. 1 postgres postgres   182000 Nov 23 21:09 backup_manifest
-rw-------. 1 postgres postgres 29503703 Nov 23 21:09 base.tar.gz
-rw-------. 1 postgres postgres	17730 Nov 23 21:09 pg_wal.tar.gz

$ sudo -u postgres mkdir -p /var/lib/pgsql/15/backups/pg_wal

$ sudo -u postgres tar -xvf /var/lib/pgsql/15/backups/pg_wal.tar.gz \
      -C /var/lib/pgsql/15/backups/pg_wal/
  • 创建 recovery.signal 文件。
$ sudo -u postgres touch /var/lib/pgsql/15/data/recovery.signal
  • 在 postgresql.conf 中设置 restore_command 以复制备份期间流式传输的 WAL 文件。
$ echo "restore_command = 'cp /var/lib/pgsql/15/backups/pg_wal/%f %p'" | \
      sudo tee -a /var/lib/pgsql/15/data/postgresql.conf
  • 启动数据库。
$ sudo systemctl start postgresql-15.service sudo systemctl status
postgresql-15.service
  • 现在数据库已启动并根据先前基本备份中包含的信息运行。

pgBackRest

这是一个非常强大的备份工具。有许多规模庞大的 Postgres 环境依赖于 pgBackRest。

pgBackRest 可以执行三种类型的备份:

  • 完整备份——将数据库集群的全部内容复制到备份中。
  • 差异备份 - 仅复制自上次完整备份以来更改的数据库集群文件
  • 增量备份 - 仅复制自上次完整、差异或增量以来更改的数据库集群文件。

pgBackRest 具有一些特殊功能,例如:

  • 允许回到某个时间点 - PITR(时间点恢复)
  • 创建增量还原,该增量还原将使用已存在并基于WAL段更新的数据库文件。这使得恢复速度更快,特别是在一个大型数据库并且不用恢复整个数据库的情况下。

  • 支持多个备份存储库 - 比如说一个本地的或一个远程的冗余。

关于归档,用户可以设置archive_command参数以使用 pgBackRest 将 WAL 文件复制到外部归档。根据需要的数据保留策略,设置文件过期时间或者无限保留。

要在安装后启动 pgBackRest,将运行如下命令:

$ sudo -u postgres pgbackrest --stanza=demo --log-level-console=info stanza-create

要执行增量还原:


$ sudo systemctl stop postgresql-15.service
$ sudo -u postgres pgbackrest \
--stanza=db --delta \
--type=time "--target=2022-09-01 00:00:05.010329+00" \
--target-action=promote restore

 恢复完成后,重新启动数据库并验证用户表已恢复。


$ sudo systemctl start postgresql-15.service
$ sudo -u postgres psql -c "select * from users limit 1"

备份时序

pgBackRest 具有相当多的设置选项和配置来设置满足特定需求的策略。备份策略将取决于多个因素,包括恢复点目标、可用存储和其他因素。正确的解决方案将需要这些要求而有所不同。正确的策略是在恢复时间、使用的存储、源数据库上的 IO 开销和其他因素之间取得平衡。

通常的建议是结合 pgBackRest 的备份和 WAL 归档功能。通常建议客户除了连续归档 WAL 文件外,每周进行一次完整的基本备份,并考虑其他增量备份形式—甚至可能是 pg_dump。

结论

逻辑备份        物理备份
pgdump         pgbasebackup pgbackrest
数据备份
备份指定的表或者模式 × ×
DDL/模式 √         √   √  
在不同的版本中迁移 √   × ×
恢复到某一时间点 × × √  
增量/差异备份 × × √  

猜你喜欢

转载自blog.csdn.net/hezhou876887962/article/details/129466904
今日推荐