是否可以通过Firebird的nbackup来了解上次增量备份的级别?

时间:2014-08-28 18:01:56

标签: database firebird firebird2.5

这是一个非常直截了当的问题。 Firebird有一个名为 nbackup 的备份工具,而您可以进行增量备份。

如果您没有按正确的顺序进行备份,该工具会抱怨(例如,您进行0级备份,然后进行2级备份)。然后,我假设该工具在数据库中放置一个标志,指示上次备份的级别。

提供了文档here

如何检索此信息?

1 个答案:

答案 0 :(得分:9)

据我所知,唯一的方法是查询表RDB$BACKUP_HISTORY(没有服务管理器调用此方法)。要获得最后一次备份,您可以使用:

SELECT RDB$BACKUP_ID, RDB$TIMESTAMP, RDB$BACKUP_LEVEL, RDB$GUID, RDB$SCN, RDB$FILE_NAME
FROM RDB$BACKUP_HISTORY
ORDER BY RDB$TIMESTAMP DESC
ROWS 1

RDB$BACKUP_HISTORY包含以下列:

  • RDB$BACKUP_ID主键
  • RDB$TIMESTAMP备份时间戳
  • RDB$BACKUP_LEVEL备份级别
  • RDB$GUID指导备份(这也用于备份文件中以控制和检查依赖关系)
  • 备份中的
  • RDB$SCN最高页面标记(见下文)
  • RDB$FILE_NAME已创建备份的文件名

Nbackup对数据库页面进行物理备份。 SCN(页面扫描的缩写...)是用于标记数据库页面的数字。此数字在每次备份状态更改时递增,对于每个备份,nbackup有3个状态更改:nbak_state_normal(无备份) - > nbak_state_stalled(数据库写入增量文件) - > nbak_state_merge(将delta文件合并回数据库) - > nbak_state_normal(没有备份)。

第一个备份获得SCN 0,第二个SCN 3等(与哪个级别无关)。

  • SCN 0:任何备份之前的页面
  • SCN 1:在备份期间写入/更新到增量文件的页面
  • SCN 2:在将delta文件合并到主备份期间写入/更新的页面(虽然我不确定写入主文件的delta文件中的页面是否获得SCN 1或2)
  • SCN 3:结束第一次备份+合并后编写/更新的页面
  • ...
  • SCN 6:结束第二次备份+合并后编写/更新的页面

进行1级备份时,它会查找最后一级0备份,并备份SCN高于该0级备份的SCN的所有页面(依此类推)。 Firebird 2.1发行说明中也对此进行了描述:New On-line Incremental Backup

请注意,使用 gbak 进行备份和还原将清除RDB$BACKUP_HISTORY表,并将所有页面的SCN重置为0.原因是gbak会创建逻辑备份物理备份。因此,使用gbak进行恢复将重写整个数据库(甚至可以更改页面大小)。这使得以前备份与nbackup无关,作为后续备份的起点:您需要从新的0级开始。

由于nbackup手册中缺少此信息,因此我在Firebird跟踪器上创建了一个故障单:http://tracker.firebirdsql.org/browse/DOC-94