Oracle数据库备份和恢复配置详解
然而,如果DBWn进程在实例崩溃前将某些数据块写入磁盘,那么又将出现怎样的情况呢?John(或者另一个用户)可能频繁地重新查询与其相关的数据,而Joo对数据进行了未提交的更改,并且不再查看这些数据。因此,DBWn进程将确定在磁盘上优先写入Joo所做的变更,然后再写入John所做的变更。DBWn进程总是会在磁盘上先写入不活跃的数据块,然后再写入活跃的数据块。因此,此时数据文件中存储了JOO的未提交事务,但是丢失了John的已提交事务。这是最糟糕的损坏类型。不过经过仔细考虑可以发现:即使此时实例崩溃,前滚仍然能够解决这个问题。重做流中始终存在重新构建已提交变更所需的足够信息,其原因显而易见,因为提交操作在DBWn进程完成写入之前不会结束。不过,因为LGWR进程将所有数据块的所有变更都写至日志文件,因此日志文件中也将存在重新构建撤销段所需的足够信息,从而能够回滚Joo未提交的事务。 ? 综上所述,因为LGWR进程总是先于DBWn进程进行写操作,并且在提交的同时进行实时的写操作,所以在重做流中始终存在足够的信息,从而能够重新构建任何已提交的未被写入数据文件的变更,回滚任何已被写入数据文件的未提交变更。只要没有受到物理损坏,重做与回滚这种实例恢复机制就能够使Oracle数据库绝对不被破坏。 ? 执行SHUTDOWN ABORT命令会损坏数据库吗?答案是绝对不会!这个命令不可能损坏数据库。只要联机日志文件可用,实例恢复机制就总是可以恢复任何损坏的数据。 ? 检查点和重做日志 ? 检查点机制 ? 检查点位置(崩溃后,重做流中的实例恢复起点)由DBWn自动前移。这个过程称为“增量检查点(incremental checkpointing)”。除此之外,还有“完整检查点(full checkpointing)”和“局部检查点(partial checkpointing)”。 ? 增量检查点是正常数据库活动的一部分。DBWn进程决定缓存中是否有足够的、已更新的块,是否应把其中的几个写入磁盘。选择写入哪些变更的缓冲区的算法,是基于更改时多久以前进行的,以及如何激活缓冲区。 ? 在一般情况下,只有缓冲区已更改,且是空闲的,才能写入该缓冲区。永远不要忘记,提交变更和把块写入磁盘之前没有相关性,DBWn只写入所需的最少块数。 ? 如果将素有脏缓冲区都写入磁盘,就会出现完整检查点。在常规运行中,缓存中可能存在一百万个脏缓冲区,但对于增量检查点,DBWn只写入其中的数百条。而对于完整检查点,它将写入这些内容。为此,必须完成大量的工作:在执行检查点时,需要非常高的CPU使用率和磁盘使用率,用户会话的性能会随之降低。完整检查点会对业务产生负面影响。鉴于此,只有在两种情况下才执行完整检查点,第一种情况是有序关闭,第二种情况是DBA要求这么做。 ? 当使用NORMAL、IMMEDIATE或TRANSACTIONAL选项关闭数据库时,都会执行检查点:在关闭和卸载数据库之前,DBWn会将所有的脏缓冲区刷新到磁盘中。这意味着,再次打开数据库时,不需要执行任何???复操作。在执行某些操作(如启用归档日志模式)前,始终希望(也有必要)执行干净关闭。使用以下命令,可以在任何时间发出完整检查点信号: alter system check point; ? 对于某些操作而言,局部检查点是必须的,并会自动执行。局部检查点影响的缓冲区因操作而异: ? |