database - 是否有可能知道上次使用 Firebird 的 nbackup 进行的增量备份的级别?

标签 database firebird firebird2.5

这是一个非常简单的问题。 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/

相关文章:

Firebird 获取包含所有可用 id 的列表

php - 使用 PHP 连接到 SQL Server 数据库

database - 访问通过数据库链接在数据库中创建的表同义词

node.js - 在 Mongoose 中为对象数组创建索引

firebird - 如何查找哪个表列对应于 Firebird 数据库中的约束?

sql - 检查仅允许某些字符的约束

database - 如何在数据库架构中支持多语言方法?

sql - 如何在 Firebird 中删除唯一约束

sql - Firebird 在 where 和 order by 子句上的表现

c# - 如何将参数子字符串转换为 C# 中的列类型?