能否通过拷贝base目录原始文件恢复PostgreSQL 9.1数据库
PostgreSQL 9.1 离线数据目录恢复方案
核心结论
不可以仅拷贝/var/lib/postgresql/9.1/main/base目录完成恢复,你需要拷贝整个/var/lib/postgresql/9.1/main/数据目录,同时满足以下前提条件才能成功恢复:
- 目标环境安装的PostgreSQL大版本必须与原实例完全一致,即PostgreSQL 9.1.x 版本,小版本号差异不会影响兼容性,尽可能保持一致即可
- 两台机器的CPU架构必须相同,跨架构(如x86到ARM)直接拷贝数据目录无法正常启动实例
- 若原实例为异常终止(强制断电、进程被强杀)状态,恢复时需要额外修复事务日志才能启动
具体操作步骤
- 目标虚拟机安装好PostgreSQL 9.1版本后,执行
service postgresql stop停止默认运行的数据库服务 - 通过SFTP下载原机器
/var/lib/postgresql/9.1/main/路径下的所有文件与子目录,不可遗漏pg_xlog、pg_clog、global等目录以及postgresql.conf、pg_hba.conf等配置文件 - 备份目标机器默认生成的
/var/lib/postgresql/9.1/main/目录,再将下载的原实例main目录完整上传到相同路径 - 执行以下命令修正数据目录权限,PostgreSQL要求数据目录所有者必须为postgres用户,目录权限不得超过700:
chown -R postgres:postgres /var/lib/postgresql/9.1/main/ chmod 700 /var/lib/postgresql/9.1/main/
- 执行
service postgresql start尝试启动数据库服务 - 若启动失败且日志提示事务日志损坏,执行以下命令修复事务日志后再重新启动:
su - postgres -c "pg_resetxlog -f /var/lib/postgresql/9.1/main/"
后续建议
- 恢复成功后第一时间执行
pg_dump命令全量导出所有数据库的逻辑备份 - 尽快将业务数据迁移到仍在维护的PostgreSQL稳定版本,PostgreSQL 9.1已停止维护多年,存在大量高危安全漏洞,是导致本次入侵的高风险因素
内容的提问来源于stack exchange,提问作者Gérald
相关产品推荐
相关产品推荐

