是否可以通过Firebird的nbackup知道上次增量备份的级别?

Epi*_*lon 8 database firebird firebird2.5

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

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

这里提供文档

我该如何检索这些信息?

Mar*_*eel 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
Run Code Online (Sandbox Code Playgroud)

该表RDB$BACKUP_HISTORY包含以下列:

  • RDB$BACKUP_ID 首要的关键
  • RDB$TIMESTAMP 备份时间戳
  • RDB$BACKUP_LEVEL 备份水平
  • RDB$GUID 备份的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发行说明中也有描述:新的在线增量备份.

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

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