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;"  # 查看所有数据库,确认与原集群一致
相关推荐
爱吃KFC的大肥羊2 小时前
Redis持久化详解(一):RDB快照机制深度解析
数据库·redis·缓存
黎明破晓.2 小时前
Redis
数据库·redis·缓存
Dovis(誓平步青云)2 小时前
《MySQL从入门:基础安装与数据库核心概念全解析》
数据库·mysql
Web极客码2 小时前
如何选择最适合的内容管理系统(CMS)?
java·数据库·算法
大道之简2 小时前
PostgreSQL pgvector向量数据库
数据库·postgresql
yfhmmm2 小时前
PostgreSQL如何进行时间点恢复(PITR)
数据库·postgresql
Yusei_05232 小时前
Redis核心特性与应用全解析
开发语言·数据库·c++·redis·缓存
SAP小崔说事儿11 小时前
在数据库中将字符串拆分成表单(SQL和HANA版本)
java·数据库·sql·sap·hana·字符串拆分·无锡sap
川贝枇杷膏cbppg12 小时前
asmcmd
数据库·oracle