PostgreSQL的备份与恢复

PostgreSQL的备份与恢复

一、备份工具概览

PostgreSQL 提供两套核心逻辑备份命令行工具:

  1. pg_dump:备份单个指定数据库,支持精确到表、Schema 粒度备份;
  2. pg_dumpall :一次性备份实例内所有 数据库,同时导出角色、表空间等系统全局数据。

二、密码处理方案

pg_dump、pg_dumpall 都不支持在命令行直接携带登录密码,自动化定时备份推荐两种免密方案:

  1. 在postgres操作系统用户家目录创建 .pgpass 密码文件存储账号密码;
  2. 通过环境变量PGPASSWORD 临时配置密码。

三、日常备份工具选型建议

每日定时备份优先选用 pg_dump,不推荐每日执行 pg_dumpall:

  1. pg_dump 支持精细化筛选:指定数据库、指定Schema、指定表;
  2. pg_dumpall 无细粒度筛选能力,仅能全实例导出。

四、pg_dump 四种备份格式

格式类型 参数标识 功能说明
SQL文本格式 -F p 纯可读SQL,可导入低版本PostgreSQL、其他兼容SQL数据库
自定义压缩格式 -F c 压缩率高,支持并行恢复(PostgreSQL 8.4及以上)
TAR包格式 -F t 标准tar归档文件,支持并行恢复(PostgreSQL 8.4及以上)
目录格式 -F d 拆分多文件存储,解决单文件超出操作系统大小限制问题,支持并行备份/恢复

补充:自定义压缩 、TAR格式备份文件,恢复时均可开启并行恢复提升速度。

五、pg_dumpall 使用限制

  1. 仅支持导出纯SQL文本,不支持压缩包、目录等其他格式;
  2. 可同步导出全库表结构、业务数据、角色、表空间等全局对象;
  3. 完整全实例SQL备份体积大,恢复耗时严重,不适合每日执行。

六、pg_dump 实操命令示例

统一连接参数:本地地址127.0.0.1,端口5432,登录用户postgres

  1. 单库自定义压缩备份

pg_dump -h 127.0.0.1 -p 5432 -U postgres -F c -b -v -f test.backup test

2. 导出SQL文本并自带建库语句

pg_dump -h 127.0.0.1 -p 5432 -U postgres -C -F p -b -v -f test.sql test

3. 仅备份名称以pay开头的全部表

pg_dump -h 127.0.0.1 -p 5432 -U postgres -F c -b -v -t '*.pay*' -f pay.backup test

4. 备份hr、payroll两个Schema

pg_dump -h 127.0.0.1 -p 5432 -U postgres -F c -b -v -n hr -n payroll -f hr.backup mydb

5. 排除public Schema,备份其余所有数据

pg_dump -h 127.0.0.1 -p 5432 -U postgres -F c -b -v -N public -f all_sch_except_pub.backup mydb

6. 生成带字段名标准INSERT语句(跨库/低版本迁移专用)

pg_dump -h 127.0.0.1 -p 5432 -U postgres -F p --column-inserts -f select_tables.backup mydb

7. 基础目录格式备份

pg_dump -h 127.0.0.1 -p 5432 -U postgres -F d -f /somepath/a_directory mydb

8. 多线程并行目录备份(-j 指定并发数)

pg_dump -h 127.0.0.1 -p 5432 -U postgres -j 3 -Fd -f /somepath/a_directory mydb

七、pg_dumpall 全局对象备份命令

使用规范

  1. 每日执行:仅备份角色、表空间等全局配置;
  2. 每月执行:完整全实例备份(仅SQL格式,恢复效率低,不建议高频)。
  1. 备份角色+表空间全部全局对象

pg_dumpall -h localhost -U postgres --port=5432 -f myglobals.sql --globals-only

2. 仅备份账号角色,不包含表空间

pg_dumpall -h localhost -U postgres --port=5432 -f myglobals.sql --roles-only

八、恢复工具对应关系

备份文件类型 配套恢复工具
pg_dump / pg_dumpall 导出的.sql文本 psql
pg_dump导出c压缩/tar/目录格式备份 pg_restore

九、psql 恢复SQL文本备份操作

1. 导入SQL,忽略执行过程报错

psql -U postgres -f myglobals.sql

2. 导入SQL,出现错误立即终止恢复(生产环境推荐)

psql -U postgres --set ON_ERROR_STOP=on -f myglobals.sql

  1. 指定目标数据库导入SQL文件

psql -U postgres -d mydb -f select_objects.sql

十、pg_restore 恢复二进制备份文件

1. 手动创建数据库后并行恢复

create database mydb;

pg_restore --dbname=mydb --jobs=4 --verbose mydb.backup

2. 自动创建目标数据库(无需提前建库)

pg_restore --dbname=postgres --create --jobs=4 --verbose mydb.backup

3. 仅恢复表结构、索引、约束,不导入业务数据

create database mydb2;

pg_restore --dbname=mydb2 --section=pre-data --jobs=4 mydb.backup

附录:pg_dump 核心参数速查表

参数 参数含义
-h 指定数据库服务主机地址
-p 指定数据库端口
-U 指定数据库登录用户
-F 设置备份输出格式:c自定义压缩/tTAR/p纯SQL/d目录
-b 备份包含大对象Blob数据
-v 开启详细日志输出
-f 指定备份文件/目录输出路径
-C SQL备份中生成CREATE DATABASE建库语句
-t 仅备份匹配名称的表,支持通配符
-n 仅备份指定Schema,可多次使用
-N 排除指定Schema,可多次使用
--column-inserts 生成带字段列表的标准INSERT语句
-j 设置并行备份/恢复线程数
相关推荐
这个DBA有点耶2 小时前
从 MySQL 到时序数据库:我帮朋友做迁移的完整记录
数据库·架构·dba
泡海椒2 小时前
深度解析JQuick-SQL AST到逻辑计划转换机制|分布式SQL原理
数据库·分布式·sql
心静财富之门2 小时前
Python 数据共享四种方案完整实例(同进程 / JSON / Redis / HTTP)
数据库·python·oracle
略略略咯咯2 小时前
啊啊啊啊啊
java·服务器·数据库
奇牙coding2 小时前
GPT-5.5 报 401 invalid_api_key 怎么办?换密钥前按 4 层排查请求头、项目权限和端点
数据库·gpt·ios·ai
IvorySQL2 小时前
PostgreSQL 日报| WAL summarizer 断言失败(10 月 26 日)
数据库·postgresql·区块链
这个DBA有点耶3 小时前
2026年国产数据库“实际用户增长最快”核验指南:口径优先级、可查数据与选型动作清单
数据库·mysql·架构
程序员塔塔喵3 小时前
【MySQL篇|第三篇】脏读,幻读,不可重复读
数据库·mysql·不可重复读·幻读·脏读
数据库小学妹4 小时前
OLAP数据库怎么选、怎么优化?路线、提速与边界
运维·数据库·后端