我们有一个运行Firebird数据库的实现,我们收到此错误:
" 实施限制超出 - 超出交易次数。执行备份和还原以使数据库再次可用。"
我们知道如何通过使数据库只读,执行备份和放大来解决这个问题。恢复并再次读取写入,但是我们不太确定导致这种情况的原因。我觉得这些交易限于十亿(?)。
任何人都可以确认吗?什么是防止这种情况的正确方法?
答案 0 :(得分: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)。