这是一个非常简单的问题。 Firebird 有一个名为 nbackup 的备份工具,您可以进行增量备份。
如果您没有按照正确的顺序进行备份(例如,您进行了 0 级备份,然后进行了 2 级备份),该工具就会报错。然后,我假设该工具在数据库中放置了一个标志,指示上次备份的级别。
提供文档here
如何检索此信息?
最佳答案
据我所知,唯一的方法是查询表 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
备份的 GUID(这也在备份文件中用于控制和检查依赖性)RDB$SCN
备份中的最高页面标记(见下文)RDB$FILE_NAME
创建备份的文件名
Nbackup 对数据库页面进行物理备份。 SCN(页面扫描的缩写...)是一个用于标记数据库页面的数字。这个数字在每次备份状态更改时递增,对于每个使用 nbackup 的备份,都有 3 个状态更改:nbak_state_normal(无备份)-> nbak_state_stalled(数据库写入 delta 文件)-> nbak_state_merge(将 delta 文件合并回数据库)-> nbak_state_normal (无备份)。
第一个备份获得 SCN 0,第二个备份获得 SCN 3,等等(哪个级别无关紧要)。
- SCN 0:任何备份之前的页面
- SCN 1:备份期间写入/更新到增量文件的页面
- SCN 2:在将增量文件合并到主备份期间写入/更新的页面(尽管我不确定增量文件中写回主文件的页面是否获得 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
关于database - 是否有可能知道上次使用 Firebird 的 nbackup 进行的增量备份的级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25555214/