如何轻松确定 .fdb 文件的版本(Firebird 数据库)

Man*_*idt 5 firebird firebird-embedded

在查看专有软件(可能使用 Firebird Embedded)的 .fdb 数据库时,如何确定需要设置哪个版本的 Firebird?

我目前可以想象的唯一方法是使用十六进制查看器查看“ODS-version”,它是页面标题的一部分,它很可能也用作文件标题的格式,然后以某种方式通过挖掘存储库历史找出哪个 Firebird 版本支持哪个 ODS 版本。至少现在,ODS 版本的编码如下所述。

相关文档: https : //firebirdsql.org/file/documentation/reference_manuals/reference_material/Firebird-Internals.pdf

相关代码:

https://github.com/FirebirdSQL/firebird/blob/3dd6a2f5366e0ae3d0e6793ef3da02f0fd05823a/src/jrd/ods.h

inline USHORT DECODE_ODS_MAJOR(USHORT ods_version)
{
    return ((ods_version & 0x7FF0) >> 4);
}

inline USHORT DECODE_ODS_MINOR(USHORT ods_version)
{
    return (ods_version & 0x000F);
}
Run Code Online (Sandbox Code Playgroud)

真的没有更简单的方法来确定所需的 firebird 版本,例如使用一些 cli-tool 吗?

Mar*_*eel 6

如果您手头有 Firebird 安装,您可以使用 gstat 检查数据库的 ODS。例如:

gstat -h <path-to-your-database>
Run Code Online (Sandbox Code Playgroud)

如果数据库的 ODS 版本受 gstat 版本支持,您将得到如下信息:

Database "D:\DATA\DB\FB4\FB4TESTDATABASE.FDB"
Gstat execution time Sat Mar 17 18:08:09 2018

Database header page information:
        Flags                   0
        Generation              308
        System Change Number    0
        Page size               16384
        ODS version             13.0
        Oldest transaction      393
        Oldest active           394
        Oldest snapshot         394
        Next transaction        395
        Sequence number         0
        Next attachment ID      150
        Implementation          HW=AMD/Intel/x64 little-endian OS=Windows CC=MSVC
        Shadow count            0
        Page buffers            0
        Next header page        0
        Database dialect        3
        Creation date           Jan 6, 2017 14:05:48
        Attributes              force write

    Variable header data:
        *END*
Run Code Online (Sandbox Code Playgroud)

ODS version 13.0意味着它是一个 Firebird 4 数据库。

如果 gstat 版本不支持数据库的 ODS 版本,您将收到如下错误(例如,在这种情况下,在 Firebird 2.5/ODS 11.2 数据库上使用 Firebird 4 gstat):

Wrong ODS version, expected 13, encountered 11
Run Code Online (Sandbox Code Playgroud)

但这有其缺点:它不提供 ODS 次要版本,例如,当使用 Firebird 2.0 (ODS 11.0) 或 2.1 (ODS 11.1) gstat 访问 Firebird 2.5 (ODS 11.2) 数据库时,这将导致无用的错误信息:

Wrong ODS version, expected 11, encountered 11
Run Code Online (Sandbox Code Playgroud)

最快的方法是使用 Firebird 2.5 gstat,因为这将允许您确定 10(Firebird 1)和 11.2(Firebird 2.5)之间的确切 ODS 版本,同时错误消息将允许您确定是否需要较新的版本(例如,ODS 12 是 Firebird 3,ODS 13 是 Firebird 4)。

但是,您还需要查看Implementationgstat的输出。Firebird 数据库文件具有特定于平台的存储(尽管自 Firebird 2.0 以来已减少)。例如,在 Firebird 1.5 及更早版本 (ODS 10) 中,64 位 Firebird 无法访问来自 32 位 Firebird 的数据库。来自小端平台(最常见)的 Firebird 数据库无法在大端平台上读取(反之亦然)。

在这些限制范围内,Firebird 2.5 安装可以读取 ODS 10 到 11.2 的数据库。Firebird 3 只能读取 ODS 12,Firebird 4 只能读取 ODS 13。

如果平台不匹配(例如旧的 32/64 位或小/大端)或不支持的 ODS 版本,您将需要有一个可移动备份 (gbak) 来转换和/或升级。

有关 ODS 版本和随附 Firebird(或 InterBase)版本的概述,请参阅所有 Firebird 和 InterBase On-Disk-Structure (ODS) 版本