闪回

闪回(待修改20150114)

 

oracle 9i****************************************************************

flashback query【闪回查询】:

          由 dbms_flachback 包实现;

          每5分钟记录一次SCN,同时将SCN号和当时的时间映射做一个记录;

          9i的闪回都是依赖于SCN号的,如果根据时间来闪回,会自动找到和闪回时间最近的那次SCN时间,来做闪回操作;

          按照SCN号来进行闪回,才能更精确的恢复误操作;

          对于超出了undo_retention时间参数定义的时间的操作,不能保证成功;

          9i不能恢复drop,truncate等不记录回滚的误操作;

          对于5天前的数据,不能恢复;

 

1.相关参数设置

SQL> show parameter undo

    NAME                                 TYPE        VALUE                         

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

    undo_management                      string      AUTO                          

    undo_retention                       integer     900                           

    undo_tablespace                      string      UNDOTBS1 

 

undo_management参数必须为AUTO,默认为AUTO;

undo_retention参数表示往回能回滚的最大时间,单位为秒,默认为15分钟;修改语句为:

    alter system set undo_retention=1200;

 

--环境配置-----------------------------



--使用sys用户以sysdba登陆

grant execute dbms_flashback to scott;



--切换到scott用户

create sequence test_seq01;

create table test_scn(id_ number,comment_ varchar2(100),time_ date,scn_ varchar2(10));

--建测试表

insert into test_scn values(1,'建表前',sysdate,dbms_flashback.get_system_change_number);

commit;

create table test_table_flash01(id_ number);

insert into test_scn values(2,'建表后',sysdate,dbms_flashback.get_system_change_number);

commit;

--插入数据

declare a number;

begin

loop

insert into test_table_flash01 values(test_seq01.nextval);

commit;

select test_seq01.currval into a from dual;

exit when a=20;

end loop;

end;

insert into test_scn values(3,'插入数据后',sysdate,dbms_flashback.get_system_change_number);

commit;

--删除数据

delete from test_table_flash01 where id_<10;

commit;

insert into test_scn values(4,'删除数据后',sysdate,dbms_flashback.get_system_change_number);

commit;

--删除表

drop table test_table_flash01;

insert into test_scn values(5,'删除表后',sysdate,dbms_flashback.get_system_change_number);

commit;



select * from test_table_flash01;

select * from test_scn;



--闪回-----------------------------



declare

       time__ date;

       scn__ varchar2(10);

begin

       --exec dbms_flashback.disable();--在再次启动闪回操作之前,必须先将其禁用;

       select time_,scn_ into time__,scn__ from test_scn where id_=3;

       --dbms_flashback.enable_at_time(time__);

       dbms_flashback.enable_at_system_change_number(scn__);

end;

--禁用闪回模式

/*注意disable存储过程的调用方法:直接调用;

在pl/sql中加上execute会报错,尚未找到原因,如:execute dbms_flashback.disable;

oracle版本:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production;

pl/sql版本:PL/SQL Release 11.2.0.1.0 - Production;

*/

begin

      dbms_flashback.disable; 

end;



--环境恢复-----------------------------

drop sequence test_seq01;

drop table test_scn;

drop table test_table_flash01;
View Code

 

 

oracle 10g****************************************************************

 

flashback database

--实例环境准备-----------------------------

--关闭实例

SQL> shutdown immediate

--开启实例到mount状态下

SQL> startup mount

--开启归档模式

SQL> alter database archivelog

--开启回滚模式

SQL> alter database flashback on

--打开数据库

SQL> alter database open 



--表环境准备-----------------------------

create table test_table_scn(id_ number(1),comment_ varchar2(100),scn_ varchar2(10),time_ date);

insert into test_table_scn values(1,'建表【test_table_flash01】前',dbms_flashback.get_system_change_number,sysdate);

commit;

create table test_table_flash01 as select * from dept;

insert into test_table_scn values(2,'建表【test_table_flash02】前',dbms_flashback.get_system_change_number,sysdate);

commit;

create table test_table_flash02 as select * from dept;

insert into test_table_scn values(3,'建表【test_table_flash03】前',dbms_flashback.get_system_change_number,sysdate);

commit;

create table test_table_flash03 as select * from dept;

insert into test_table_scn values(4,'drop表【test_table_flash01】前',dbms_flashback.get_system_change_number,sysdate);

commit;

drop table test_table_flash01;

insert into test_table_scn values(5,'truncate表【test_table_flash02】前',dbms_flashback.get_system_change_number,sysdate);

commit;

truncate table test_table_flash02;

insert into test_table_scn values(5,'完成',dbms_flashback.get_system_change_number,sysdate);

commit;



--闪回-----------------------------

--关闭实例

SQL> shutdown immediate

--开启实例到mount状态下

