目录
[一、使用 pg_dump 工具(逻辑备份)](#一、使用 pg_dump 工具(逻辑备份))
[(1)导出为 SQL 文本格式(跨版本兼容,可读性强)](#(1)导出为 SQL 文本格式(跨版本兼容,可读性强))
(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)配置 postgresql.conf](#(1)配置 postgresql.conf)
[(2)配置 pg_hba.conf](#(2)配置 pg_hba.conf)
[a.纯文本格式(-F p)还原](#a.纯文本格式(-F p)还原)
[b.tar包格式(-F t)还原](#b.tar包格式(-F t)还原)
一、使用 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;" # 查看所有数据库,确认与原集群一致