【问题标题】:pg_restore old database backuppg_restore 旧数据库备份
【发布时间】:2018-09-06 17:26:47
【问题描述】:

在 Ubuntu 16.04 上运行 9.5 不确定备份了什么数据库,我认为是 8.4

当我运行 pg_restore 时,我得到了

pg_restore: implied data-only restore
--
-- PostgreSQL database dump
--


-- Started on 30608-10-13 11:53:01 MDT

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'SQL_ASCII';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;
SET row_security = off;

-- Completed on 2018-09-06 11:12:06 MDT

--
-- PostgreSQL database dump complete
--

当我运行pg_restore -l

;
; Archive created at 30608-10-13 11:53:01 MDT
;     dbname: 
;     TOC Entries: -1835365408
;     Compression: -1
;     Dump Version: 1.11-0
;     Format: CUSTOM
;     Integer: 4 bytes
;     Offset: 8 bytes
;
;
; Selected TOC Entries:
;

显然存在时间戳问题,并且显然 TOC 条目和压缩已关闭。

不知道从这里去哪里。文件大小表明它应该是完整的备份。我有多个来自同一时间段的备份,当我尝试恢复它们时,它们的报告都相似。

有没有办法解压缩文件的数据部分。我可以十六进制编辑并查看架构,但数据是 postgres 的二进制压缩 (-Fc) 格式。我只需要查找并验证一些条目,因此如果有手动检查和搜索的方法,那将是可行的。

感谢任何帮助。

【问题讨论】:

    标签: postgresql pg-restore


    【解决方案1】:

    是的,您可以使用-f 参数提取它:

    pg_restore -f /path/to/target/file /path/from/source/dump
    

    更多信息here

    【讨论】:

    • 这只是将第一个块输出到文件中而不是标准输出...
    • 您的文件似乎已损坏。我上面显示的命令将提取整个文件,而不仅仅是第一个块。您可以尝试回显 pg_restore 返回的代码以检查它是否与意外的 eof 有关:echo $?
    【解决方案2】:

    我在您粘贴的输出中看不到时间戳问题,或者我遗漏了一些东西。

    不过,一般来说,如果您只想恢复少数记录,您可能想尝试-L of pg_restore 以便重新排序和恢复。

    例如,

    pg_restore -l dbdump > dblist

    编辑dblist 文件(通过将它们注释掉或只保留您要恢复的那些项目)

    pg_restore -L dblist dbdump

    pg_restore -d newdb dbdump

    【讨论】:

    • 问题中的第二个条目是它的输出。至于时间戳,存档的创建日期似乎很可疑。
    • 啊,好的。抱歉没有注意到。在从 v8.x 恢复到 v9.x 时,您可能会影响 github.com/postgres/postgres/commit/…。尝试在同一版本上进行还原和测试可能会有所帮助,但您可能已经尝试过。否则,您必须将其视为损坏的文件。
    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2018-12-01
    • 2021-12-08
    • 2020-09-04
    相关资源
    最近更新 更多