Oracle闪回技术提供了一组功能用来查看数据的过去状态并且支持数据按时间返回到之前的状态不用对数据库从备份中执行大量的还原操作或者执行按时间点恢复。在大部分情况下闪回功能非常有效破坏性比介质恢复小。
Oracle的大部分闪回功能是在逻辑层面进行操作,查看和维护数据库对象,比如:
Oracle 闪回查询:指定目标时间对数据库运行查询来查看在指定时间点的数据结果。为了从一个不想要生效的改变中对表进行恢复,用户可以选择错误之前的时间并运行查询来检索丢失或改变的记录。
Oracle闪回版本查询:能查看在指定时间间隔内一个或多个表中已经存在记录的所有版本。还可以检索行记录不同版本的元数据,包括开始时间,结束时间,操作和创建这个版本的事务ID。这个功能可以用来恢复丢失的数据和查看表的改变。
Oracle闪回事务查询:能查看由单个事务所产生的改变或者在一个时间周期内所有事务的改变。
Oracle闪回表:将一个表返回到之前某个时间点的状态。当数据库处于联机状态时也能还原表数据。只撤消特定表的改变。
Oracle闪回删除:是dorp table的反操作
闪回表,闪回查询,闪回事务查询和闪回版本查询都依赖于undo数据,记录对Oracle数据库每一个更新的影响。undo的主要作用主要是用于SQL查询的一致性读与事务的回滚,这些undo信息包括了重构过去时间点数据所需要的信息。
闪回删除是建立在回收站机制上的,Oracle会将删除的数据库对象保留到因为要分配新空间而不得不覆盖原来使用的空间为止。
注意:逻辑层面的闪回功能不依赖于RMAN。
在物理层面,Oracle闪回数据库提供了一种对数据库执行按时间点恢复的替代方法。如果数据文件已经包含了所不期待的改变,那么使用闪回数据库能使用当前的数据文件将它的内容还原到过去时间点所处的状态。而结果就是按时间点恢复一样,但其操作速度更快因为它不需要从备份中还原数据文件,比介质恢复应用的重做要少很多。
闪回数据库使用闪回日志来访问数据块的之前版本,它的一些信息与归档重做日志一样。闪回数据库要求你对数据库设置了闪回区,因为闪回日志只能存储在这里。闪回日志缺省情况下是没启用的。闪回日志所使用的空间由数据库自动管理,在闪回区会让空间使用保持平衡。
注意:闪回数据库被集成到RMAN中,在执行闪回数据库时可以自动从备份中检索的任何归档重做日志,它也能使用SQL*Plus来执行,但在这种情况下你必须保证它所要应用的归档日志都在磁盘上。
如果闪回区没有分配足够的空间,那么闪回日志因为备份和归档日志文件可能会被删除。数据库按时间点恢复可以达到与闪回数据库同样的效果,将数据库的内容返回到过去的时间点。
Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里。一般数据库至少要有2个联机重做日志组。当一个联机重做日志组被写满的时候,就会发生日志切换,这时联机重做日志组2成为当前使用的日志,当联机重做日志组2写满的时候,又会发生日志切换,去写联机重做日志组1,就这样反复进行。
如果数据库处于非归档模式,联机日志在切换时就会丢弃. 而在归档模式下,当发生日志切换的时候,被切换的日志会进行归档。比如,当前在使用联机重做日志1,当1写满的时候,发生日志切换,开始写联机重做日志2,这时联机重做日志1的内容会被拷贝到另外一个指定的目录下。这个目录叫做归档目录,拷贝的文件叫归档重做日志。
数据库使用归档方式运行时才可以进行灾难性恢复。
1.归档日志模式和非归档日志模式的区别
非归档模式只能做冷备份,并且恢复时只能做完全备份.最近一次完全备份到系统出错期间的数据不能恢复.
归档模式可以做热备份,并且可以做增量备份,可以做部分恢复.
用ARCHIVE LOG LIST 可以查看当前模式状态是归档模式还是非归档模式.
当前数据库没有启动归档
SQL> archive log list Database log mode No Archive Mode Automatic archival Disabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 191 Current log sequence 193
从上面的信息可以知道归档目标为USE_DB_RECOVERY_FILE_DEST,这说归档日志将会存储到闪回区这里之所以归档目录为是因为当没有设置其它归档目录时log_archive_dest_10会隐式的使用USE_DB_RECOVERY_FILE_DEST来存储归档重做日志
SQL> show parameter log_archive_dest NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_archive_dest string log_archive_dest_1 string log_archive_dest_10 string log_archive_dest_2 string log_archive_dest_3 string log_archive_dest_4 string log_archive_dest_5 string log_archive_dest_6 string log_archive_dest_7 string log_archive_dest_8 string log_archive_dest_9 string log_archive_dest_state_1 string enable log_archive_dest_state_10 string enable log_archive_dest_state_2 string enable log_archive_dest_state_3 string enable log_archive_dest_state_4 string enable log_archive_dest_state_5 string enable log_archive_dest_state_6 string enable log_archive_dest_state_7 string enable log_archive_dest_state_8 string enable log_archive_dest_state_9 string enable
从上面的信息可以看到当前数据库没有设置任何归档目录,下面来设置归档目录
SQL> alter system set log_archive_dest_1='location=/u02' scope=both; System altered.
再来查看归档重做日志存储的目录
SQL> archive log list Database log mode No Archive Mode Automatic archival Disabled Archive destination /u02 Oldest online log sequence 191 Current log sequence 193
可以看到现在数据库显示的归档日志目录为我们所指定的/u02
下面来启用闪回
SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount ORACLE instance started. Total System Global Area 327155712 bytes Fixed Size 1273516 bytes Variable Size 138412372 bytes Database Buffers 184549376 bytes Redo Buffers 2920448 bytes Database mounted. SQL> archive log list Database log mode No Archive Mode Automatic archival Disabled Archive destination /u02 Oldest online log sequence 191 Current log sequence 193 SQL> show parameter db_recovery_file NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_recovery_file_dest string /u01/app/oracle/flash_recovery _area db_recovery_file_dest_size big integer 2G SQL> alter database force logging; Database altered. SQL> alter database flashback on; alter database flashback on * ERROR at line 1: ORA-38706: Cannot turn on FLASHBACK DATABASE logging. ORA-38707: Media recovery is not enabled.
现在虽然我们设置了db_recovery_file_dest与db_recovery_file_dest_size,强制数据库记录日志,但数据库没有启用归档是不能雇用闪回的,下面启用归档。
SQL> alter database archivelog;
Database altered.
再次启用闪回
SQL> alter database flashback on; Database altered.
当启用闪回就不能使用log_archive_dest与log_archive_duplex_dest参数来指定归档日志目录。而是必须使用log_archive_dest_n
SQL> alter system set log_archive_dest='location=/u01' scope=both; alter system set log_archive_dest='location=/u01' scope=both * ERROR at line 1: ORA-02097: parameter cannot be modified because specified value is invalid ORA-16018: cannot use LOG_ARCHIVE_DEST with LOG_ARCHIVE_DEST_n or DB_RECOVERY_FILE_DEST SQL> alter system set log_archive_duplex_dest='location=/u01' scope=both; alter system set log_archive_duplex_dest='location=/u01' scope=both * ERROR at line 1: ORA-02097: parameter cannot be modified because specified value is invalid ORA-16018: cannot use LOG_ARCHIVE_DUPLEX_DEST with LOG_ARCHIVE_DEST_n or DB_RECOVERY_FILE_DEST
从上面的错误信息确实可以看到当启用闪回后确实不能使用log_archive_dest与log_archive_duplex_dest参数来指定归档日志目录