psql (10.12.X.9)
lisdb=# vacuum FREEZE pg_class
lisdb-# ;
ERROR: found xmin 2146512304 from before relfrozenxid 2146512317 有大佬遇见过吗? 重启和删除pg_internal.init 文件都不起作用



可以通过两种方式进行修复
1.重启数据库,重启后会重新读入新数据内容到relcache中,相当于刷新relcache。
2.删除$PGDATA/global/pg_internal.init,这个文件就是存储的relcache的内容,有新的连接连入会创建新的pg_internal.init文件。


一个xmin(最事务ID)比relfrozenid(表的早冻结事务ID)还大的情况在PostgreSQL,当执行VACUUM操作,会将relxid设置为一个比当前活动事务都要小的值。如果VACUUM之前,已经有xmin比frozenxid大的事务存在,就会导致这个错误。


大佬,目前的情况是:
rowa: xmin 100 relforzenid 120 ,
执行vacuum 报错:ERROR: found xmin 100 from before relfrozenxid 120
update 原行后:
rowa: xmin 140 relforzenid 120
执行一次 vacuum 操作,vacuum执行成功
rowa: xmin 140 relforzenid 145
继续执行vacuum 报错。 ERROR: found xmin 140 from before relfrozenxid 145
就是不知道为啥在vacuum 操作后,会将relxid设置为一个比当前活动事务还要大的值? 大佬这个有了解吗?


在处理 PostgreSQL 中出现的 "ERROR: found xmin from before relfrozenxid" 错误时,重启和删除 `pg_internal.init` 文件通常不是解决此类问题的有效方法。这个错误通常意味着数据库中存在一些不一致的事务ID信息,可能需要更深入的排查和处理。以下是一些可能的进一步操作:
1. **手动执行 VACUUM 操作:** 尝试手动对受影响的表执行 VACUUM FULL 命令。这可以强制重新写入整个表并更新 relfrozenxid。但要注意,VACUUM FULL 可能会导致数据库锁定和性能下降,因此在生产环境中谨慎使用。
2. **分析日志文件:** 详细分析 PostgreSQL 的日志文件,查看是否有其他错误、警告或异常情况。这可以提供更多关于问题的线索,并有助于确定更进一步的解决方案。
3. **检查数据库完整性:** 使用 `pg_controldata` 工具检查数据库的一致性和完整性。这可能会提供有关数据库状态的更多信息,并可能提供修复数据库的建议。
4. **备份和恢复:** 如果其他方法都无效,并且数据的一致性和完整性受到严重威胁,可能需要考虑从最近的备份中恢复数据库。这将回滚数据库到备份时的状态,并可以解决潜在的数据一致性问题。
5. **PostgreSQL 社区支持:** 如果您仍然无法解决问题,建议向 PostgreSQL 社区寻求支持。在 PostgreSQL 官方邮件列表或论坛上提出您的问题,可能会得到更多专业的帮助和建议。
在执行任何操作之前,请务必备份数据库,以避免不可逆的损失。因为对数据库进行操作可能会对数据产生影响,尤其是在处理可能影响数据库一致性的问题时,更要谨慎行事。