SQL> startup mount

--执行语句

SQL> flashback database to scn 4758912;

/* 也可以这样写

SQL> flashback database to timestamp to_timestamp('2015-01-12 16:17:11','yyyy-mm-dd hh24:mi:ss');

SQL> flashback database to timestamp(sysdate-5/1440);

SQL> flashback database to time to_date(xxx);

SQL> flashback database to sequence xxx thread 1;

*/

--打开数据库【resetlogs: 防止陈旧的数据进入数据库(保证数据库的一致性)】

SQL> alter database open noresetlogs





--环境恢复-----------------------------

--删除创建的相关对象

drop table test_table_scn;

drop table test_table_flash02;

drop table test_table_flash03;

--关闭实例

SQL> shutdown immediate

--开启实例到mount状态下

SQL> startup mount

--关闭 flashback 功能

SQL> alter database flashback off;

--开启数据库

SQL> alter database open
View Code

 

 flashback drop

10g将被drop的表放入回收站,回收站的对象在如下情况下将被清除:   ·由于添加新的对象引起表空间的空间不够或者用户的空间配额不够   ·表空间需要扩展新区间来增长空间   ·手工发purge命令或flashback命令 当表被drop后,其所属表空间不会被释放,其相关信息会被记录到 recycle bin 中,其中每一个对象都有一个唯一的名字; 10g中flashback drop功能默认为启动; 对于非SYSTEM表空间,同时也是本地管理的表空间才能使用flashback drop功能;

--连接数据库

SQL> conn scott/admin

--开启回收站功能

SQL> alter system set recyclebin=on;

--清空回收站

SQL> purge recyclebin

--建表和删表

create table test__(id_ number(10));

insert into test__ values(1);

commit;

drop table test__;

--查询回收站

select * from recyclebin order by createtime;

select * from user_recyclebin order by createtime;

select * from dba_recyclebin order by createtime;

--闪回

法一:flashback table test__ to before drop;

法二:flashback table BIN$OvNF88wATiqJua5ZmTInlA==$0 to before drop;【BIN$OvNF88wATiqJua5ZmTInlA==$0 指的是test__在recyclebin中的名称】
View Code

 

flash version query

利用flash version query,可以分析到什么时间执行了什么操作的问题。也可以用于记录的审计,而没有必要去开启细粒度审计功能或者是使用LOGMNR了; 被查询的对象不能被drop;

--环境准备

create table test_table_flashq01(id_ number(10),time_ date);

insert into test_table_flashq01 values(1,sysdate);

commit;

insert into test_table_flashq01 values(2,sysdate);

commit;

delete from test_table_flashq01 where id_=2;

commit;

--查询对象的变更

select versions_starttime,versions_endtime,versions_startscn,versions_endscn,versions_xid 事物id,versions_operation, id_,time_

from test_table_flashq01 versions between timestamp minvalue and maxvalue

order by VERSIONS_STARTTIME;

--依据scn号查询

select versions_starttime, versions_endtime, id_,time_

from test_table_flashq01 versions between scn 4818913 and 4818916
View Code

 

flashback transaction query

可以从FLASHBACK_TRANSACTION_QUERY视图中获得事务的相关信息以及Undo_sql;

 

SQL> desc FLASHBACK_TRANSACTION_QUERY;

Name             Type           Nullable Default Comments              

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

XID              RAW(8)          Y       Transaction identifier 

START_SCN        NUMBER       Y       Transaction start SCN  

START_TIMESTAMP  DATE         Y       Transaction start timestamp 

COMMIT_SCN       NUMBER      Y       Transaction commit SCN

COMMIT_TIMESTAMP DATE         Y      Transaction commit timestamp

LOGON_USER       VARCHAR2(30)  Y      Logon user for transaction 

UNDO_CHANGE#     NUMBER      Y      1-based undo change number

OPERATION        VARCHAR2(32)   Y      forward operation for this undo

TABLE_NAME       VARCHAR2(256)  Y     table name to which this undo applies   

TABLE_OWNER      VARCHAR2(32)  Y     owner of table to which this undo applies

ROW_ID           VARCHAR2(19)    Y     rowid to which this undo applies        

UNDO_SQL         VARCHAR2(4000)  Y     SQL corresponding to this undo 

 

--环境配置

--授予管理员权限

GRANT SELECT ANY TRANSACTION TO SCOTT;

--模拟dml操作

SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL; 

    得到当前scn:1280791  

create table test_table_flashq01(id_ number(10),time_ date);

insert into test_table_flashq01 values(1,sysdate);

commit;

insert into test_table_flashq01 values(2,sysdate);

commit;

delete from test_table_flashq01 where id_=2;

commit;

SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL; 

    得到当前scn:1280801 

--查询可得到两个scn之间的行变化

