当前位置: 代码迷 >> 综合 >> ORACLE 10g FLASHBACK (二)
  详细解决方案

ORACLE 10g FLASHBACK (二)

热度:89   发布时间:2023-12-14 07:20:13.0

关于ORACLE FLASHBACK特性
      从9i版本开始,Oracle通过DBMS_FLASHBACK包提供flashback query功能,Oracle 10g版本进一步扩展了flashback功能,利用flashabck我们可以做到flashback query,flashback table,flashback database等操作.

      flashback table与9i的flashback query相似,但是说明的是,flashback table不等于flashback query,所谓query,仅仅是查询以前的一个快照点而已,并不改变当前表的状态,而flashback table不一样,将改变当前表及附属对象一起回到以前的时间点。
  其实9i的flashback query在10g中也有了新的变化,10g中可以简单的利用以下语句实现flashback query,而不再需要象9i那样需要调用DBMS_FLASHBACK包。
  SELECT * FROM TABLENAME AS OF TIMESTAMP
  TO_TIMESTAMP('2010-08-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
  WHERE ……;

 

提示:如果需要flashback一个表,需要保证
    需要有flashback any table的系统权限或者是该表的flashback对象权限。
    需要有该表的SELECT, INSERT, DELETE, ALTER权限
    必须保证该表ROW MOVEMENT

      sys用户不能使用回收站闪回表工作

 

闪回恢复已经在上一节设置好,下面我们开始做闪回例子
--测试用例环境 DB:10.2.0.4 OS:rhel5.4

 

1.Flashback Query
1).原理:Flashback Query通过Undo数据,利用一致读的方法来查找用户需要的数据.
2).使用范围:查找指定时间点被删除(delete,被update)的数据
3).注意点:1).闪回时间受参数undo_retention影响 2).闪回时间受undo表空间大小影响 3).查询之前的快照点,并不改变当前表的状态
4).语法:1).select ... from table_name as of timestamp ... 2).select ... from table_name as of scn ...
5).举例:
SQL>create table test(id number,scn number,time varchar2(20));

Table created.
SQL>begin
  2  for i in 1..20
  3  loop
  4  insert into test values(i,dbms_flashback.get_system_change_number(),to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')); --插入scn和sysdate为了后面查询方便明了
  5  commit;   --如果不加commit 会造成scn都是一样的
  6  dbms_lock.sleep(3); --估计加大插入间隔
  7  end loop;
  8  end;
  9  /

PL/SQL procedure successfully completed.

SQL>select * from test;

        ID        SCN TIME
---------- ---------- ----------------------------------------
         1    1648243 2010-08-12 11:10:52
         2    1648245 2010-08-12 11:10:55
         3    1648247 2010-08-12 11:10:58
         4    1648249 2010-08-12 11:11:01
         5    1648251 2010-08-12 11:11:04
         6    1648253 2010-08-12 11:11:07
         7    1648255 2010-08-12 11:11:10
         8    1648257 2010-08-12 11:11:13
         9    1648259 2010-08-12 11:11:16
        10    1648261 2010-08-12 11:11:19
        11    1648263 2010-08-12 11:11:22
        12    1648265 2010-08-12 11:11:25
        13    1648267 2010-08-12 11:11:28
        14    1648269 2010-08-12 11:11:31
        15    1648271 2010-08-12 11:11:34
        16    1648274 2010-08-12 11:11:37
        17    1648276 2010-08-12 11:11:40
        18    1648278 2010-08-12 11:11:43
        19    1648280 2010-08-12 11:11:46
        20    1648282 2010-08-12 11:11:49

20 rows selected.

SQL>select * from test as of scn 1648247;  --根据自己实际数据,我选择的是第3条数据

        ID        SCN TIME
---------- ---------- ----------------------------------------
         1    1648243 2010-08-12 11:10:52
         2    1648245 2010-08-12 11:10:55

SQL>select * from test as of timestamp  to_timestamp('2010-08-12 11:10:58','yyyy-mm-dd hh24:mi:ss'); --根据自己实际数据,同样是第3条数据

        ID        SCN TIME
---------- ---------- ----------------------------------------
         1    1648243 2010-08-12 11:10:52
         2    1648245 2010-08-12 11:10:55
         3    1648247 2010-08-12 11:10:58

--从上面例子也可以看出scn和timestamp并不是完全对应的.在实际案例中我们往往忽略这些微小差别.

 

 


2.Flashback Table
1).原理:Flashback Table也是利用Undo数据来恢复对象到指定时间点
2).使用范围:恢复当前表及其相关对象到某个时间点
3).注意点:1).闪回时间受参数undo_retention影响 2).闪回时间受undo表空间大小影响 3).和flashback query有差别,恢复表到以前的时间点 4).flashback之前要先允许row movement
4).语法:1).flashback table table_name to timestamp .... 2).flash table table_name to scn ... 3).flashback table table_name to timestamp ... enable triggers.
5).举例
SQL>select * from test;

        ID        SCN TIME
