oracle 闪回区的作用,Oracle10g的闪回功能详解

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 OFSpecifyASOFto retrieve the single version of the rows returned by the query at a particular change number (SCN) or timestamp. If you specifySCN, thenexprmust evaluate to a number. If you specifyTIMESTAMP, thenexprmust 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了索引,那闪回到创建索引的时间点时,索引是变成没有了。

闪回表的命令如下:

bb

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 BinOracle 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 DatabaseThe 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 RESETLOGS的ID值.

设置闪回数据库参数

设置数据库闪回的三个参数:

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

闪回数据库语法:

e1a131dd452ea96f53ae54216fd58f6c.gif

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

-----------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值