首页 > 数据库 > Oracle > Oracle Flashback(二)
01:22:53 SQL> select count(*) from scott.mydept;
COUNT(*)
----------
4
01:23:10 SQL> select current_scn from v$database;
CURRENT_SCN
-----------
609437
01:23:23 SQL> delete scott.mydept;
4 rows deleted.
01:23:37 SQL> commit;
Commit complete.
01:23:55 SQL> select count(*) from scott.mydept;
COUNT(*)
----------
0
01:24:02 SQL> select current_scn from v$database;
CURRENT_SCN
-----------
609462
基于时间戳的闪回查询,如下:
01:24:12 SQL> select count(*) from scott.mydept as of timestamp to_timestamp('2014-06-18 01:22:53','yyyy-mm-dd hh24:mi:ss');
COUNT(*)
----------
4
01:25:43 SQL> c/'2014-06-18 01:22:53'/'2014-06-18 01:23:55' --c /.. /.. 表示替换
1* select count(*) from scott.mydept as of timestamp to_timestamp('2014-06-18 01:23:55','yyyy-mm-dd hh24:mi:ss')
01:26:45 SQL> /
COUNT(*)
----------
0
01:26:47 SQL> select count(*) from scott.mydept as of scn 609437;
COUNT(*)
----------
4
01:27:23 SQL> select count(*) from scott.mydept as of scn 609462;
COUNT(*)
----------
0
闪回事务查询(Flashback Transaction Query)
使用该特性,可以在事物级别上检查数据库的任何改变,大大方便了对数据库的性能优化、事务审计及错误诊断等操作。该功能基于撤销数据(undodata)。
闪回事务查询示例如下:
查询事务的操作记录,flashback_transaction_query
SQL> show user;
USER is "SYS"
SQL> select OPERATION,TABLE_NAME,UNDO_SQL from flashback_transaction_query where table_name='MYEMP' and table_owner='SCOTT';
OPERATION TABLE_NAME UNDO_SQL
---------- ---------- ------------------------------------------------------------------------
UPDATE MYEMP update "SCOTT"."MYEMP" set "SAL" = '1800' where ROWID = 'AAANOvAAEAAAAA8AAA';
UPDATE MYEMP update "SCOTT"."MYEMP" set "SAL" = '800' where ROWID = 'AAANOvAAEAAAAA8AAA';
闪回数据库(Flashback Database)
该特性允许用户通过flashback database语句,使数据库迅速地回滚到以前的某个时间点或者某个SCN(系统更改号)上,而不需要进行时间点的恢复操作。该功能基于闪回日志。
ORACLE的闪回数据库技术使用闪回日志以及部分的归档日志来恢复用户的逻辑错误,这种恢复只针对用户错误的恢复,而不涉及整个数据库的恢复,恢复具有针对性而且恢复时间少。

