从Postgres数据文件恢复数据

时间:2012-08-15 16:51:49

标签: postgresql

系统崩溃了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 - 我在头文件中找不到它)

)。

以任何方式提取数据?

这是环境和环境:

harddrive: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服务器中使用DB(硬盘 - 简单串行2,Ubuntu 10.04 i386,Postgres 9.1)并获得相同的异常(使用BLCKSZ)。

这就是为什么我在虚拟机中部署了Ubuntu 10.04 amd64和英文Postgres 9.1(因为在前一步中错误日志中有''而不是俄语符号) 得到了相同的例外(使用BLCKSZ)。

Ather已经删除了apt-get postgres版本并按照文档http://www.postgresql.org/docs/9.1/static/installation.html中的描述进行了编译。 玩configure --with-blocksize=BLOCKSIZE没有任何效果 - 得到相同的错误

对不起,帖子。

pg_contol被一些操纵打破了。

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

2 个答案:

答案 0 :(得分:0)

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

Here详细介绍了BLCKSZ参数的含义和背景。运行64位构建的PostgreSQL失败的系统和新系统是32位构建吗?如果可能的话,尝试获取失败系统PostgreSQL的版本信息可以解决问题。让我们知道使用的版本,构建和操作系统。是自定义构建吗?

答案 1 :(得分: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。