【问题标题】:Firebird DB read deleted register after commit提交后 Firebird DB 读取已删除的寄存器
【发布时间】:2014-07-03 06:39:23
【问题描述】:

我有一个 firebird 2.5 数据库,我想知道是否有办法回滚已提交的事务。真的,我在问是否有人可以访问 firebird 数据库文件,是否可以读取在先前提交的事务中删除的数据。
我有一个删除一些寄存器并提交的过程(存储过程)。对于可以访问数据库文件的人来说,这个寄存器可以恢复吗?

【问题讨论】:

    标签: transactions firebird firebird2.5


    【解决方案1】:

    没有简单的方法来恢复/回滚已提交的事务,但是 Firebird 使用 MVCC (Multi Version Concurrency Control)。删除(或更新)记录将添加新的记录版本并为记录的先前状态创建增量记录版本。

    当没有事务对旧记录版本“感兴趣”时,它就有资格进行垃圾收集(这可能在另一个事务访问记录时或在后台协同完成)。但是,无法保证何时会发生这种垃圾回收。

    所以如果一条记录被删除,但还没有被垃圾回收(或者因为仍然有对它感兴趣的事务,或者因为垃圾回收器还没有访问过该记录),那么它仍然是可能的适合对 Firebird 内部结构有足够技能和知识的人来恢复记录。请注意,即使一个记录版本已被垃圾回收,数据本身也会在磁盘上,直到它被另一个记录版本覆盖。

    另见Firebird for the Database Expert: Episode 4 - OAT, OIT, & Sweep

    【讨论】:

    • 感谢您的回答。几天前我读过这个第4集,我认为它不容易阅读,但正如你所说,也许它是可能的。如果我在删除操作后启动垃圾收集,问题仍然存在。我只能在我真正希望不可恢复的事务上执行此操作。
    • @briast 了解您需要了解的原因可能会有所帮助:您需要恢复数据,还是要确保已删除的记录不可恢复?
    • 嗨。我想确保已删除的记录不可恢复。
    • 真正确定的唯一方法是在删除后执行备份和恢复。但是我想说你希望它不可恢复的要求是相当可疑的。
    • 嫌疑人?这个要求来自我的客户。这是他想要的。 :-)
    猜你喜欢
    • 2021-06-26
    • 2012-08-11
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 2011-05-12
    • 2014-02-02
    相关资源
    最近更新 更多