SELECT XID,COMMIT_SCN,COMMIT_TIMESTAMP,OPERATION,UNDO_SQL

FROM FLASHBACK_TRANSACTION_QUERY Q 

WHERE Q.XID IN(

    SELECT VERSIONS_XID FROM test_table_flashq01 VERSIONS BETWEEN SCN 1280791 AND 1280801);
View Code

 

 

 

 

补充:

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

【表空间,数据段,区,数据块】

表空间(tablespace)

    概念:是oracle数据库恢复的最小单位,是最高层的逻辑存储区域;

          oracle至少有一个名称为【system】的表空间;一个表空间可以有一个或者多个存储在任意磁盘的物理数据库文件;

          当表空间有多个数据库文件时,oracle会尽可能均匀的将对象的数据分配到不同数据文件的区中;

          分区指将数据存放到多个表空间中,而不是存放到单个表空间下的多个数据文件中;

    其他:

          select * from dba_tablespaces;

          select * from v$tablespace;

          select * from dba_data_files;--##

          select * from dba_temp_files;--##

          select * from v$tempfile;     

数据段(segment)

    概念:数据段是数据库中对象的代表;

          正常情况下,一个对象对应一个数据段,但是针对于分区表,一个分区就表示一个数据段

          一个对象创建时,会为相应的数据段分配1个分区和8个数据块;

    其他:

          select * from dba_segments order by tablespace_name,segment_type,segment_name;       

区(extent)

    概念:一系列连续的数据块的集合;

          随着对象的增大,也即数据段逻辑概念上的增大,会在数据段下分配更多的区,以供数据段管理;

    其他:

          select * from dba_extents order by tablespace_name,segment_type,segment_name,block_id;   

数据块(block)

    概念:是oracle环境下的最小存储单位;

          由于各个操作系统存储数据的形式和方法可能都不一样,oracle想出数据块存储思路,来屏蔽不同操作系统的存储差异;

          无论是在磁盘还是在内存中,进行数据操作的最小单位是数据块;

          建库时,可以通过参数【db_block_size】设置数据块的大小,建库后不可修改;默认为8KB;一个数据库可支持多个数据块大小;

          参数【db_file_multiblock_read_count】表示一次从物理块中读取的数据块数量;

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

【oracle 启动和关闭】

--通常以具有sysdba权限的用户来登陆后处理

启动

启动oracle分为三步:

       创建oracle实例【非安装阶段】:调用init.ora文件

       由实例安装数据库【安装阶段】:控制文件

       打开数据库【打开阶段】:数据文件和日志文件等

启动oracle的命令:

startup nomount

      完成了启动的第一步,创建了一个oracle实例;

      如果想完成接下来的打开数据库的操作,则还需以下动作:

          alter database mount;

          alter database open;

startup mount

      创建实例,并且安装数据库,但没有打开数据库;

      常用于数据库的维护,如更改数据文档属性,归档文件和闪回的处理;

      如果想完成接下来的打开数据库的操作,则还需以下动作:

          alter database open;

startup

      一次性完成打开数据库的三个步骤;

startup restrict

      这种方式可以打开数据库,但只有具有sysdba权限的用户才能使用数据库;

startup force

      强行关闭数据库【shutdown abort】和启动数据库【startup】两个命令的综合命令;

alter database open read only

      以只读方式打开数据库

关闭oracle的命令:

shutdown normal

      等同于shutdown;

      命令发出后,任何新的连接都将不允许连接到数据库,直到所有用户都断开和数据库的连接后,才关闭数据库;

      优点:再次启动时,不需要进行任何的实例恢复;

      缺点:关闭时间长;

shutdown immediate

      常用的关闭数据库的方式;

      正在被处理的sql语句立即中断,未提交的事物全部回滚;

      探查到某用户没有需要回滚的事物或者回滚完成所有事物后,立即断开和这个用户的连接;

shutdown transactional

      命令发生后,任何新的连接都将不允许连接到数据库;

      直到所有活动的事物完成,将立即断开用户都和数据库的连接,然后关闭数据库;

shutdown abort

      一般在无可奈何的情况下,才会使用此手段,类似于长按电源键【本人认为】;

      命令发生后,不回滚,直接断开与用户的连接;

      下次启动时,需要恢复实例;

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

oracle实例:oracle运行的环境,包括内存结构和后台进程;

查看实例名:

      select instance_name,b.* from v$instance b;

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

【参考】

1.Oracle dbms_flashback   

   http://blog.chinaunix.net/uid-25784-id-2458071.html

2.FLASHBACK 中使用到的两张表说明. v$flashback_database_log,v$flashback_database_stat

   http://blog.csdn.net/miyatang/article/details/3167366

 

你可能感兴趣的:(闪回)