闪回(待修改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;
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
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中的名称】
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
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);
补充:
----------------------------------------------------------------------------------------------
【表空间,数据段,区,数据块】
表空间(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