oracle中闪回技术小结

已有 858 次阅读2013-8-31 17:13 |个人分类:oracle历程| oracle, 技术, oracle, oracle, oracle

我在这里就不啰嗦了,直接进入正题。
一、闪回技术的前提(具有DBA权限的用户下查看)
oracle中recyclebin默认是开启的,不过我们也可以查看下参数:
show parameter recyclebin
//显示recyclebin的参数
alter system set recyclebin=on
//修改参数

二、闪回技术的处理过程
       当一个表被删除时,它并不是真的被删除,而是被放到了回收站(recyclebin)里,只要这个表还在回收站,它就可以被重新恢复(闪回)回来。该回收站放在表所在的表空间,如果用户创建一个新表时,没有足够的磁盘空间,oracle将使用回收站的磁盘空间。因此,在创建表空间时最好留出足够的磁盘空间以方便日后进行恢复工作。
    使用回收站的基本操作:  
  1、显示回收站中被删除的表 
 SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME 
---------------- ------------------------------ ------------ ------------------- 
A BIN$CXoDVvQJS/auf5fztisvmg==$0 TABLE 2012-05-23:13:29:43    
2、清除回收站中的表: SQL> purge table a;   
3、清空回收站: SQL> purge recyclebin;

三、什么情况下使用闪回技术
   1. 错误的delete,update,insert一条记录,并且commit
   2. 错误地删除了一个表: drop table
   3. 查询某个表的历史记录(所有已经提交了的历史记录)
四、常用的闪回类型
 1. 闪回表    
   2. 闪回错误的增删改操作 
   3.查询闪回

五、闪回已删除的表
   
   以下操作模拟删除scott用户中的表a,然后闪回。
   
SQL>connect scott/tiger

SQL> select * from cat;(or:select table_name from user_tables;)
TABLE_NAME                     TABLE_TYPE
------------------------------ -----------
DEPT                           TABLE
EMP                            TABLE
BONUS                          TABLE
SALGRADE                       TABLE
A                              TABLE

SQL> drop table a;
表已删除。

SQL> select * from cat;
TABLE_NAME                     TABLE_TYPE
------------------------------ -----------
DEPT                           TABLE
EMP                            TABLE
BONUS                          TABLE
SALGRADE                       TABLE
BIN$CXoDVvQJS/auf5fztisvmg==$0 TABLE

   在上面显示中有BIN开头的表,其实它们是回收站中被删除的表。
   显示回收站中被删除的表

SQL> show  recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
A                BIN$CXoDVvQJS/auf5fztisvmg==$0 TABLE        2012-05-23:13:29:43

   闪回被删除的表A
   
SQL>flashback table a to before drop;


注意:
   如果使用以下语句删除表将无法闪回。   
SQL> drop  table  a  PURGE;

六、闪回错误的dml操作
闪回错误的DML操作的表,实际上是将表中的数据快速恢复到过去的一个是焦点或者系统改变号SCN上。实现表的闪回,需要使用到与撤销表空间相关的undo信息,通过show parameter undo命令可以了解这些信息。
   用户对表数据的修改操作,都记录在撤销表空间中,这为表的闪回提供了数据恢复的基础。例如,某个修改操作在提交后被记录在撤销表空间中,保留时间为900秒,用户可以在这900秒的时间内对表进行闪回操作,从而将表中的数据恢复到修改之前的状态。
   SQL> conn system/jsj
   已连接。
   SQL> show parameters undo;
   
   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- ------------
   undo_management                      string      AUTO
   undo_retention                       integer     900
   undo_tablespace                      string      UNDOTBS1
   
   如果闪回两个小时之内的DML操作,则要修改undo_retention参数值为7200秒;
   SQL> alter system set undo_retention=7200;
  
  系统已更改。
  
  SQL> show parameters undo;
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------
  undo_management                      string      AUTO
   undo_retention                       integer     7200
  undo_tablespace                      string      UNDOTBS1

    案例:修改scott用户的员工表emp,不小心使得所有员工的工资都为10000,那么该如何恢复回原来的工资数据呢?
    具体步骤如下:
修改员工工资数据为10000:
SQL>connect scott/tiger;

SQL>update emp set sal=10000;
使用带有versions子句的查询语句查询versions_xid(事物号)和相关信息,SCN是当数据库更新后,由DBMS自动维护去累积递增的一个数字。
SQL>select versions_xid,empno,ename,sal
    From emp
    Versions between scn minvalue and maxvalue
    Where empno=7900;
