1

得到了 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:主机适配器 BLINK 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 的数据库: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 成功恢复,并带有初始数据。

4

2 回答 2

0

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

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

于 2012-08-15T20:33:28.470 回答
0

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。

于 2012-08-17T00:24:07.833 回答