【问题标题】:Restore data from Postgres data files从 Postgres 数据文件中恢复数据
【发布时间】:2018-02-13 16:58:15
【问题描述】:

系统的 Postgres 损坏(原因是 RAID),没有任何备份。

尝试使用 Postgres 将数据放入另一台计算机(并进行备份)。

但是当我设置数据目录并运行 postgres 时,我总是收到消息

GET FATAL:  database files are incompatible with server
2012-08-15 19:58:38 GET DETAIL:  The database cluster was initialized with BLCKSZ 16777216, but the server was compiled with BLCKSZ 8192.
2012-08-15 19:58:38 GET HINT:  It looks like you need to recompile or initdb.

这是非常奇怪的数字 16777216(2 到 24 次方 - 到大)。

但是编译时我无法重置默认值 8192(使用 --with-blocksize= 无效;BLCKSZ - 我在头文件中找不到它)

)。

有什么方法可以提取数据?

这是环境和情况:

硬盘:RAID 1,阵列中有 3 个 SAS 磁盘

操作系统:ubuntu 10.04.04 amd64

Postgres:9.1(通过 apt-get(我们将存储库链接更改为更高版本的 Ubuntu))

系统坏了 - 一段时间后

AAC:主机适配器闪烁 LED 0x56
AACO:适配器内核崩溃 56

(文件系统或硬件错误)

不知何故,我们得到了数据目录。 pg_conroldata 显示:

pg_control 版本号:            903
目录版本号:                201105231
数据库系统标识符:            5714530593695276911
数据库集群状态:               关闭
pg_control 最后修改时间:              2012 年 8 月 15 日星期二 11:50:50
最新检查站位置:           1B595668/2000020
前检查点位置:              0/0
最新检查点的 REDO 位置:1B595668/2000020
最新检查点的 TimeLineID:      1
最新检查点的 NextXID:           0/4057946
最新检查点的 NextOID:         40960
最新检查点的 NextMultiXactId:1
最新检查点的 NextMultiOffset: 0
最新检查点最旧的 XID:        670
最新检查点最旧 XID 的 DB:1344846103
最新检查点的最旧ActiveXID:0
最新检查点时间:                 2012 年 8 月 15 日星期二 11:50:50
最小恢复结束位置:  0/0
备份开始位置:                  0/0
当前的 wal_level 设置:              最小
当前 max_connections 设置:100
当前 max_prepared_xacts 设置:0
当前 max_locks_per_xact 设置:64
最大数据对齐:            8
数据库块大小:                   16777216
大关系每段的块数:131072
WAL 块大小:                       8192
每个 WAL 段的字节数:            16777216
标识符的最大长度:         64
索引中的最大列数:      2387576020
TOAST 块的最大大小:0
日期/时间类型存储:                   浮点数
Float4 参数传递:            通过引用
Float8 参数传递:               通过引用

首先,我努力在 Ubuntu 服务器(硬盘 - 简单串行 2、Ubuntu 10.04 i386、Postgres 9.1)中升级 DB,并在上面遇到相同的异常(使用 BLCKSZ)。

这就是为什么我在虚拟机中部署带有英文 Postgres 9.1 的 Ubuntu 10.04 amd64(因为在上一步的错误日志中得到了 '?' 而不是俄罗斯符号) 遇到了同样的异常(使用 BLCKSZ)。

Ather 已删除 apt-get postgres 版本并按照文档http://www.postgresql.org/docs/9.1/static/installation.html 中的说明对其进行编译。 玩configure --with-blocksize=BLOCKSIZE 无效 - 得到同样的错误

抱歉,发帖了。

pg_contol 被一些操作破坏了。

Sow,pg_resetxlog 用初始数据成功恢复了集群。

【问题讨论】:

  • 在这种情况下,“将数据放入另一台计算机”究竟是什么意思?

标签: postgresql


【解决方案1】:

16Mb 的块大小真的很奇怪,因为这两个值看起来也完全是假的:

Maximum columns in an index:       2387576020
Maximum size of a TOAST chunk:     0

...在花时间编译具有非标准块大小的 postgres 之前,您可能想质疑这些数据的完整性。

如果查看关系对应的文件大小,它们是 16Mb 还是 8Kb 的倍数? 如果数据库有一些千兆字节的表,那么磁盘上的截断大小(postgres 将数据分成几个文件的大小)似乎是多少?这应该等于data block size*Blocks per segment of large relation。默认安装时为 1Gb。

【讨论】:

  • 你说得对!数据设置看起来像默认值! - 播种 pg_control 被破坏。我通过复制(pg_control)得到工作集群。但是列表中只有一个数据库,并且那里只有函数和自定义类型可用。有什么办法解决,还是应该是另一个问题?
【解决方案2】:

有关配置内核资源的详细信息,请参阅here。也许这个新操作系统的默认/当前设置不允许 postmaster 启动。

Here 详细介绍了 BLCKSZ 参数的含义和上下文。运行 64 位版本的 PostgreSQL 失败的系统是 32 位版本吗?如果可能,尝试获取有关故障系统的 PostgreSQL 的版本信息可以阐明问题。让我们知道使用的版本、构建和操作系统。是自定义构建吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    相关资源
    最近更新 更多