在上图的闪回缓冲区中(Flashback Buffer)的变化数据将按照一定的时间间隔顺序被写入闪回日志(Flashback Logs)。将闪回缓冲区中的数据写入闪回日志的操作由RVWR进程负责,一旦启动了闪回数据库,该进程会自动启动。
批注:对于闪回数据库而言,闪回日志不会被归档。
闪回数据库方法
闪回数据库可以使用RMAN方法,也可以使用SQL指令方法实现。
使用RMAN闪回数据库有如下三种方法:
? RMAN>flashback database to time=to_date(‘2014-06-18 01:30:13’,’YYYY-MM-DD HH23:MI:SS’);
该方法将数据库闪回到过去的某个时间点,通过to_date函数指定具体的时间;
? RMAN>flashback database to SCN=638832;
该方法将数据库闪回到过去某个的某个SCN,显然在实践中这个方法不容易实现,因为在数据库发生逻辑错误之前一般不会去查询数据库当前的SCN;
? RMAN>flashback database to sequence=345 thread=1;
该方法闪回到特定日志序列号之前的状态,不包括序列号345.
使用SQL指令闪回数据库有如下两种方式:
? SQL>flashback database to timestamp(sysdate-1/24)
将数据库闪回到时间戳指定的状态
? SQL>flashback database to SCN 678854
该方法闪回数据库到过去的某个SCN
批注:在执行闪回数据库时,需要将数据库切换到mount状态,在闪回数据库结束后必须使用alter database open resetlogs打开数据库,即需要重新设置重做日志,使得重做日志序列号重新计数。
闪回数据库示例如下:
1.使用初始化参数 DB_FLASHBACK_RETENTION_TARGET 设置保留目标。可以指定一个上限值(以分钟表示),指明希望能够将数据库闪回到多长时间以前。本示例使用了 2880 分钟,相当于两天。该参数只是一个目标,并不提供任何保证。闪回时间间隔取决于快速恢复区中保留的闪回数据量的大小。
SQL> show parameter db_flashback_retention_target;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 1440
SQL> alter system set db_flashback_retention_target=2880 scope=both;
System altered.
2.启用闪回数据库
ORACLE默认不启动闪回数据库,如果需要启动闪回数据库特性,必须将数据库设置为归档模式,并启用闪回恢复区,因为闪回日志文件存放在闪回恢复区。如果在RAC环境下,必须将闪回恢复区存储在集群文件或ASM文件中。
SQL> show parameter db_recovery_file_dest; --查询快速恢复区的目录和大小
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /u01/oracle/flash_recovery_area
db_recovery_file_dest_size big integer 2G
SQL> SELECT flashback_on FROM v$database; --查询来确定是否启用了闪回数据库
FLASHBACK_ON
------------------
NO
批注:必须先配置数据库以进行归档,且必须在 MOUNT EXCLUSIVE 模式下启动数据库后,才能发出此命令来启用闪回数据库。
3.查看数据库的归档状态,若不是归档模式,设置为归档模式
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 9
Current log sequence 11
SQL> shutdown immediate
SQL> startup mount exclusive; --以exclusive (独占)模式启动数据库到mount状态
SQL> alter database archivelog; --设置数据库为归档模式
Database altered.
SQL> alter database flashback on; --启用闪回数据库
Database altered.
SQL> SELECT flashback_on FROM v$database;
FLASHBACK_ON
------------------
YES
[oracle@primary ~]$ ps -ef |grep rvwr --查看RVWR后台进程是否启用
oracle 4424 1 0 02:28 ? 00:00:00 ora_rvwr_orcl
oracle 4463 4430 0 02:29 pts/5 00:00:00 grep rvwr
4.查看快速恢复区闪回目录是否创建成功
[oracle@primary flashback]$ date
Wed Jun 18 02:32:07 CST 2014
[oracle@primary flashback]$ ll
total 8020
-rw-r----- 1 oracle oinstall 8200192 Jun 18 02:28 o1_mf_9t125spy_.flb
[oracle@primary flashback]$ pwd
/u01/oracle/flash_recovery_area/ORCL/flashback
5.基于SCN号的数据库闪回
1.模拟scott用户下的表误删除,如下:
SQL> alter database open;
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
612916
SQL> conn scott/tiger;
Connected.
SQL> drop table myemp purge;
Table dropped.
SQL>conn / as sysdba
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
612999
2.闪回数据库中误删除的表myemp
1)关闭数据库启动至mount状态
SQL> shutdown immediate
SQL> startup mount;
2)基于SCN号的数据库闪回
SQL> flashback database to SCN 612955;
Flashback complete.
SQL> alter database open read only; --以read only模式打开数据库
Database altered.
SQL> conn scott/tiger;
Connected.
SQL> select tname,tabtype from tab where tname like '%MYEMP%';
no rows selected
查看可知此时表mydept并没有闪回,继续闪回如下:
SQL> conn / as sysdba
Connected.
SQL> shutdown immediate
SQL> startup mount
SQL> flashback database to SCN 612914;
Flashback complete.
SQL> alter database open read only;
Database altered.
SQL> conn scott/tiger;
Connected.
SQL> select tname,tabtype from tab where tname like '%MYEMP%';
TNAME TABTYPE
------------------------------ -------
MYEMP TABLE
批注:可知表myemp已经成功闪回
重启数据库,以resetlogs方式打开数据库,如下:
SQL> conn / as sysdba
Connected.
SQL> shutdown immediate
SQL> startup mount
SQL> alter database open resetlogs;
6.基于时间戳的数据库闪回
1)误删除某用户,感觉scott看着不顺眼,删了
SQL> set time on;
03:02:32 SQL> drop user scott cascade;
User dropped.
03:02:58 SQL> create table mytab as select * from dual; --创建表mytab
Table created.
2)执行闪回数据库操作
03:05:47 SQL> shutdown immediate
03:06:54 SQL> startup mount
03:07:06 SQL> flashback database to timestamp to_timestamp('2014-06-18 03:02:32','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
03:08:33 SQL> alter database open read only;
Database altered.
03:08:48 SQL> select username from dba_users where username like '%SCOTT%';
USERNAME
------------------------------
SCOTT
查看闪回时间点之后创建的表是否存在:
03:09:10 SQL> select table_name from dba_tables where table_name like '%MY%';
TABLE_NAME
----------
MYEMP
批注:在该用户删除前,对在该用户下所进行的ddl语句,在闪回数据库后,不会丢失。而在基于时间戳之后在其他用户下进行的DDL语句将会丢失,不会闪回。
03:11:42 SQL> shutdown immediate --重新数据库,以resetlogs方式打开数据库
03:11:51 SQL> startup mount;
03:12:40 SQL> alter database open resetlogs;
7.从闪回数据库中排除表空间
执行闪回数据库恢复前脱机提取表空间,删除表空间或通过传统时间点恢复来恢复脱机文件。
不希望为某个表空间记录闪回数据库数据。可以使用 ALTER TABLESPACE 命令阻止表空间参与闪回数据库操作。也可以在创建表空间时指定该属性。默认值为 ON。
闪回数据库前必须脱机获取此表空间,然后可以删除该表空间或使用传统时间点恢复方法恢复脱机数据文件,可以查询 V$TABLESPACE 视图来确定表空间的闪回状态。
批注:如果重新创建控制文件,则所有表空间都将处于 FLASHBACK ON 模式。必须重复 ALTER TABLESPACE 命令,以确保将表空间从闪回数据库操作中排除。
|
SQL> select name,flashback_on from v$tablespace; 重启到mount状态恢复表空间在闪回数据库时的默认闪回状态 SQL> shutdown immediate SQL> startup mount; SQL> alter tablespace test flashback on; SQL> alter database open; |
8.闪回数据库注意事项
|
闪回数据库操作完成时,将按以下方式打开数据库: 在只读模式下打开,以验证是否使用了正确的目标时间或SCN 通过resetlogs操作打开,以允许DML 在下列情况下不能实用闪回数据库: 已经还原或重新创建了控制文件 已经删除了表空间 已经收缩了数据文件 使用to before resetlogs闪回到最后一次resetlogs操作之前。 |
OLDEST_FLASHBACK_SCN OLDEST_FL
-------------------- ---------
612596 18-JUN-14
下面介绍数据字典视图v$flashback_database_stat,该字典视图的作用是监视闪回日志写入闪回数据的各种开销,如记录了当前闪回记录起止时间、闪回记录的数据量以及重做日志记录的数据量等信息。该视图记录24小时内的闪回日志开销记录,每一行记录了一小时间隔的状态,如下所示:
SQL> select * from v$flashback_database_stat;
BEGIN_TIM END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
--------- --------- -------------- ---------- ---------- -------------------------------------
18-JUN-14 18-JUN-14 2965504 1515520 1177088 0
批注:其中flashback_data表示在时间间隔内记录的多少闪回数据,单位是字节参数;db_data记录了时间间隔内有多少数据块的读写,单位是数据块;参数redo_data说明时间间隔内记录了多少重做数据,单位是字节。
查询快闪恢复区的空间使用情况,如下:
SQL> select name,space_limit,space_used,space_reclaimable,number_of_files from v$recovery_file_dest;
NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
------------------------------------------------ ----------- ---------- ----------------- ---------------
/u01/oracle/flash_recovery_area 2147483648 116262912 0 5
批注:参数name说明了使用快闪恢复区的目录;参数space_limit说明空间最大使用上限;参数space_used说明已经使用的空间;参数space_reclaimable说明可以回收的空间。
10.使用闪回数据库的限制
以下几种环境下不能使用闪回数据库特性,只能使用不完全恢复将数据库恢复到过去的某个时间点:
? 如果是数据文件被删除或缩短
? 如果在闪回时间范围内复原或重建了控制文件
? 在resetlogs操作之前
? 表空间被删除
11.复还原点技术
在闪回数据库或闪回表操作时,往往需要一个具体的时间点或者SCN等信息,说明将闪回到哪里结束,而复原点就是SCN的别名。
1)创建一个复原点
SQL> create restore point scn1;
Restore point created.
2)查询复原点信息
SQL> select name,scn,storage_size,guarantee_flashback_database from v$restore_point;
NAME SCN STORAGE_SIZE GUA
---------------------- ---------- ------------ ---
SCN1 614343 0 NO
3)有保证的复原点技术
这种技术可以保证在快闪恢复区空间可以保证情况下,总可以闪回到该复原点,如果快闪恢复区空间不足,则数据库关闭。并且使用有保证的复原点与是否使用闪回日志无关,一旦使用了有保证的复原点,ORACLE会自动保存自复原点之后的闪回日志,并不会删除这些日志。
|
1.创建有保证的复原点 SQL> create restore point scn2 guarantee flashback database;
Restore point created.
NAME SCN STORAGE_SIZE GUA
从输出可以看出复原点scn2是有保证的复原点,因为参数guarantee_flashback_database为yes。并且相对于普通复原点scn2而言,storage_size存在参数值,该参数说明为保证的复原点指定的存储空间。
Restore point dropped.
NAME SCN STORAGE_SIZE GUA |
总结:使用闪回特性可以快速的恢复用户的逻辑错误或者误删除表等操作。闪回删除主要是关注用户误删除表、索引的数据库对象,闪回删除使用回收站作为存储删除的数据库对象的逻辑存储结构。闪回删除并不是直接将数据从数据库中删除放入回收站,而只是将数据库对象的定义从数据字典中删除,数据存储在原处。在回收站中记录这个被删除的数据库对象,一旦需要闪回到删除前的状态,使用回收站中记录的对象信息进行闪回。再删除表时,与表相关联的其他数据库对象如索引、触发器等也都一并删除。在闪回表时,这些相关的数据库对象被自动恢复,但是名称需要进一步修改。
闪回数据库技术是处理用户逻辑错误的快速数据恢复技术,相比传统的数据库恢复会减少恢复时间,传统的数据库恢复时间取决于数据库自身的大小,而闪回数据库技术的恢复取决于逻辑错误的数据量大小。使用闪回数据库技术需要将数据库设置为归档模式,并启动快闪恢复区作为闪回日志的存储目录。一般条件下应该尽量设置较大的快闪恢复区,以保证闪回数据库总可以执行成功。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26701168/viewspace-2136193/ ,如需转载,请注明出处,否则将追究法律责任。