---------- ---------- ----------------------------------------
         1    1648243 2010-08-12 11:10:52
         2    1648245 2010-08-12 11:10:55
         3    1648247 2010-08-12 11:10:58
         4    1648249 2010-08-12 11:11:01
         5    1648251 2010-08-12 11:11:04
         6    1648253 2010-08-12 11:11:07
         7    1648255 2010-08-12 11:11:10
         8    1648257 2010-08-12 11:11:13
         9    1648259 2010-08-12 11:11:16
        10    1648261 2010-08-12 11:11:19
        11    1648263 2010-08-12 11:11:22
        12    1648265 2010-08-12 11:11:25
        13    1648267 2010-08-12 11:11:28
        14    1648269 2010-08-12 11:11:31
        15    1648271 2010-08-12 11:11:34
        16    1648274 2010-08-12 11:11:37
        17    1648276 2010-08-12 11:11:40
        18    1648278 2010-08-12 11:11:43
        19    1648280 2010-08-12 11:11:46
        20    1648282 2010-08-12 11:11:49

20 rows selected.

SQL>alter table test enable row movement;  --允许数据库移动列

Table altered.

SQL>flashback table test to  timestamp  to_timestamp('2010-08-12 11:11:40','yyyy-mm-dd hh24:mi:ss');  --flashback到某一时间点

Flashback complete.

SQL>select * from test;  --表的数据已经改变

        ID        SCN TIME
---------- ---------- ----------------------------------------
         1    1648243 2010-08-12 11:10:52
         2    1648245 2010-08-12 11:10:55
         3    1648247 2010-08-12 11:10:58
         4    1648249 2010-08-12 11:11:01
         5    1648251 2010-08-12 11:11:04
         6    1648253 2010-08-12 11:11:07
         7    1648255 2010-08-12 11:11:10
         8    1648257 2010-08-12 11:11:13
         9    1648259 2010-08-12 11:11:16
        10    1648261 2010-08-12 11:11:19
        11    1648263 2010-08-12 11:11:22
        12    1648265 2010-08-12 11:11:25
        13    1648267 2010-08-12 11:11:28
        14    1648269 2010-08-12 11:11:31
        15    1648271 2010-08-12 11:11:34
        16    1648274 2010-08-12 11:11:37
        17    1648276 2010-08-12 11:11:40

17 rows selected.

SQL>flashback table test to  scn 1648274;

Flashback complete.

SQL>select * from test;

        ID        SCN TIME
---------- ---------- ----------------------------------------
         1    1648243 2010-08-12 11:10:52
         2    1648245 2010-08-12 11:10:55
         3    1648247 2010-08-12 11:10:58
         4    1648249 2010-08-12 11:11:01
         5    1648251 2010-08-12 11:11:04
         6    1648253 2010-08-12 11:11:07
         7    1648255 2010-08-12 11:11:10
         8    1648257 2010-08-12 11:11:13
         9    1648259 2010-08-12 11:11:16
        10    1648261 2010-08-12 11:11:19
        11    1648263 2010-08-12 11:11:22
        12    1648265 2010-08-12 11:11:25
        13    1648267 2010-08-12 11:11:28
        14    1648269 2010-08-12 11:11:31
        15    1648271 2010-08-12 11:11:34

15 rows selected.

 


3.Flashback Drop(RecycleBin)
1).原理:利用类似于windows的回收站来支持flashback drop(当表被删除时,数据库仅仅修改一下相关对象的名字,flashback过程相当于重新命名回来而已)
2).使用范围:恢复被误删除的表极其相关对象
3).注意点:1).闪回主要看回收站大小 2).truncate对象不能被flashback
4).语法:1).flashback table table_name to before drop 2).flashback table table_name to before drop rename to new_table_name;
5).举例
SQL>drop table test;  --首先drop表
Table dropped.

SQL>select * from test;  --表已经不存在
select * from test
              *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL>flashback table test to before drop;  --通过flashback drop恢复表

Flashback complete.

