gpt4 book ai didi

postgresql - Postgres : uncommitted xmin from before xid cutoff needs to be frozen

转载 作者:行者123 更新时间:2023-11-29 13:39:10 27 4
gpt4 key购买 nike

PostgreSQL 9.6。服务器最近从突然断电中恢复过来。

当在 pgadmin 中为表 Current 运行 select 命令时,它显示 invalid page in block 6455316 of relation base/16384/31656。然后我们尝试使用 vacum full "Current" 解决问题。但它显示 ERROR: uncommitted xmin 491792044 from before xid cutoff 492223244 needs to be frozen

如果直接reindex表,显示:

WARNING:  invalid page in block 6455316 of relation base/16384/31656; zeroing out page
WARNING: invalid page in block 6455317 of relation base/16384/31656; zeroing out page
WARNING: invalid page in block 6455318 of relation base/16384/31656; zeroing out page
WARNING: invalid page in block 6455319 of relation base/16384/31656; zeroing out page
WARNING: invalid page in block 6455320 of relation base/16384/31656; zeroing out page
WARNING: invalid page in block 6455321 of relation base/16384/31656; zeroing out page

我搜索了几天,但仍然没有运气。那么我该如何解决这个问题呢?

最佳答案

经过长时间的研究,我们可以针对我们的情况得出以下几点结论:

  • 有不同类型的备份:
    • 导出为纯文本 SQL 查询
    • 使用 pg_dump 转储二进制文件
    • 在磁盘上复制 pg 文件
    • 拍摄整个虚拟机的快照

无论您的策略是什么,如果您在使用您的环境时进行转储,那么您的数据很可能会损坏(在您的备份中)。

在花费太多时间调试我们的备份后,我们发现将磁盘上的文件及时恢复到特定时刻确实涉及到表文件被设置为内部损坏的数据。

在我们的数据库中,大多数事情都在事务中运行。因此,这应该可以防止我们的表中出现损坏或损坏的数据。但是当在硬盘上复制表时,你的表中总是会有“未提交的数据”。当您还原这些表时,这些数据仍未提交,但事务不在您还原的系统上,因此处于不确定状态。

遍历表格出现问题。重新索引表解决了查看数据的问题,但由于某种原因,大部分数据不再在索引中(因此我们的表缩小了大小,丢失了大量数据)。

对于我们的案例,VACUUM (FULL) 没有产生任何有用的结果。

当我们使用另一个备份从(备份类型 3,见上文)恢复时,我们遇到了这个错误:

LOG:  redo starts at 160/1D7E62C8
LOG: invalid record length at 160/1EBFD408: wanted 24, got 0
LOG: redo done at 160/1EBFD398

结果是 postgres 删除了我们的整个数据库。问题是我们硬盘上 postgres 文件夹中的基本文件夹包含数据库,但 pg_wal 文件夹不包含对它的正确引用。所以整体删除。

总结一下所有这些:未提交的数据是因为您在备份数据或服务器突然关闭时处于事务中间而写入的数据。重新索引您的表(或整个表)是您的最佳选择,但只有在先创建还原点后才能执行此类操作。

因此,首先为当前 postgresql 文件夹制作快照或 tar.gz 或 zip 文件。

service postgresql stop
cd /home
tar zcfv pg_backup.tar.gz /var/lib/postgresql/11/
service postgresql start

然后开始执行维护:

REINDEX DATABASE dbname;

如果你想在重建索引后释放死元组:

VACUUM FULL;

如果事情得到解决,那么你就没事了。如果不是,您可以尝试删除该表并从另一个较早的备份中重新导入。可能是明文备份。如果您没有这样的备份,请尝试使用 IDE 或您自己创建的脚本导出表数据,以从数据库中提取尽可能多的数据。然后创建表的结构导出,删除表(其中包含所有未提交的二进制(损坏的)数据),重新创建表并在其上运行导出的 SQL 查询以重新填充它。

关于postgresql - Postgres : uncommitted xmin from before xid cutoff needs to be frozen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57950050/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com