You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Firebird未使用页面总数及nbackup备份相关问题咨询

关于Firebird nbackup备份及未使用页面的问题解答

嘿,先给你打个定心丸——你的推测完全正确!nbackup的Level 0备份(也就是你用的-B 0参数)确实会自动跳过数据库里的未使用页面(包括已分配但未存储有效数据的页面,比如删除数据后空出来的页面),所以备份文件比原数据库小是正常现象,不用慌~

下面针对你的两个问题逐一解答:

一、如何阻止未使用页面被移除(即备份包含所有页面)

nbackup本身的Level 0备份设计就是做“紧凑式物理备份”,默认会跳过未使用页面。如果想要备份包含数据库的所有页面(包括未使用的),可以用以下两种方法:

  • 操作系统级文件复制(最直接的物理备份方式)
    注意:必须确保数据库处于离线或只读状态,否则复制的文件可能损坏。步骤如下:

    1. 先强制关闭数据库的所有连接:
      gfix -shut full -force 60 DB01.FDB
      
      (-force 60表示等待60秒后强制断开所有活跃连接)
    2. 直接复制原数据库文件DB01.FDB到备份路径(比如复制为DB01_full_backup.FDB)
    3. 重新将数据库设为在线状态:
      gfix -online DB01.FDB
      
  • 使用gbak做逻辑备份(可选)
    如果不需要严格的物理备份,gbak的默认备份会导出所有数据和元数据,恢复时会重建数据库,但这种方式不是保留原页面结构,而是重新生成数据库文件。执行命令:

    gbak -b -user systemdab -password masterskeys DB01.FDB DB01_full_gbak.fbk
    

    不过要注意,gbak备份是逻辑备份,和nbackup的物理备份性质不同,恢复速度也有差异。

二、如何获取数据库内未使用页面的总数

有两种简单的方法可以查看:

方法1:使用gstat工具(命令行快速查看)

执行以下命令:

gstat -h DB01.FDB

在输出结果里找到Pages allocated(已分配的总页面数)和Pages used(已使用的页面数),两者的差值就是未使用页面的总数。比如输出片段:

Database "DB01.FDB"
    Database header page information:
        Flags           0
        Generation      12345
        ...
        Pages allocated 10000
        Pages used      7200
        ...

这里未使用页面数就是10000 - 7200 = 2800。

方法2:查询Firebird系统监控表(SQL方式)

连接到数据库后,执行以下SQL语句:

SELECT
    MON$DATABASE_SIZE AS total_allocated_pages,
    MON$USED_PAGES AS used_pages,
    (MON$DATABASE_SIZE - MON$USED_PAGES) AS unused_pages
FROM MON$DATABASE;

查询结果会直接给出总分配页面数、已使用页面数,以及计算好的未使用页面数。

内容的提问来源于stack exchange,提问作者JK Ainz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:04:40