SQL>select * from test;    --表已经恢复

        ID        SCN TIME
---------- ---------- ----------------------------------------
         1    1648243 2010-08-12 11:10:52
         2    1648245 2010-08-12 11:10:55
         3    1648247 2010-08-12 11:10:58
         4    1648249 2010-08-12 11:11:01
         5    1648251 2010-08-12 11:11:04
         6    1648253 2010-08-12 11:11:07
         7    1648255 2010-08-12 11:11:10
         8    1648257 2010-08-12 11:11:13
         9    1648259 2010-08-12 11:11:16
        10    1648261 2010-08-12 11:11:19
        11    1648263 2010-08-12 11:11:22
        12    1648265 2010-08-12 11:11:25
        13    1648267 2010-08-12 11:11:28
        14    1648269 2010-08-12 11:11:31
        15    1648271 2010-08-12 11:11:34

15 rows selected.


4.Flashback Version Query
1).原理:利用Undo来查看多版本
2).使用范围:查看行改变情况
3).注意点:1).闪回时间受参数undo_retention影响 2).闪回时间受undo表空间大小影响 3).查询行改变情况,并不改变当前表的状态
4).语法:1).select * from table_name versions between timestamp  ... and ... 2).select * from table_name versions between scn ... and ...
5).举例
--我们可能用到的伪劣:versions_starttime,versions_startscn,versions_endscn,versions_endtime,versions_xid,versions_operation这些伪列性质和rownum等是一样的

SQL>delete from test where scn >1648261;

5 rows deleted.

SQL>commit;
SQL>column  VERSIONS_STARTTIME format a25;
SQL> select versions_starttime,versions_operation,id ,scn,time from jane.t versions between timestamp  to_timestamp('
2010-08-12 11:50:00','yyyy-mm-dd hh24:mi:ss') and maxvalue order by versions_starttime,id;

VERSIONS_STARTTIME        VE         ID        SCN TIME
------------------------- -- ---------- ---------- ----------------------------------------
12-AUG-10 11.50.12 AM     D          11    1648263 2010-08-12 11:11:22
12-AUG-10 11.50.12 AM     D          12    1648265 2010-08-12 11:11:25
12-AUG-10 11.50.12 AM     D          13    1648267 2010-08-12 11:11:28
12-AUG-10 11.50.12 AM     D          14    1648269 2010-08-12 11:11:31
12-AUG-10 11.50.12 AM     D          15    1648271 2010-08-12 11:11:34
                                      1    1648243 2010-08-12 11:10:52
                                      2    1648245 2010-08-12 11:10:55
                                      3    1648247 2010-08-12 11:10:58
                                      4    1648249 2010-08-12 11:11:01
                                      5    1648251 2010-08-12 11:11:04
                                      6    1648253 2010-08-12 11:11:07
                                      7    1648255 2010-08-12 11:11:10
                                      8    1648257 2010-08-12 11:11:13
                                      9    1648259 2010-08-12 11:11:16
                                     10    1648261 2010-08-12 11:11:19
                                     11    1648263 2010-08-12 11:11:22
                                     12    1648265 2010-08-12 11:11:25
                                     13    1648267 2010-08-12 11:11:28
                                     14    1648269 2010-08-12 11:11:31
                                     15    1648271 2010-08-12 11:11:34

20 rows selected.
--从上面信息可以看出我们在“12-AUG-09 11.50.12 AM ”时间做了D(删除)操作,删除的数据是id在11和15之间的.

 

 

5.Flashback Database
数据库可以通过flashback log来回到之前的某个时间点.

SQL>flashback database to timestamp to_timestamp('2010-08-12 23:33:34','yyyy-mm-dd hh24:mi:ss');

Flashback complete.

SQL>alter database open read only;

Database altered.

SQL> select count(*) from test;

  COUNT(*)
----------
      20

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  171966464 bytes
Fixed Size                  2082496 bytes
Variable Size             125831488 bytes
Database Buffers           37748736 bytes
Redo Buffers                6303744 bytes
Database mounted.
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

--一旦resetlogs之后,就再也不能flashback database 到resetlogs之前的状态了,所以之前用open read only检查一下是否flashback 成功了。


SQL>alter database open resetlogs;

Database altered.

SQL> select count(*) from test;

  COUNT(*)
----------
      22

//通过v$flash_recovery_area_usage视图可以查到闪回区的使用情况。
//通过v$flashback_database_log视图可以查到flashback database能恢复到最早的时间和SCN号。

  相关解决方案