postgresql14管理(六)-备份与恢复
定义
备份(backup):通过物理复制或逻辑导出的方式,将数据库的文件或结构和数据拷贝到其他位置进行存储;
还原(restore):是一种不完全的恢复。使用备份文件将数据库恢复到备份时的状态,该时间点之后的数据变更无法恢复;
恢复(recovery):先做还原,然后使用处于备份时间点至故障点产生的日志文件(WAL),将数据库恢复到最新状态;
分类
物理备份(Physical Backup):直接复制数据库相关的文件,一般情况,物理备份比逻辑备份快,占用的空间也更大。PostgreSQL支持在线、离线的物理备份,实际环境中应该以物理备份为主。
逻辑备份(Logical Backup):将数据库的结构和数据导出为sql文件,还原时通过文件中的SQL语句和命令重建数据库并恢复数据。逻辑备份通常需要更多的备份时间、还原时间。逻辑备份可以作为物理备份的补充,或者用于测试目的的数据导入导出。
方式
在线备份(Online Backup)、热备份(Hot Backup):pg处于启动状态时的备份;
离线备份(Offline Backup)、冷备份(Cold Backup):pg处于关闭状态时的备份;
方法
全量备份(Full Backup):一次备份所有,备份时间长,恢复时间短;
增量备份(Incremental Backup):备份与上一次改变的文件,备份时间短,恢复时间长;
差异备份(Differential Backup):针对第一次完全备份后发生变化的所有文件进行备份,备份、恢复时间居中;
pg通过一个基准备份(Base Backup),加上不断备份的事务日志文件(WAL),做到增量备份的效果。
工具
pg_dump:逻辑备份工具,支持单个数据库(可以指定模式、表)的导出,可以选择导出的格式;
pg_dumpall:逻辑备份工具,用于导出整个数据库集群,包括公用的全局对象;
pg_basebackup:物理备份工具,为数据库集群创建一个基准备份。或者设置基于日志传输或流复制的从节点的初始化;
psql:交互式命令行工具,也可以用于导入逻辑备份产生的 SQL 文件;
pg_restore:逻辑还原工具,用于还原 pg_dump 导出的归档格式的备份文件;
COPY:专有sql语句,将表中的数据复制到文件,或者将文件中的数据复制到表中;
第三方开源:pgAdmin、Barman、pg_probackup、pgBackRest
逻辑备份与恢复
#plain格式:转储一个可读的脚本
pg_dump -U postgres -d hrdb -f "D:\bak\hrdb.sql"
#导入
pgsql -U postgres newdb -f "D:\bak\hrdb.sql"
#-Fc 自定义格式,不可直接查看
pg_dump -U postgres -d hrdb -f "D:\bak\hrdb.dmp" -Fc
#恢复
pg_restore -U postgres -d hrdb "D:\bak\hrdb.dmp"
备份整个pg
#连接每个数据库都要输入密码,可用密码选项代替
pg_dumpall -U postgres -f "D:\bak\cluster.sql"
#复原
psql -f "D:\bak\cluster.sql" postgres
导出表数据
-- -a表示只导出数据(不包含结构),-t指定要导出的表,-T表示排除的表
pg_dump -a -t 'emp*' -T employees testdb > testdb_table
-- 导出时也可以指定其他的导出格式,并且采用相应的方式进行数据导入
#连接对应数据库
\c hrdb
#COPY支持不同的写入/读取文件格式:text、csv 或者 binary。默认是 text。
COPY employees TO "D:\bak\cluster.txt" (format csv, header true)
#改为csv格式,包含表头
#复制导出数据到新表
COPY newemployees FROM "D:\bak\cluster.txt" (format csv, header true)
备份大型数据库
#先转储再压缩
pg_dumpall | gzip > cluster.sql.gz
#先解压再导入
gunzip -c cluster.sql.gz | psql new
#分割导出文件为clusteraa、clusterab
pg_dumpall | split -b 1G - cluster
#恢复
cat cluster* | psql newdb
COPY products to PROGRAM 'gzip > /bak/products.dat.gz'
COPY products FROM PROGRAM 'gunzip < /bak/products.dat.gz'
#并发备份
pg_dump -j 8 -F d -f out.dir testdb
#还原
pg_restore -j 8 -d newdb testdb_dir