暂无图片
-Fd导出的文件,如何用pg_restore来整库恢复呢?
我来答
分享
暂无图片 匿名用户
-Fd导出的文件,如何用pg_restore来整库恢复呢?

pg_dump -U postgres --format=d -f dump_test_d osdba



[postgres@gbase8c_3 dump_test_d]$ ll
total 20
-rw-rw-r-- 1 postgres postgres 31 Apr 23 10:47 3470.dat.gz
-rw-rw-r-- 1 postgres postgres 31 Apr 23 10:47 3471.dat.gz
-rw-rw-r-- 1 postgres postgres 25 Apr 23 10:47 3472.dat.gz
-rw-rw-r-- 1 postgres postgres 4164 Apr 23 10:47 toc.dat


[postgres@gbase8c_3 dump_test_d]$ pg_restore -U postgres -d osdba2 --format=d dump_test_d
pg_restore: error: could not open input file "dump_test_d/toc.dat": No such file or directory

从osdba 中-Fd 并行导出的数据,想恢复到osdba2库中

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
手机用户3390

1. 准备工作

  • 备份文件:确保导出的文件是通过 pg_dump -Fc 生成的(例如 backup.dump)。

  • 权限:恢复用户需具有 CREATEDB 权限(若需要重建数据库)。

  • 依赖项:如果备份中不包含角色、表空间等全局对象,需手动预先创建。


2. 恢复整库到新数据库

场景:将备份恢复到 新数据库(例如 new_db),并自动创建该库。

bash

复制

下载

pg_restore \
  --host=localhost \
  --port=5432 \
  --username=postgres \
  --dbname=postgres \     # 在默认数据库下执行恢复操作
  --create \              # 自动创建目标数据库
  --clean \               # 清理旧对象(如果存在)
  --verbose \             # 显示恢复过程
  backup.dump

关键参数说明

  • --create:根据备份中的元数据创建新数据库(数据库名需与备份时一致)。

  • --clean:恢复前删除已有对象(避免冲突)。

  • --dbname=postgres:指定连接到默认数据库执行恢复(因为目标库可能尚未存在)。


3. 恢复整库到现有数据库

场景:覆盖或追加到 已有数据库(例如 existing_db)。

bash

复制

下载

pg_restore \
  --host=localhost \
  --port=5432 \
  --username=postgres \
  --dbname=existing_db \  # 目标数据库名
  --jobs=4 \              # 并行恢复(加快速度)
  --verbose \
  backup.dump

关键参数说明

  • --jobs=N:启用并行恢复(线程数建议与 CPU 核心数匹配)。

  • 注意:若备份与原库有冲突(如重复表),需添加 --clean 先删除旧对象。


4. 处理全局对象(角色、表空间等)

默认情况下,pg_dump 不会备份全局对象(如角色、表空间)。若需恢复这些对象:

步骤 1:单独备份全局对象

bash

复制

下载

pg_dumpall \
  --globals-only \
  --file=globals.sql \
  --username=postgres

步骤 2:先恢复全局对象

bash

复制

下载

psql -U postgres -f globals.sql

步骤 3:再恢复数据库

bash

复制

下载

pg_restore --dbname=existing_db --create --clean backup.dump

5. 常见问题与解决方案

Q1:恢复时报错“数据库已存在”

  • 原因:未使用 --create 或目标库已存在。

  • 解决

    bash

    复制

    下载
    # 手动删除旧库
    psql -U postgres -c "DROP DATABASE IF EXISTS old_db;"
    # 再执行恢复
    pg_restore --dbname=postgres --create backup.dump

Q2:权限不足导致恢复失败

  • 原因:恢复用户缺少 CREATEDB 或对象操作权限。

  • 解决

    sql

    复制

    下载
    -- 赋予权限(以超级用户执行)
    ALTER USER your_user WITH CREATEDB;

Q3:表空间路径不存在

  • 原因:备份中的表空间路径与恢复环境不一致。

  • 解决

    bash

    复制

    下载
    # 恢复前创建表空间目录
    mkdir -p /custom/tablespace/path
    chown postgres:postgres /custom/tablespace/path

6. 完整恢复流程示例

bash

复制

下载

# 1. 恢复全局对象(角色、表空间)
psql -U postgres -f globals.sql

# 2. 创建目标数据库(若未使用 --create)
psql -U postgres -c "CREATE DATABASE new_db;"

# 3. 并行恢复数据
pg_restore \
  --dbname=new_db \
  --jobs=4 \
  --verbose \
  backup.dump

总结

  • 推荐命令

    bash

    复制

    下载
    pg_restore --dbname=postgres --create --clean --verbose backup.dump
  • 关键点

    • 使用 --create 自动建库。

    • 并行恢复(--jobs=N)显著提升速度。

    • 确保全局对象(如角色)预先恢复。

通过以上步骤,可以高效、安全地完成 PostgreSQL 整库恢复。

暂无图片 评论
暂无图片 有用 1
E
Easy+

命令是对的,只是目录错了 , 返回上层目录,再进行restore。

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