如何从.sql脚本恢复PostgreSQL 15整个数据库集群
PostgreSQL 15 全量集群恢复步骤
因为你的备份是整个数据库集群的dump(由pg_dumpall生成),包含所有角色、数据库及数据,直接导入会因现有对象冲突报错,需按以下流程彻底清空集群后恢复:
1. 停止PostgreSQL服务
根据你的操作系统执行对应命令(root权限下):
- Ubuntu/Debian:
systemctl stop postgresql - CentOS/RHEL:
systemctl stop postgresql-15
2. 备份现有配置文件(可选但推荐)
避免重新初始化后重复配置postgresql.conf、pg_hba.conf等文件,先备份到临时目录:
# 以Ubuntu默认数据目录为例,CentOS对应目录为/var/lib/pgsql/15/data cp /var/lib/postgresql/15/main/{postgresql.conf,pg_hba.conf} /tmp/
3. 彻底清空现有集群数据
这一步会删除所有现有数据库、角色,不可逆,请确认备份有效后执行:
# 删除旧数据目录下所有内容 rm -rf /var/lib/postgresql/15/main/* # 重新初始化集群(需切换到postgres用户执行) su - postgres -c "initdb -D /var/lib/postgresql/15/main"
4. 恢复配置文件(若已备份)
将之前备份的配置文件拷回,并修正权限:
cp /tmp/{postgresql.conf,pg_hba.conf} /var/lib/postgresql/15/main/ chown postgres:postgres /var/lib/postgresql/15/main/{postgresql.conf,pg_hba.conf}
5. 启动PostgreSQL服务
# Ubuntu/Debian systemctl start postgresql # CentOS/RHEL systemctl start postgresql-15
6. 导入集群备份
使用postgres超级用户执行导入(备份包含角色创建,需超级权限):
su - postgres -c "psql -f /path/to/your/backup.sql postgres"
- 这里连接默认的
postgres系统库即可,备份脚本会自动创建所有其他数据库、角色并导入数据。
针对你问题的补充说明
- 是否需要先删除所有对象? 是的,集群级备份包含完整的角色、数据库定义,必须清空现有集群才能避免对象冲突,重新初始化是最彻底、不易遗漏的方式。
- 删除所有用户后如何执行psql? 重新初始化集群后,默认的
postgres超级用户会自动存在,你可以通过root权限切换到postgres用户执行psql命令(如上述步骤中的su - postgres)。 - 若不想重新初始化集群,手动删除所有数据库和角色操作繁琐且容易遗漏依赖,不推荐。
内容的提问来源于stack exchange,提问作者Graf123456
相关产品推荐
相关产品推荐

