postgresql - 从 Postgres 数据文件恢复数据

标签 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 - 我在头文件中找不到它)

)。

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

这是环境和情况:

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

操作系统:ubuntu 10.04.04 amd64

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

系统坏了-过了一段时间

AAC: Host Adapter BLINK LED 0x56
AACO: Adapter kernel panic'd 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
最新检查点的oldestXID: 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
数据库 block 大小: 16777216
大关系每段 block 数:131072
WAL block 大小: 8192
每个 WAL 段的字节数: 16777216
标识符的最大长度: 64
索引中的最大列数: 2387576020
TOAST block 的最大大小:0
日期/时间类型存储: float
Float4 参数传递: by reference
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 使用初始数据成功恢复。

最佳答案

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

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

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

如果您查看关系对应的文件大小,它们是 16Mb 还是 8Kb 的倍数? 如果数据库有一些千兆字节的表,磁盘上的截止大小是多少(postgres 将数据分割成几个文件的大小)?这应该等于数据 block 大小*每段大关系的 block 数。在默认安装中,它是 1Gb。

关于postgresql - 从 Postgres 数据文件恢复数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11973567/

相关文章:

javascript - 将 postgresQL 中的时间戳附加到数组时间戳列

php - 为什么 greenplum 的准备速度这么慢?

sql - 使用 NodeJS 应用程序的 Sequelize 函数在 PostgreSQL 中实现两级聚合

ruby-on-rails - 在 Rails 和 PostgreSQL 中完全忽略时区

sql - Postgresql 可序列化事务未按预期工作

postgresql - 创建物化 View 时如何指示列不可为空?

postgresql 持久化数据 : which is better named volume or bind mount

postgresql - 从 alfresco 数据库中选择用户、组和站点

python - 让 Django 忘记一个不正确的 'makemigration'

postgresql - 在运行时从 MySQL++ 转换为 PostgreSQL