将PostgreSQL数据库备份到另一台服务器是数据管理和灾备恢复中的常见操作,通常涉及逻辑备份(如pg_dump)或物理备份(如pg_basebackup)两种方式,以下是详细操作步骤及注意事项,确保数据迁移的完整性和安全性。

备份前准备工作
-
源服务器配置
- 确认PostgreSQL服务运行正常,可通过
SELECT pg_is_in_recovery();检查数据库状态(非恢复模式)。 - 创建具有备份权限的用户(如
backup_user),赋予CONNECT、SELECT权限:CREATE USER backup_user WITH PASSWORD 'secure_password'; GRANT CONNECT ON DATABASE your_db TO backup_user; GRANT SELECT ON ALL TABLES IN SCHEMA public TO backup_user;
- 记录源数据库的版本(
pg_version)、表空间路径等信息,确保目标服务器兼容。
- 确认PostgreSQL服务运行正常,可通过
-
目标服务器配置
- 安装与源服务器相同或更高版本的PostgreSQL。
- 创建与源数据库同名的用户和数据库(若使用逻辑备份恢复):
CREATE USER backup_user WITH PASSWORD 'secure_password'; CREATE DATABASE your_db OWNER backup_user;
- 确保目标服务器磁盘空间充足,可通过
df h检查。
备份方式选择与操作
(一)逻辑备份(pg_dump)
适用于中小型数据库或跨版本迁移,备份为SQL脚本或自定义格式文件。
-
执行备份
在源服务器执行以下命令(以自定义格式为例):pg_dump U backup_user F c f /path/to/backup.dump your_db
U:指定用户;F c:自定义格式(压缩率高);f:备份文件路径。
-
传输备份文件
使用scp或rsync将备份文件传输到目标服务器:scp /path/to/backup.dump user@target_server:/path/to/destination/
确保传输过程中文件完整性(可通过
md5sum校验)。
-
恢复数据库
在目标服务器执行:pg_restore U backup_user d your_db /path/to/backup.dump
- 若为SQL格式备份,使用
psql U backup_user d your_db f backup.sql恢复。
- 若为SQL格式备份,使用
(二)物理备份(pg_basebackup)
适用于大型数据库或流复制场景,直接复制数据文件,恢复速度快。
-
执行备份
在源服务器(需开启wal_level=replica)执行:pg_basebackup h localhost U replication_user Ft z P D /path/to/backup
Ft:tar格式;z:压缩;P:显示进度。
-
传输备份文件
将备份目录(含数据文件和WAL日志)打包传输至目标服务器。 -
恢复数据库
- 停止目标服务器PostgreSQL服务:
systemctl stop postgresql。 - 替换数据目录:
mv /var/lib/pgsql/data /var/lib/pgsql/data_old,解压备份文件到/var/lib/pgsql/data。 - 修改
postgresql.conf,确保data_dir、port等配置正确。 - 启动服务:
systemctl start postgresql。
- 停止目标服务器PostgreSQL服务:
备份验证与后续维护
-
验证数据一致性

- 检查表数量、行数是否匹配:
SELECT count(*) FROM information_schema.tables WHERE table_schema = 'public'; SELECT reltuples::bigint FROM pg_class WHERE relname = 'your_table';
- 对比源库和目标库的
pg_dump输出摘要。
- 检查表数量、行数是否匹配:
-
定期备份与自动化
结合cron任务实现定时备份,例如每日凌晨2点执行逻辑备份:0 2 * * * /usr/bin/pg_dump U backup_user F c f /backup/$(date +%Y%m%d).dump your_db
-
备份文件管理
采用备份轮转策略(如保留最近7天的备份),避免磁盘空间耗尽。
常见问题对比
| 问题场景 | 可能原因 | 解决方案 |
|---|---|---|
| 恢复后表权限丢失 | 未授予目标用户对象权限 | 重新执行GRANT语句或使用noowner备份 |
| 物理备份恢复后无法启动 | 数据文件权限或配置文件路径错误 | 检查data_dir权限,确保pg_hba.conf配置正确 |
相关问答FAQs
Q1: 逻辑备份和物理备份如何选择?
A1: 逻辑备份适合中小型数据库(GB级)、跨版本迁移或需要部分恢复的场景;物理备份适合大型数据库(TB级)、高可用架构(如流复制)或快速恢复场景,物理备份速度更快,但要求源库和目标库架构一致。
Q2: 备份过程中如何确保数据一致性?
A2: 对于逻辑备份,pg_dump默认会获取备份时刻的一致性快照;对于物理备份,建议在低峰期执行或结合pg_start_backup()/pg_stop_backup()手动控制WAL日志归档,可通过serializabledeferrable参数确保备份期间无写入冲突。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/304868.html