闪回的出现:
1、 在Oracle的操作工程中,会不可避免地出现操作失误或者用户失误,例如不小心删除了一个表等,这些失误和错误可能会造成重要数据的丢失,最终导致Oracle数据库停止允许。
2、 在传统意义上,当发生数据丢失、数据错误问题时,解决的主要办法是数据的导入导出、备份恢复技术,这些方法都需要在发生错误前,有一个正确的备份才能进行恢复。
3、 为了减少这方面的损失,Oracle提供了闪回技术。有了闪回技术,就可以实现数据的快速恢复,而且不需要数据备份。
闪回的优点:
1、 恢复中,闪回技术是革命性的进步
2、 传统的恢复技术缓慢:
• 它是整个数据库或者一个文件恢复,不只恢复损坏的数据
• 在数据库日志中每个修改都必须被检查
3、 闪回速度快:
• 通过行和事务把改变编入索引
• 仅仅改变了的数据会被恢复
4、 闪回命令很容易:
• 没有复杂棘手的多步程序
闪回的类型:
1、 闪回表(flashback table)
2、 闪回删除(flashback drop)
3、 闪回版本查询(flashback version query)
4、 闪回事务查询(flashback transaction query
闪回表:
1、 闪回表,实际上是将表中的数据快速恢复到过去的一个是焦点或者系统改变号SCN上。实现表的闪回,需要使用到与撤销表空间相关的undo信息,通过show parameter undo命令可以了解这些信息。
2、 用户对表数据的修改操作,都记录在撤销表空间中,这为表的闪回提供了数据恢复的基础。例如,某个修改操作在提交后被记录在撤销表空间中,保留时间为900秒,用户可以在这900秒的时间内对表进行闪回操作,从而将表中的数据恢复到修改之前的状态。
3、 执行表的闪回,需要有flashback any table的权限
闪回表语法:
FLASHBACK TABLE [schema.]<table_name>
TO
{[BEFORE DROP [RENAME TO table]]
[SCN|TIMESTAMP]expr
[ENABLE|DISABLE]TRIGGERS}
1、 schema:模式名,一般为用户名。
2、 TO TIMESTAMP:系统邮戳,包含年、月、日、时、分、秒。
3、 TO SCN:系统更改号,
4、 ENABLE TRIGGERS:表示触发器恢复以后为enable状态,而默认为disable状态。
5、 TO BEFORE DROP:表示恢复到删除之前。
6、 RENAME TO table:表示更换表名。
7、 注意:闪回表需要将表的行移动功能打开
alter table <table_name> enable row movement;
SQL> --创建一个表
SQL> create table flashbacktable
2 (empno int,
3 ename varchar(20));
SQL> --插入几条数据
SQL> insert into flashbacktable values(1,'Tom');
。。。。。。
闪回方式一:
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2011-05-03 14:22:20
SQL>--删除一条记录用于测试
SQL> delete from flashbacktable where empno=2;
已删除 1 行。
SQL> commit;
SQL>--查看一下表中的内容
SQL> select rowid,empno,ename from flashbacktable;
ROWID EMPNO ENAME
------------------ ---------- --------------------
AAANB0AAEAAAAG4AAA 1 Tom
AAANB0AAEAAAAG4AAC 3 Mike
SQL> --一定要打开表的行移动开关
SQL> alter table flashbacktable enable row movement;
--闪回一下
flashback table flashbacktable to timestamp to_date('2011-05-03 14:22:20','yyyy-mm-dd hh24:mi:ss');
闪回方式二:
SQL> --通过scn号实现同样的功能
SQL> select timestamp_to_scn(to_date('2011-05-03 14:22:20','yyyy-mm-dd hh24:mi:ss')) from dual;
TIMESTAMP_TO_SCN(TO_DATE('2011-05-0314:22:20','YYYY-MM-DDHH24:MI:SS'))
----------------------------------------------------------------------
1035398
SQL> delete from flashbacktable where empno=2;
已删除 1 行。
SQL> commit;
提交完成。
SQL> select * from flashbacktable;
EMPNO ENAME
---------- --------------------
1 Tom
3 Mike
SQL> --执行闪回
SQL> flashback table flashbacktable to scn 1035398;
闪回表:需要考虑的事情
FLASHBACK TABLE命令作为单一的事务执行,会得到一个单一的DML锁
表的统计数据不会被闪回
当前的索引和从属的对象会被维持
闪回表操作:
• 系统表不能被闪回
• 不能跨越DDL操作
• 会被写入警告日志
• 产生撤销和重做的数据
闪回删除:
1、 闪回删除,实际上从系统的回收站中将已删除的对象,恢复到删除之前的状态。
2、系统的回收站只对普通用户有作用。
SQL> show recyclebin –-显示回收站
SQL> drop table flashbacktable; --删除表
表已删除。
SQL> show recyclebin --查看删除后 回收站
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
FLASHBACKTABLE BIN$x2GKs3ZcT2ixhdM2d5Krig==$0 TABLE 2011-05-03:14:31:23
SQL> --只有普通用户才有回收站,管理员没有
SQL> conn sys/password as sysdba ---切换到管理员
已连接。
SQL> create table ddd(ddd int);
表已创建。
SQL> drop table ddd;
表已删除。
SQL> show recyclebin ---管理员中没有回收站
闪回删除:回收站(recyclebin)简介
1、回收站是所有被删除对象及其相依对象的逻辑存储容器,例如当一个表被删除(drop)时,该表及其相依对象并不会马上被数据库彻底删除,而是被保存到回收站中。
2、回收站将用户执行的drop操作记录在一个系统表中,也就是将被删除的对象写到一个数据字典中。如果确定不再需要该对象,可以使用purge命令对回收站进行清空。
3、被删除的对象的名字可能是相同的,例如用户创建了一个test表,使用drop命令删除该表后,又创建了一个test表,这时,如果再次删除该表就会导致向回收站中添加了两个相同的表。
闪回删除:回收站中对象的命名规则:
为了确保添加到回收站中的对象的名称都是唯一的,系统会对这些保存到回收站中的对象进行重命名,重命名的格式如下:BIN$globalUID$version
其中: BIN表示RECYCLEBIN;globalUID是一个全局唯一的、24个字非长的对象,该标识与原对象名没有任何关系;version指数据库分配的版本号。
闪回删除举例:
闪回使用drop命令删除的表
• 使用表名闪回
• 使用recyclebin name闪回
• 闪回重名的表
SQL> --通过原始表名执行闪回
SQL> flashback table FLASHBACKTABLE to before drop;
SQL> --通过在回收站中的名字,执行闪回 加上””
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
FLASHBACKTABLE BIN$i2P0d5n+SwaVt60y1Sqcbw==$0 TABLE 2011-05-03:14:35:43
SQL> flashback table "BIN$i2P0d5n+SwaVt60y1Sqcbw==$0" to before drop;
SQL> show recyclebin --表中有重名的表
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
FLASHBACKTABLE BIN$PS32XVd1SRqWMSUlStrMZA==$0 TABLE 2011-05-03:14:37:53
FLASHBACKTABLE BIN$RdDMV1QORdWiQHv7kstaZg==$0 TABLE 2011-05-03:14:37:27
SQL> --对于重名的表的闪回,需要重命名表名 闪回的
SQL> flashback table FLASHBACKTABLE to before drop rename to a;--首先闪回最后删除的那个表
SQL> flashback table FLASHBACKTABLE to before drop rename to b;
闪回完成。
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
SYS_TEMP_FBT TABLE
B TABLE
A TABLE
闪回删除中的注意事项:
1、 闪回删除对下列表无效:
1)在SYSTEM 表空间内的表
2) 用精细审计的数据库或 虚拟的私人数据库
3) 属于字典管理的表空间
4)由于空间不足已经被手动或自动删除的表
2、 以下依赖不被保护:
a) 位图索引
b) 表之前删掉的索引
闪回版本的查询:
闪回版本查询,提供了一个审计行改变的查询功能,通过它可以查找到所有已经提交了的行记录。其语法格式如下:
Select column_name [,column_name,...] from table_name
versions between [SCN|TIMESTAMP] [expr|MINVALUE]
and [epxr|MAXVALUE] as of [SCN|TIMESTAMP] expr;
其中:column_name列名;table_name表名;between...and时间段;SCN系统改变号;TIMESTAMP时间戳;AS OF表示恢复单个版本;MAXVALUE最大值;MINVALUE最小值;expr指定一个值或者表达式。
闪回版本查询举例:
创建一张新表:
• create table version_table(vid int, content varchar(20));
执行如下操作:
• insert into version_table values(1,'aaa');
• commit;
• insert into version_table values(2,'bbb');
• commit;
• update version_table set content='bbb1' where vid=2;
• commit;
• insert into version_table values(3,'ccc');
• commit;
执行闪回版本查询。
SQL> --通过闪回版本查询,获取该表的历史记录
SQL> select empno,ename,versions_operation,versions_starttime,versions_endtime
2 from version_table
3 versions between timestamp minvalue and maxvalue;
--通过时间的指定 返回获取闪回版本(指定时间段)的信息
SQL> select empno,ename,versions_operation,versions_starttime,versions_endtime
2 from version_table
3 versions between timestamp to_date('2011-05-03 14:42:19','yyyy-mm-dd hh24:mi:ss')
4 and to_date('2011-05-03 14:43:28','yyyy-mm-dd hh24:mi:ss');
闪回事务的查询:
闪回事务查询实际上闪回版本查询的一个扩充,通过它可以审计某个事务甚至撤销一个已经提交的事务。
实现闪回事务查询,需要先了解flashback_transaction_query视图,从该视图中可以获取事务的历史操作记录以及撤销语句(UNDO_SQL)。
使用闪回事务查询,可以了解某个表的历史操作记录,这个操作记录对应一个撤销SQL语句,如果想要撤销这个操作,就可以执行这个SQL语句。
Flashback_transaction_query(闪回类型)
名称 类型 说明
------------------------------------------------------------------------------------------------
XID RAW(8) 事务编号
START_SCN NUMBER 事务的开始的系统改变号
START_TIMESTAMP DATE 事务的开始时间
COMMIT_SCN NUMBER 事务提交时的系统改变号
COMMIT_TIMESTAMP DATE 事务提交时的时间
LOGON_USER VARCHAR2(30) 对应的用户
UNDO_CHANGE# NUMBER 撤销操作对应的编号
OPERATION VARCHAR2(32) 操作
TABLE_NAME VARCHAR2(256) 表
TABLE_OWNER VARCHAR2(32) 所有者
ROW_ID VARCHAR2(19) 行号
UNDO_SQL VARCHAR2(4000) 撤销事务的SQL语句
闪回事务查询:
注意,要查询flashback_transaction_query视图的信息,需要有select any transaction的权限。
SQL> --闪回事务查询
SQL> conn sys/password as sysdba
已连接。
SQL> grant select any transaction to mytest123;
授权成功。
闪回事务查询举例:
从闪回版本查询中,获取xid号。
基于xid号,在flashback_transaction_query视图中获取相应事务的信息。
利用UNDO_SQL撤销事务操作。
SQL> --先通过闪回版本查询获取事务相关信息
SQL> select empno,ename, versions_operation,versions_xid
2 from transaction_table
3 versions between timestamp minvalue and maxvalue;
---查询某个具体的事务的闪回信息
select xid, operation,table_name,undo_sql
from flashback_transaction_query
where xid='0500090032020000‘
利用UNDO_SQL撤销事务操作。
--如果UNDO_SQL中有多个sql语句就 执行多次
闪回(flashback)
最新推荐文章于 2023-12-05 08:59:34 发布