提交DML操作
SQL>commit;
再出查看versions_xid(事物号)和相关信息,注意与步骤2显示结果的区别。
SQL>select versions_xid,empno,ename,sal
    From emp
    Versions between scn minvalue and maxvalue
    Where empno=7900;
使用数据字典flashback_transaction_query中获取以上步骤提交事物的DML操作和恢复工资原来值所需要的SQL命令(undo_sql),其中,xid为步骤4查询结果中的versions_xid。
   SQL> conn system/jsj
SQL>select  operation,undo_sql
    From flashback_transaction_query
    Where xid=hextoraw('060015006C010000');
获取第3步操作所提交的事物所对应的scn号,假设获取的scn号为1189481。
SQL>select  operation,start_scn
    From flashback_transaction_query
    Where xid=hextoraw('060015006C010000');
在闪回之前,将要闪回表的行移动功能打开,Oracle默认是关闭的。
SQL>alter table scott.emp enable row movement;
假设第6步操作所提交的事物所对应的scn号为1189481,现在恢复到该scn号所对应的状态,即恢复回修改工资之前的状态。
SQL>flashback table scott.emp to scn 1189481;
查询是否恢复成功。
SQL>select * from scott.emp;

七、闪回数据库
不罗嗦直接给案例:
SQL> show user
USER 为 "SYS"

SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列     31
下一个存档日志序列   33
当前日志序列           33

SQL> SHOW PARAMETER DB_RECOVERY_FILE

NAME                                 TYPE        VALUE                          
------------------------------------ ----------- ------------------------------ 
db_recovery_file_dest                string      C:\oracle\product\10.2.0/flash 
                                                 _recovery_area                 
db_recovery_file_dest_size           big integer 2G  
                           
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area  167772160 bytes                                       
Fixed Size                  1247900 bytes                                       
Variable Size             100664676 bytes                                       
Database Buffers           62914560 bytes                                       
Redo Buffers                2945024 bytes                                       
数据库装载完毕。


SQL> ALTER DATABASE FLASHBACK ON;//注:如果归档没用启用flashback区的不能打开的

数据库已更改。

SQL> alter database open;

数据库已更改。

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;

系统已更改。

SQL> show parameter db_flashback_retention_target

NAME                                 TYPE        VALUE                          
------------------------------------ ----------- ------------------------------ 
db_flashback_retention_target        integer     2880                           
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

会话已更改。

SQL> select sysdate from dual;

SYSDATE                                                                         
-------------------                                                             
2013-06-26 22:39:53                                                             

SQL> set time on
22:40:02 SQL> SELECT CURRENT_SCN FROM V$DATABASE; //数据库没打开的情况下scn为0

CURRENT_SCN                                                                     
-----------                                                                     
    1210823                                                                     

22:41:33 SQL> drop user scott cascade;

用户已删除。

22:44:05 SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

22:49:34 SQL> STARTUP MOUNT EXCLUSIVE
ORACLE 例程已经启动。

Total System Global Area  167772160 bytes                                       
Fixed Size                  1247900 bytes                                       
Variable Size             104858980 bytes                                       
Database Buffers           58720256 bytes                                       
Redo Buffers                2945024 bytes                                       
数据库装载完毕。

22:49:52 SQL> FLASHBACK DATABASE TO TIMESTAMP(TO_TIMESTAMP('2013-06-26 22:39:53','YYYY-MM-DD HH24:MI:SS'));

闪回完成。

22:51:57 SQL> ALTER DATABASE FLASHBACK off;

数据库已更改。

22:53:33 SQL> alter database open resetlogs;

数据库已更改。

22:54:20 SQL> conn scott/tiger
已连接。
22:54:39 SQL> select * from cat;

TABLE_NAME                     TABLE_TYPE                                       
------------------------------ -----------                                      
BONUS                          TABLE                                            
SALGRADE                       TABLE                                            
BIN$XAiN1M2YQVqfnsKPBgtGyA==$0 TABLE                                            
BIN$As3gME+tSY6gGc4ISkPpgg==$0 TABLE                                            
A                              TABLE                                            
DEPT                           TABLE                                            
EMP                            TABLE                                            

已选择7行。





路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 加入社区

意见
反馈