暂无图片
-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库中

我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
手机用户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
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
pg中有类似mysql那种解析某个日志中是否有大事务,某个表a的insert,update,delete的次数
回答 2
单表的insert,update,delete次数可以查看pgstatusertables
pg 有什么工具或许办法可以查询历史top sql 吗?
回答 2
已采纳
可以用pgstatstatements插件来查找最耗费资源的SQL(TopSQL)。这个插件可以记录所有执行过的SQL语句,包括执行时间、执行次数、I/O、CPU等等。实现命令:CREATEEXTEN
硬盘空间不够了,有办法让 postgreSQL 库分散到不同的硬盘上吗?
回答 2
创建新的表空间,指向不同的目录,并修改表的表空间为新创建的表空间
pg中如何处理hashjoin的连接条件上的数据不均匀,如何处理?
回答 1
pg中也有直方图的统计信息,可以看下pgstats,pg基于这些信息生成执行计划。
pg中的表锁和行锁,再系统表中,如何区分的?
回答 1
系统视图pglocks系统函数pglockstatus印象中好像没有系统表区分的话你可以看有一个列modepostgresselectlocktype,relname,modefrompglocks,
PG流复制,从库用pg_basebackup -h 主库IP -p 5432 -U rep_user -F p -P -x -R -D /var/lib/postgres/data 进度到4%左右不动?
回答 1
可以打开日志功能分析一下,除了pgbasebackup;可以使用传统的start和stop backup方式。
postgresql copy命令可以把服务器上的table数据保存到客户端的文件中吗?
回答 1
不行。
PG数据库的shared_buffers满了,checkpoint还未发生,这时数据库处于什么状态?
回答 2
这个问题给我看一愣,缓冲池就是给用户用的啊,一直是满的不是应该的吗。如果是想问缓冲池页面的淘汰机制,pg是时钟扫描算法,扫一个页面如果页面状态是被钉住(在使用),如果没有钉住则会将钉值减一,如果一个页
pg中归档日志一天内每小时的归档频率,如何统计
回答 2
ll命令输出的第一行是total0,是一个无关行;这条命令就是打印第二行至最后一行的信息,你也可以使用tailn2来代替。
wal日志存储目录可以修改吗?
回答 1
已采纳
可以,你最好重启参数或者重启实例生效,把之前的也移动过去啊
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~