postgresql-备份与恢复
基本概念
服务器系统错误、硬件故障或者人为失误都可能导致数据的丢失或损坏。因此,备份和恢复
对于数据库的高可用性至关重要。数据库管理员应该根据业务的需求制定合适的备份策略,并提
前演练各种故障情况下的恢复过程,做到有备无患。
在升级 PostgreSQL 版本之前,通常也需要先进行数据库的备份。另外,备份也可以用于主从复制结构中的从节点初始化
备份(backup)
是通过某种方式(物理复制或者逻辑导出)将数据库的文件或结构和数据
拷贝到其他位置进行存储
还原(restore)
是一种不完全的恢复,使用备份的文件将数据库恢复到执行备份时的状态。
备份时间点之后的数据变更无法通过还原进行恢复。
恢复(recovery)
通常是先使用物理备份文件进行还原,然后再应用备份时间点到故障点之
间的日志文件(WAL),将数据库恢复到最新状态。
备份类型
根据备份的方式和内容的不同,可以进行以下分类。
物理备份与逻辑备份
在线备份与离线备份
全量备份与增量备份
全量备份(Full Backup)
就是备份所有的数据库文件,执行一次完整的 PostgreSQL 数据库集群备份。这种方式需要备份的内容较多,备份时较慢,但是恢复速度更快。
增量备份(Incremental Backup)
就是备份上一次备份(任何类型)之后改变的文件。另外,
差异备份(Differential Backup)是针对上一次完全备份后发生变化的所有文件进行备份。增量
备份每次备份的数据量较小,但是恢复时需要基于全量备份,并依次恢复增量部分,时间较长。
差异备份位于两者之间
备份恢复工具
- pg_dump,逻辑备份工具,支持单个数据库(可以指定模式、表)的导出,可以选择导出的格式
- pg_dumpall,逻辑备份工具,用于导出整个数据库集群,包括公用的全局对象
- pg_basebackup,物理备份工具,为数据库集群创建一个基准备份。它也可以用于时间点恢复(point-in-time recovery)的基准备份,或者设置基于日志传输或流复制的从节点的初始化。
- psql, PostgreSQL 交互式命令行工具,也可以用于导入逻辑备份产生的 SQL 文件
- pg_restore,逻辑还原工具,用于还原 pg_dump 导出的归档格式的备份文件。
- COPY,PostgreSQL 专有的 SQL 语句,将表中的数据复制到文件,或者将文件中的数据复制到表中
此外,还可以通过第三方工具执行备份与恢复操作。
- pgAdmin(开源)
- Barman(开源)
- pg_probackup(开源)
- pgBackRest(开源)
- BART(商业)
备份与恢复
逻辑备份与还原
执行逻辑备份时,PostgreSQL 服务器必须已经启动,备份工具(例如 pg_dump)通过建立
数据库连接,从数据库中查询出相应的结构信息和数据,并生成备份文件。针对不同的备份格式,
PostgreSQL 提供了配套的还原工具。
备份单个数据库
PostgreSQL 提供了备份单个数据库的工具 pg_dump,在安装目录下bin文件夹下面,关于 pg_dump 工具的各种选项,可以参考官方文档
powershell
D:\tools\postgresql\bin\pg_dump.exe --help
它支持三种文件格式
使用windows dos命令行打开pg_dump,备份数据库
备份成功,文件内容
psql
powershell
-- 查询使用方式
D:\tools\postgresql\bin\psql.exe --help
使用psql恢复数据库
恢复成功
pg_dump
pg_dump 和 psql 支持的读写管道功能使得我们可以直接将数据库从一个服务器导出到另一
个服务器
-Fc
指定自定义格式,这种格式的备份,还原时需要使用PostgreSQL 提供的 pg_restore 工具
-f
指定导出的文件名
-h
数据库连接地址
-U
用户名
-d
数据库名
powershell
"D:\tools\postgresql\bin\pg_dump.exe" -h localhost -U postgres -d cps -f "C:\Users\16837\Desktop\1.dmp" -Fc
输入用户postgres对应的用户密码
备份成功,1.dmp文件内容
pg_store
pg_restore路径 -h数据库连接地址 -U 用户名 -d数据库名 恢复数据库文件地址
powershell
"D:\tools\postgresql\bin\pg_restore.exe" -h localhost -U postgres -d newdb "C:\Users\16837\Desktop\1.dmp"
输入用户postgres对应的用户密码
恢复成功,newdb下的表products被创建
备份整个集群
pg_dump 每次只导出一个数据库,而且它不会导出角色或表空间(属于集群范围)相关的信
息。为此,PostgreSQL 还提供了导出数据库集群的 pg_dumpall 工具。它会针对集群中的每个数
据库调用 pg_dump 来完成导出工作,同时还导出所有数据库公用的全局对象(pg_dump 不保存
这些对象),包括数据库用户和组、表空间以及所有数据库的访问权限等属性
pg_dumpall官网介绍
因为 pg_dumpall 从所有数据库中读取表,所以需要以一个超级用户的身份连接以便生成完
整的导出操作。同样,还原时也需要超级用户特权执行备份的脚本,这样才能增加用户和组以及
创建数据库
powershell
-- pg_dumpall路径 -U用户名 -f备份文件路径
"D:\tools\postgresql\bin\pg_dumpall.exe" -U postgres -f "C:\Users\16837\Desktop\1.sql"
备份成功,文件内容