在Oracle中使用NOLOGGING时,请说出要插入新记录。我的数据库能否从停电中正常恢复?如果在插入过程中随机下降。
我是否正确地指出,UNDO日志将用于此类恢复……与REDO日志用法相反,REDO日志用法用于在主数据文件物理损坏的情况下进行恢复。
最佳答案
在我看来,您在这里混淆了一些概念。
首先,让我们谈谈实例恢复。实例恢复是在数据库崩溃后(无论是否被杀死,服务器关闭等)发生的情况。实例启动时,Oracle将从重做日志中读取数据并前滚,将所有未决的更改写入数据文件。接下来,它将读取撤消信息,确定未提交的事务,并使用撤消中的数据回滚在崩溃之前尚未提交的任何更改。这样,Oracle保证可以恢复到上一次提交的事务。
现在,关于直接加载和NOLOGGING。重要的是要注意,NOLOGGING仅对直接加载有效。这意味着更新和删除绝不会NOLOGGING,而INSERT仅在您指定APPEND提示时才停止。
重要的是要了解,当您执行直接加载时,实际上是在将数据“直接加载”到数据文件中。因此,无需担心实例恢复等问题。当您进行NOLOGGING直接加载时,数据仍然直接写入数据文件中。
它像这样。您进行直接加载(现在,暂且不提NOLOGGING问题),然后将数据直接加载到数据文件中。发生这种情况的方式是,Oracle将从高水位线(HWM)之上分配存储,并直接格式化和加载那些全新的块。进行该块分配后,那些描述空间分配的数据字典更新将被写入并受重做保护。然后,当您提交事务时,更改将变为永久更改。
现在,在实例崩溃的情况下,要么提交事务(在这种情况下,数据位于数据文件中,并且数据字典反映出已分配的那些新扩展区),要么未提交,并且表看起来就像它是在直接加载开始之前完成的。因此,再次恢复直到最后一个已提交事务的数据。
现在,NOLOGGING。是否记录直接负载对于实例恢复而言无关紧要。它仅在发生介质故障和介质恢复时才起作用。
如果介质发生故障,则需要从备份中恢复。因此,您将还原损坏的数据文件,然后从存档的重做日志中应用重做,以“回放”从备份时间到当前时间点发生的事务。只要记录了所有更改,就不会有问题,因为所有数据都位于重做日志中。但是,如果在直接装入NOLOGGING之后发生介质故障,会发生什么情况?
好了,将重做应用于已加载NOLOGGING的段时,所需数据不在重做中。因此,我提到的那些数据字典事务创建了新的数据装载区,这些事务在重做中,但是没有什么可填充这些块。因此,范围被分配给该段,但随后也被标记为无效。因此,如果/当您尝试从表中选择并击中那些无效块时,您将得到ORA-26040“使用NOLOGGING选项加载了数据”。这是Oracle,让您知道由于NOLOGGING操作的恢复而导致数据损坏。
那么该怎么办?好吧,首先,任何时候使用NOLOGGING加载数据时,请确保在必要时可以重新运行加载。因此,如果在加载期间确实遇到实例故障,则可以重新启动加载,或者如果在NOLOGGING加载与下一次备份之间遇到介质故障,则可以重新运行该加载。
请注意,在进行NOLOGGING直接加载的情况下,您只有在下次备份包含直接加载段的数据文件/表空间的备份时才可能遭受数据丢失。受备份保护后,您就安全了。
希望这有助于阐明有关直接加载,NOLOGGING,实例恢复和介质恢复的想法。
关于oracle - 在Oracle中使用NOLOGGING是否会破坏ACID?特别是在停电期间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9932305/