ITPub博客

首页 > 数据库 > Oracle > Oracle10g的闪回功能详解

Oracle10g的闪回功能详解

Oracle 作者:sky850623 时间:2014-03-22 19:36:20 0 删除 编辑

Oracle10g 引入的闪回技术包含
1 闪回查询(flashback query
2闪回版本查询(flashback version query
3闪回事务查询(flashback transcation query
4闪回表(flashback table
5闪回删除(flashback drop
6
闪回数据库(flashback database)。

其中闪回查询、闪回版本查询、闪回事务查询属于行级闪回。这三种闪回技术全部依赖于undo表空间中的undo数据。
闪回表、闪回删除属于表级闪回。闪回表也是从undo中读取数据,闪回删除是依赖recyclebin 
闪回数据库属于数据库级闪回。

Flashback query是最基本的闪回功能,直接利用回滚段中的旧数据构造某一个时刻的一致性数据版本。只适合单个表数据恢复。对事务中相关多表数据恢复不适合,无法确保相关数据的参照完整性。Flashback query不需要使用resetlogs打开数据库。闪回查询让你能够看到过去某个时间的的数据。能够让你查看和重构以为意外被删除或者该表的数据。你可以根据SCN号和具体时间进行数据库查询。参数undo_retention 表明在回滚段中旧的信息被覆盖之前保留的时间。通过使用AS OF字句,你可以查询一个表中不同时段的快照。
AS OF Specify AS OF to retrieve the single version of the rows returned by the query at a particular change number (SCN) or timestamp. If you specify SCN, then expr must evaluate to a number. If you specify TIMESTAMP, then expr must evaluate to a timestamp value. Oracle Database returns rows as they existed at the specified system change number or time.---指定AS OF能够通过指定的SCN或者时间戳来获取所有行的单个版本,如果你指定SCN,则后面必须跟数字,如果你指定timestamp,则后面必须指定一个具体时间,Oralce数据会返回在该时间点或者SCN号时的数据。

根据SCN的闪回查询:
1、初始化数据
SQL> create table t(a number,b number);
Table created.
SQL> insert into t values(1,1);
1 row created.
SQL> insert into t values(2,2);
1 row created.
SQL> insert into t values(3,3);
1 row created.
SQL> commit;
Commit complete.
2、查询当前时间、当前SCN号
SQL> alter session set nls_date_format='yyyymmdd hh24:mi:ss';
Session altered.
SQL> select sysdate from dual; ---获取当前时间
SYSDATE
-----------------
20140313 22:37:48
SQL> select dbms_flashback.get_system_change_number from dual; ---获取当前SCN
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1136165

3、删除部分数据
SQL> delete from t where b=3;
1 row deleted.
SQL> commit;
Commit complete.
4、根据SCN或者时间进行闪回查询
SQL> select * from t;
         A          B
---------- ----------
         1          1
         2          2
SQL> select * from t as of scn 1136165;  ---根据SCN号得到在该SCN号时的数据情况
         A          B
---------- ----------
         1          1
         2          2
         3          3
SQL> select * from t as of timestamp to_timestamp('20140313 22:37:48','yyyymmdd hh24:mi:ss'); --得到具体时间点的数据
         A          B
---------- ----------
         1          1
         2          2
         3          3













Flashback version query 允许查看相同行在一段时间内所有的版本,记录了数据的历史变化过程



Flashback transcation query 能够查询事务对表所做的操作,通过UNDO SQL可以取消对事务所做的修改。查询FLASHBACK_TRANSACTION_QUERY这个数据字典表来获取字典事务ID的信息.



Flashback table复原一个表到某个时间点,或者某个SCN而不用回复数据文件。闪回表依赖UNDO数据,当表结构改变的时候,不能进行闪回。
Flashback drop用户恢复被误删除的表。允许你从当前数据库中恢复一个被drop的对象。在执行drop操作时,现在oracle不是真正删除他,而是将对象自动放入回收站,对于一个对象的删除,其实就是一个简单的重命令操作,并且所在的表空间不变。表上面的约束也在放在回收站里面,在闪回后,索引的名称还是系统默认的,需要手工还原。表上的物化视图日志不会随着表的删除而放入回收站。
对闪回表语句不能进行回滚,如何要闪回表,你需要有对表的flashback对象权限或者flashback any table系统权限。row movement对应flash drop没有影响,但是想要使用闪回表来恢复被删除的数据时,就需要开启row movement。flashback drop不会恢复表相关的约束信息
flashback table to scn或者to timestamp,如果当前存在索引,闪回到创建索引之前的时间时候,闪回后,系统仍然存在索引。如果当前drop了索引,那闪回到创建索引的时间点时,索引是变成没有了。

闪回表的命令如下:


TO SCN Clause
示例如下:
SQL> create tablespace tbs_user datafile '/u01/app/oracle/oradata/PROD/disk1/tbs_user.dbf' size 20M autoextend on extent management local;
Tablespace created.
SQL> create user sec identified by sec default tablespace tbs_user;
User created.
SQL> grant connect,resource,dba to sec;
Grant succeeded.

SQL> conn sec/sec
Connected.
SQL> create table t (a number,b number);
Table created.
SQL> insert into t values(1,1);
1 row created.
SQL> commit;
Commit complete.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1169506
SQL> insert into t values(2,2);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from t;
         A          B
---------- ----------
         1          1
         2          2
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1169526

SQL> flashback table t to scn 1169506;  ----闪回表的时候,需要对表执行row movment
flashback table t to scn 1169506
                *
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled

SQL> alter table t enable row movement;
Table altered.
SQL> flashback table t to scn 1169506;
Flashback complete.
SQL> select * from t;------表闪回到具体的SCN时的情形


         A          B
---------- ----------
         1          1

SQL> flashback table t to scn 1169526;
Flashback complete.
SQL> select * from t; ---闪回到最后的位置
         A          B
---------- ----------
         1          1
         2          2
----------------------------------下面是验证索引在flashback table to scn中的情况-----
SQL> drop table t;
Table dropped.
SQL> create table t(a number,b number);
Table created.
SQL> insert into t values(1,1);
1 row created.
SQL> commit;
Commit complete.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                1170627
SQL> insert into t values(2,2);
1 row created.
SQL> commit;
Commit complete.
SQL> create index idx_t on t(a);
Index created.
SQL> select dbms_flashback.get_system_change_number from dual; ---该时间点表中存在索引
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1170662
SQL> insert into t values(3,3);
1 row created.
SQL> commit;
Commit complete.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1170672

SQL> select index_name,status from user_indexes where table_name='T';
INDEX_NAME                     STATUS
------------------------------ --------
IDX_T                          VALID

SQL> alter table t enable row movement;
Table altered.
SQL> flashback table t to scn 1170627;      ----恢复到没有创建索引之前的SCN
Flashback complete.
SQL> select * from t;
         A          B
---------- ----------
         1          1
SQL> select index_name,status from user_indexes where table_name='T';----此时索引仍然存在
INDEX_NAME                     STATUS
------------------------------ --------
IDX_T                          VALID

SQL> flashback table t to scn 1170672;  ---闪回到最后的SCN

Flashback complete.
SQL> select * from t;
         A          B
---------- ----------
         1          1
         2          2
         3          3

SQL> drop index idx_t;----删除索引
Index dropped.
SQL> flashback table t to scn 1170662;-----闪回到创建索引的SCN ,但是经过闪回后索引已经不再存在了
Flashback complete.
SQL> select index_name,status from user_indexes where table_name='T';
no rows selected
SQL> 

ENABLE | DISABLE TRIGGERS
缺省情况下,闪回表时,表上的triggers是不能使用的,可以使用enable triggers来是闪回的同时启用triggers

TO BEFORE DROP Clause

Using Flashback Drop and Managing the Recycle Bin

When you drop a table, the database does not immediately remove the space associated with the table. The database renames the table and places it and any associated objects in a recycle bin, where, in case the table was dropped in error, it can be recovered at a later time. This feature is called Flashback Drop, and the FLASHBACK TABLE statement is used to restore the table. Before discussing the use of the FLASHBACK TABLE statement for this purpose, it is important to understand how the recycle bin works, and how you manage its contents.

---当你删除一张表,数据库不是立刻删除表所占的空间,数据库会重命名表并把它和相关的对象放在回收站里面,防止表被误删除之后,能够进行恢复,这个特征就叫做闪回删除,使用
flashbackup table继续表的恢复。

如果想要开启闪回删除表功能,需在数据库开始回收站功能。
SQL> alter system set recyclebin=on ;
System altered.
SQL> show parameter recyclebin
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      ON

回收站中的对象命名格式:

The renaming convention is as follows:

BIN$unique_id$version
SQL> select object_name,original_name from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME
------------------------------ --------------------------------
BIN$9JC9w+cttHDgQKjAN/lQpQ==$0 T

Disabling the recycle bin does not purge or otherwise affect objects already in the recycle bin.---关闭回收站,不影响原先已经在recyclebin里面的数据。

Viewing and Querying Objects in the Recycle Bin

Oracle Database provides two views for obtaining information about objects in the recycle bin:

View Description
USER_RECYCLEBIN This view can be used by users to see their own dropped objects in the recycle bin. It has a synonym RECYCLEBIN, for ease of use.
DBA_RECYCLEBIN This view gives administrators visibility to all dropped objects in the recycle bin


删除回收站
使用purge命令能够永久的从回收站中删除对象,从回收站删除的对象就不能再用flashback命令恢复了。

语法:Purge {table |index }
语法:purge tablespace [user ]
语法:purge [USER_|DBA_]recyclebin
PURGE TABLESPACE  清除指定表空间内的所有回收站对象。存在于其他表空间的互相关联的对象也会被清除。也可以指定USER清除相应用户的对象。
--PURGE TABLESPACE example USER oe;

PURGE RECYCLEBIN  清除当前用户的所有对象。
PURGE DBA_RECYCLEBIN 清除所有对象,需要有足够的系统权限或者SYSDBA的权限。
----------------
SQL> create table t(a number,b number);
Table created.
SQL> insert into t values(1,1);
1 row created.
SQL> commit;
Commit complete.
SQL> drop table t;
Table dropped.
SQL> create table t(a number,b number);
Table created.
SQL> insert into t values(2,2);
1 row created.
SQL> commit;
Commit complete.
SQL> drop table t;
Table dropped.
SQL> select object_name,droptime from recyclebin; 

OBJECT_NAME                    DROPTIME
------------------------------ -------------------
BIN$9JC9w+cwtHDgQKjAN/lQpQ==$0 2014-03-14:22:30:10
BIN$9JC9w+cvtHDgQKjAN/lQpQ==$0 2014-03-14:22:31:10


SQL> flashback table "BIN$9JC9w+cvtHDgQKjAN/lQpQ==$0" to before drop;-----表恢复完成
Flashback complete.

SQL> select * from t;

        A          B
---------- ----------
         1          1
SQL> 

-----如何恢复索引-----
SQL> create table t(a number ,b number);
Table created.
SQL> create index idx_t on t(a);
Index created.
SQL> select index_name from user_indexes;
INDEX_NAME
------------------------------
IDX_T
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
T
SQL> drop table t;

Table dropped.
SQL> select table_name from user_tables;
no rows selected
SQL> select index_name from user_indexes;
no rows selected
SQL> select object_name,original_name,type from recyclebin;----表中存在着表T和T表示的索引IDX_T

OBJECT_NAME                    ORIGINAL_NAME
------------------------------ --------------------------------
TYPE
-------------------------
BIN$9JC9w+c3tHDgQKjAN/lQpQ==$0 IDX_T
INDEX
BIN$9JC9w+c4tHDgQKjAN/lQpQ==$0 T
TABLE
SQL> flashback table t to before drop;
Flashback complete.
SQL> select object_name,original_name,type from recyclebin; ----闪回之后,回收站中已经没有表和索引了
no rows selected
SQL> desc t;  ----表T已经恢复
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 A                                                  NUMBER
 B                                                  NUMBER

SQL> select index_name from user_indexes; ---索引也已经恢复,但是索引的名称还是原来在回收站里面的名称
INDEX_NAME
------------------------------
BIN$9JC9w+c3tHDgQKjAN/lQpQ==$0
SQL> alter index "BIN$9JC9w+c3tHDgQKjAN/lQpQ==$0" rename to idx_t; ---手工修改索引名称
Index altered.
SQL> select index_name from user_indexes;
INDEX_NAME
------------------------------
IDX_T

SQL> 

Flashback Database命令是为了加快原本很慢的时间点数据库恢复(point in time database recovery)过程。闪回可以取得完整的数据库恢复和使用归档日志的前滚,主要目的是加快从“意外状态“中恢复。闪回数据库基于闪回日志flashback log,闪回日志包含已修改数据块的”前影像“,可用于将数据库恢复到该时间点之前的状态。闪回数据库允许复原整个数据库到具体的时间点,从而撤销该时间点以来的所有数据库的变化

用户误删除表中数据、

删除表、

truncate

表、

索引、

触发器,

表空间等。

Dba

误操作等。简而言之,所有操作都可以闪回。


Flashback Database enables you to rewind the database to a previous point in time without restoring backup copies of the datafiles.--闪回数据库能够使你在不恢复数据文件备份的情况下使数据库倒回到先去的某个时间点。
You can flash back a database from both RMAN and SQL*Plus with a single command instead of using a complex procedure.--你可以通过RMAN或者SQLPLUS来闪回数据库,替代使用复杂的过程。
使用数据库闪回可撤销导致逻辑数据损坏的变更,如果是介质丢失或者物理损坏,则必须使用传统的恢复方法进行数据库的恢复。闪回数据库不需要恢复数据文件,以此恢复数据库的数据与所需要恢复的数据条目成正比,和数据库的大小无关。闪回数据库头通过闪回日志来进行数据恢复,数据库会定期将数据快的前影像记录在闪回日志里面

Requirements for Enabling Flashback Database

The requirements for enabling Flashback Database are:

  • Your database must be running in ARCHIVELOG mode, because archived logs are used in the Flashback Database operation.

  • You must have a flash recovery area enabled, because flashback logs can only be stored in the flash recovery area.

  • For Real Application Clusters databases, the flash recovery area must be stored in a clustered file system or in ASM.

---数据库必须在归档模式下,因为在闪回数据库过程中需要有归档日志文件
--必须有闪回恢复区,闪回日志只能存放在flash recovery area里面
--在rac模式下,闪回恢复区必须存在在一个集群文件系统

首先开启数据库归档模式
SQL> startup mount;
ORACLE instance started.
Total System Global Area  314572800 bytes
Fixed Size                  1219184 bytes
Variable Size              83887504 bytes
Database Buffers          226492416 bytes
Redo Buffers                2973696 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.

SQL> archive log list
Database log mode              Archive Mode  --归档模式
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     29--最老的在线日志
Next log sequence to archive   31--将要归档的日志
Current log sequence           31 ---当前日志
SQL> alter database open;
Database altered.
SQL> select SEQUENCE#,STATUS from v$log;

 SEQUENCE# STATUS
---------- ----------------
        31 CURRENT---当前日志
        29 INACTIVE
        30 INACTIVE

SQL> alter system set log_archive_dest_1='location=/u01/app/oracle/arch' scope=spfile;  --修改归档日志的目录
System altered.
SQL> show parameter log_archive_format
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_format                   string      %t_%s_%r.dbf

%s: 日志序列号:

%t: 重做线程编号.

%d: 数据库ID

%r RESETLOGSID.



设置闪回数据库参数
设置数据库闪回的三个参数:
db_recovery_file_dest_size  闪回恢复区大小
db_recovery_file_dest  闪回恢复区路径,该参数可以任意指定,闪回日志记录了数据库的前影像,该日志不会进行归档,一但停用数据库的闪回功能,该目录下的日志会
自动清除
db_flashback_retention_target  保留恢复最近多长时间的数据,单位为分钟。
SQL> alter system set db_recovery_file_dest_size=5G;
System altered.
SQL> alter system set db_recovery_file_dest='/home/oracle/flash';
System altered.
SQL> alter system set db_flashback_retention_target=2440;  --分钟  2天,系统默认是1天
System altered.

开启数据库闪回功能
SQL> startup mount
ORACLE instance started.
Total System Global Area  314572800 bytes
Fixed Size                  1219184 bytes
Variable Size              75498896 bytes
Database Buffers          234881024 bytes
Redo Buffers                2973696 bytes
Database mounted.
SQL> alter database flashback on;
Database altered.
SQL> alter database open;
Database altered.
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES

闪回数据库语法:


v$flashback_database_stat--用于监视闪回数据库日志中记录闪回数据的开销,包含24小时的信息,每行代表一个小时的时间间隔,可以确定数据生成的变化,
FLASHBACK_DATA和REDO_DATA分别表示时间间隔内写入的闪回字节数和重做日志字节数
v$flashback_database_log---记录闪回日志信息,包括最早可以回复的SCN,闪回日志的大小
v$flash_recovery_area_usage---监控闪回恢复区的使用情况
基于SCN的闪回,有两只方式 SQL和RMAN

---------------------
SQL> insert into t values(1,1);
1 row created.
SQL> commit;
Commit complete.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
-----------------------
                 1242503
SQL> insert into t values(2,2);
1 row created.
SQL> commit;
Commit complete.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
-----------------------
                 1242520
SQL> insert into t values(3,3);
1 row created.
SQL> commit;
Commit complete.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1242533
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area  314572800 bytes
Fixed Size                  1219184 bytes
Variable Size              75498896 bytes
Database Buffers          234881024 bytes
Redo Buffers                2973696 bytes
Database mounted.
SQL> flashback database to scn 1242503;----闪回到第一次commit的时候
Flashback complete.
SQL> alter database open resetlogs;
Database altered.
SQL> select * from t;  ---闪回数据库测试正常
         A          B
---------- ----------
         1          1
SQL> 
---------------------------------------
TO timestamp---例子
 flashback database to timestamp to_date('2011-07-12 10:20:59','yyyy-mm-dd hh24:mi:ss');


小结:

    oracle10g数据库提供了闪回功能,无论对开发人员,还是DBA人员提供了便捷的处理逻辑数据丢失的处理方法,非常实用。

jiangkch

20140319
-----------------------------------------








来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26937943/viewspace-1127388/,如需转载,请注明出处,否则将追究法律责任。

上一篇: oracle scheduler任务
请登录后发表评论 登录
全部评论

注册时间:2013-05-30

  • 博文量
    154
  • 访问量
    472754