如何修复 Firebird 错误交易计数超出

Div*_*eto 0 firebird

我有一个 Firebird 应用程序,它给出了 Firebird 错误“事务计数超出”。

我们如何修复这个错误?

Mar*_*eel 9

该错误的完整错误消息是“超出实施限制 - 超出事务计数。执行备份和恢复以使数据库再次可操作”。正如该错误所表明的那样,您需要备份然后恢复数据库。

在 Firebird 2.5 及更低版本中,最大事务数为(接近) 2 31 - 1 ,对于 Firebird 3 及更高版本为 2 48。一旦达到此限制,数据库将处于只读状态。

要重置事务计数,您需要使用 gbak 备份数据库,并使用正确的数据库所有者用户(或可能是 SYSDBA)恢复它。为此,您需要执行以下步骤:

  • 使用 SYSDBA 或数据库所有者用户通过gfix将数据库显式标记为只读:

    gfix -user <user> -password <password> -mode read_only <databasename>
    
    Run Code Online (Sandbox Code Playgroud)

    这是必要的,因为 gbak 需要启动一个事务,而在 read_write 模式下这是不可能的(在 read_only 模式下,事务将“重用”最后提交的事务来进行只读操作)。

  • 使用 SYSDBA 或数据库所有者用户通过gbak备份数据库:

    gbak -user <user> -password <password> -backup <databasename> <backupfilename>
    
    Run Code Online (Sandbox Code Playgroud)
  • 将现有数据库文件重命名<databasename>为其他名称以便妥善保管。在确认恢复正常且新数据库可用后,您可以将其删除。

  • 使用应该是数据库所有者的适当用户恢复数据库:

    gbak -user <user> -password <password> -create <backupfilename> <databasename>
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用 SYSDBA 或数据库所有者用户通过 gfix 将数据库再次标记为可写:

    gfix -user <user> -password <password> -mode read_write <databasename>
    
    Run Code Online (Sandbox Code Playgroud)