Firebird事务计数超出

cee*_*enk 10 firebird

我们有一个运行Firebird数据库的实现,我们收到此错误:

" 实施限制超出 - 超出事务计数.执行备份和还原以使数据库再次可操作. "

我们知道如何通过使数据库只读,执行备份和恢复以及再次读写来解决这个问题,但是我们不太确定导致这种情况的原因.我觉得这些交易限于十亿(?).

任何人都可以证实吗?什么是防止这种情况的正确方法?

Mar*_*eel 14

Firebird具有单调递增的事务计数器,其形式为带符号的32位整数(对于2.5及更早版本).因此交易数量限制在+/- 2 31 -1.在Firebird 3中,事务id已更改为无符号48位整数(因此限制为2 48),在将来的AFAIK中有空间扩展为64位整数.

使用执行备份和还原时,将重置事务计数器gbak.这可以在任何时候完成,但是当实际达到限制时,它需要将数据库标记为只读,因为在只读数据库中,数据库的"最后"事务id用于新事务而不是分配新事务交易ID.

Firebird是一个MVCC(多版本并发控制)数据库,这意味着它维护记录的多个版本.这些记录版本标记有创建该版本的事务的id.使用备份和还原时,仅备份最新版本,并且在还原时,这些记录版本的写入事务ID较低(可能为1).

由于基于隔离级别,事务开始的时间等对其他事务的记录版本的可见性,仅重置事务计数器是不可能的(或至少:有很多复杂因素).例如,具有可重复读取的事务只能看到记录由事务开始时提交的事务创建的版本.由活动事务或事务启动后提交的事务创建的记录版本是不可见的.

除了在达到事务限制之前进行常规备份和实际还原之外,没有办法阻止这种情况(因为这也将重置事务ID).