PostgreSQL 完全备份与还原

目录

[一、使用 pg_dump 工具(逻辑备份)](#一、使用 pg_dump 工具(逻辑备份))

1.数据备份

[(1)导出为 SQL 文本格式(跨版本兼容,可读性强)](#(1)导出为 SQL 文本格式(跨版本兼容,可读性强))

(2)导出为自定义格式(压缩率高,还原速度快,支持增量恢复基础)

(3)整库集群备份

2.数据还原

[(1)SQL 文本格式备份的还原(psql 命令)](#(1)SQL 文本格式备份的还原(psql 命令))

[(2)自定义格式备份的还原(pg_restore 命令,推荐)](#(2)自定义格式备份的还原(pg_restore 命令,推荐))

[(3)整库集群备份(pg_dumpall 生成的 SQL)还原](#(3)整库集群备份(pg_dumpall 生成的 SQL)还原)

[二、使用 pg_basebackup 工具(物理备份)](#二、使用 pg_basebackup 工具(物理备份))

1.使用前准备(关键配置)

[(1)配置 postgresql.conf](#(1)配置 postgresql.conf)

[(2)配置 pg_hba.conf](#(2)配置 pg_hba.conf)

(3)创建备份用户(需超级权限)

(4)重启数据库服务

2.备份命令

(1)本地备份

(2)远程备份(常用)

(3)备份为压缩格式(节省存储空间)

3.备份还原(完整集群恢复)

(1)还原前置条件

(2)分格式还原

[a.纯文本格式(-F p)还原](#a.纯文本格式(-F p)还原)

[b.tar包格式(-F t)还原](#b.tar包格式(-F t)还原)

c.配置恢复参数(可选,用于完整恢复)

(3)启动数据库服务并验证


一、使用 pg_dump 工具(逻辑备份)

1.数据备份

(1)导出为 SQL 文本格式(跨版本兼容,可读性强)

bash 复制代码
# 基本语法:pg_dump [连接参数] [数据库名] > 备份文件.sql
pg_dump -h 127.0.0.1 -p 5432 -U postgres -d mydb > mydb_full_backup_$(date +%Y%m%d).sql

(2)导出为自定义格式(压缩率高,还原速度快,支持增量恢复基础)

bash 复制代码
# 基本语法:pg_dump [连接参数] -F c -b -v -f 备份文件.dump 数据库名
pg_dump -h 127.0.0.1 -p 5432 -U postgres -d mydb -F c -b -v -f mydb_full_backup_$(date +%Y%m%d).dump

参数说明:

|-----------------|--------------------------------------------|
| 参数 | 含义 |
| -h | 数据库服务器地址(本地可省略,远程需指定 IP / 域名) |
| -p | 数据库端口(默认 5432,可省略) |
| -U | 连接数据库的用户名(需具备目标数据库的读取权限,通常用 postgres 超级用户) |
| -d | 要备份的目标数据库名 |
| -F c | 指定备份格式为自定义格式(推荐,后缀常用 .dump/.backup) |
| -b | 包含大对象(large objects)备份 |
| -v | 显示备份详细过程(冗余模式,便于排查问题) |
| -f | 指定备份文件输出路径(替代重定向符号 >,更推荐用于非文本格式) |
| $(date +%Y%m%d) | 自动拼接日期后缀,避免备份文件覆盖 |

(3)整库集群备份

bash 复制代码
pg_dumpall -h 127.0.0.1 -p 5432 -U postgres > pg_cluster_full_backup_$(date +%Y%m%d).sql

2.数据还原

(1)SQL 文本格式备份的还原(psql 命令)

bash 复制代码
# 语法1:直接执行SQL备份文件
psql -h 127.0.0.1 -p 5432 -U postgres -d mydb < mydb_full_backup_20251221.sql

# 语法2:如果目标数据库不存在,先创建数据库再还原
# 1. 创建空数据库(需超级用户权限)
createdb -h 127.0.0.1 -p 5432 -U postgres -O myuser mydb  # -O 指定数据库所有者
# 2. 还原数据
psql -h 127.0.0.1 -p 5432 -U postgres -d mydb < mydb_full_backup_20251221.sql

注意:
1.还原前需确保目标数据库已存在(空数据库),否则可能出现表重复等错误
2.如果备份文件包含创建数据库语句,可直接执行 psql -U postgres -f 备份文件.sql

(2)自定义格式备份的还原(pg_restore 命令,推荐)

bash 复制代码
# 方式1:先创建空数据库,再还原
createdb -h 127.0.0.1 -p 5432 -U postgres mydb
pg_restore -h 127.0.0.1 -p 5432 -U postgres -d mydb -v mydb_full_backup_20251221.dump

# 方式2:直接在还原时创建数据库(需超级用户权限)
pg_restore -h 127.0.0.1 -p 5432 -U postgres -C -d postgres -v mydb_full_backup_20251221.dump

(3)整库集群备份(pg_dumpall 生成的 SQL)还原

bash 复制代码
psql -h 127.0.0.1 -p 5432 -U postgres -f pg_cluster_full_backup_20251221.sql

二、使用 pg_basebackup 工具(物理备份)

1.使用前准备(关键配置)

(1)配置 postgresql.conf

编辑数据库配置文件(默认路径:$PGDATA/postgresql.conf),修改以下参数:

bash 复制代码
# 启用WAL归档(可选,用于完整恢复)
wal_level = replica  # 或 hot_standby(PostgreSQL 10+ 推荐 replica)
archive_mode = on
archive_command = 'cp %p /path/to/archive/%f'  # %p 为WAL文件路径,%f 为文件名

# 允许流复制连接
max_wal_senders = 10  # 最大WAL发送进程数,至少大于1
wal_keep_size = 1GB   # 保留的WAL文件大小,避免备份过程中WAL文件被清理

# 监听地址(远程备份需配置,本地可设为 localhost)
listen_addresses = '*'  # 允许所有地址连接

(2)配置 pg_hba.conf

编辑访问控制文件(默认路径:$PGDATA/pg_hba.conf),添加备份用户的连接权限:

bash 复制代码
# 允许备份用户(如 repl)从任意地址以md5密码认证连接(流复制类型)
host    replication     repl            0.0.0.0/0               md5
# 本地备份可简化为
local   replication     repl            peer

(3)创建备份用户(需超级权限)

登录 PostgreSQL 终端,创建用于备份的用户(推荐专门的复制用户)

bash 复制代码
-- 创建用户 repl,密码为 Repl@123
CREATE ROLE repl WITH REPLICATION LOGIN PASSWORD 'Repl@123';

(4)重启数据库服务

bash 复制代码
# 系统d管理(主流Linux发行版)
systemctl restart postgresql-15  # 版本根据实际情况调整(如 postgresql-14)

# 非系统d管理
pg_ctl restart -D $PGDATA

2.备份命令

(1)本地备份

bash 复制代码
# 语法:pg_basebackup [参数] -D 备份目录
pg_basebackup -U repl -D /path/to/backup_dir -F p -X s -v -P

(2)远程备份(常用)

bash 复制代码
# 语法:pg_basebackup -h 远程IP -p 端口 -U 备份用户 -D 备份目录 [其他参数]
pg_basebackup -h 192.168.1.100 -p 5432 -U repl -D /local/backup/pg_cluster_20251221 -F p -X s -v -P

(3)备份为压缩格式(节省存储空间)

bash 复制代码
# 方式1:直接压缩为tar包
pg_basebackup -h 192.168.1.100 -p 5432 -U repl -D - -F t -X s -v | gzip > pg_cluster_20251221.tar.gz

# 方式2:备份后手动压缩(适合大集群)
pg_basebackup -h 192.168.1.100 -p 5432 -U repl -D /tmp/pg_backup -F p -X s -v
tar -zcvf pg_cluster_20251221.tar.gz /tmp/pg_backup

参数说明:

|-------------|---------------------------------------------------------------------------------------------------|
| 参数 | 含义 |
| -U | 指定备份用户(需具备 replication 权限,如前面创建的 repl) |
| -D/--pgdata | 指定备份输出目录(本地备份)或 -(表示输出到标准输出,用于压缩) |
| -h | 远程数据库服务器 IP / 域名(本地备份可省略) |
| -p | 数据库端口(默认 5432,可省略) |
| -F | 指定备份格式: p(默认):纯文本格式,直接生成与原集群结构一致的目录和文件(便于直接还原 / 搭建从库) t:tar 包格式,将备份文件打包为单个 tar 文件(便于传输和存储) |
| -X | WAL 文件获取方式(保证备份一致性): s(推荐):备份过程中通过流复制实时获取 WAL 文件,无需等待归档 f:备份结束后从归档目录获取所需 WAL 文件(需配置 archive_mode) |
| -v | 冗余模式,显示备份详细过程(便于排查问题) |
| -P | 显示备份进度(百分比),直观查看备份状态 |
| -C | 自动生成复制配置文件(recovery.conf/postgresql.auto.conf),便于直接搭建从库 |
| -R | 等同于 -C,PostgreSQL 12+ 推荐使用 -R,自动生成流复制所需配置 |
| -T | 表空间映射(可选),用于将备份中的表空间映射到新路径(适合表空间迁移场景) |

3.备份还原(完整集群恢复)

(1)还原前置条件

bash 复制代码
# 停止目标服务器的 PostgreSQL 服务
pg_ctl stop

# 清空目标服务器的原有数据目录(默认路径:/var/lib/pgsql/15/data,需根据实际版本调整)
rm -rf /var/lib/pgsql/15/data/*

(2)分格式还原

a.纯文本格式(-F p)还原

直接将备份目录下的所有文件复制到目标数据目录:

bash 复制代码
# 复制备份文件到目标数据目录
cp -r /path/to/backup_dir/* /var/lib/pgsql/15/data/

# 修改数据目录权限(必须改为 postgres 用户和组,否则数据库无法启动)
chown -R postgres:postgres /var/lib/pgsql/15/data/
chmod 700 /var/lib/pgsql/15/data/
b.tar包格式(-F t)还原

先解压 tar 包,再复制到目标数据目录:

bash 复制代码
# 解压tar包
tar -zxvf pg_cluster_20251221.tar.gz -C /tmp/

# 复制解压后的文件到目标数据目录
cp -r /tmp/backup_dir/* /var/lib/pgsql/15/data/

# 修改权限
chown -R postgres:postgres /var/lib/pgsql/15/data/
chmod 700 /var/lib/pgsql/15/data/
c.配置恢复参数(可选,用于完整恢复)

如果需要恢复到备份后的某个时间点,需在目标数据目录下创建 recovery.conf(PostgreSQL 12+ 改为在 postgresql.auto.conf 中配置):

bash 复制代码
# PostgreSQL 11及以下:recovery.conf
restore_command = 'cp /path/to/archive/%f %p'  # 从WAL归档目录获取日志文件
recovery_target_time = '2025-12-21 10:00:00'  # 恢复到指定时间点(可选)
recovery_target = 'immediate'  # 直接恢复到备份完成时(默认)

# PostgreSQL 12+:postgresql.auto.conf
primary_conninfo = 'host=192.168.1.100 port=5432 user=repl password=Repl@123'  # 流复制配置(搭建从库用)
restore_command = 'cp /path/to/archive/%f %p'
recovery_target_time = '2025-12-21 10:00:00'

(3)启动数据库服务并验证

bash 复制代码
# 启动服务
pg_ctl start

# 验证还原结果(登录数据库查看集群状态)
su - postgres
psql -c "SELECT datname FROM pg_database;"  # 查看所有数据库,确认与原集群一致
相关推荐
小陈工3 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花8 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸8 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain8 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希8 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神8 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员9 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java9 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿9 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴9 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存