首页 > 数据库 > Oracle > Oracle Flashback(一)
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
1.基于时间戳的闪回表
现不小心删除scott用户下的myemp表,演示基于时间戳的闪回表操作
1)赋予scott用户flashback any table权限,使表myemp能够行移动
SQL> grant flashback any table to scott;
Grant succeeded.
SQL> conn scott/tiger;
Connected.
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
MYEMP TABLE
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
SQL> alter table myemp enable row movement;
Table altered.
2)更新表myemp 如下:
SQL> set time on;
00:02:25 SQL> select count(*) from myemp;
COUNT(*)
----------
14
00:02:44 SQL> insert into myemp select * from myemp;
14 rows created.
00:03:16 SQL> commit;
Commit complete.
00:03:20 SQL> select count(*) from myemp;
COUNT(*)
----------
28
00:03:27 SQL> insert into myemp select * from myemp;
28 rows created.
00:03:36 SQL> commit;
Commit complete.
00:03:46 SQL> select count(*) from myemp;
COUNT(*)
----------
56
3)执行闪回表操作
00:03:55 SQL> select sysdate from dual;
SYSDATE
---------
18-JUN-14
00:08:45 SQL> flashback table myemp to timestamp to_timestamp('2014-06-18 00:03:46','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
00:09:23 SQL> select count(*) from myemp;
COUNT(*)
----------
28
00:08:45 SQL> flashback table myemp to timestamp to_timestamp('2014-06-18 00:03:46','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
00:09:23 SQL> select count(*) from myemp;
COUNT(*)
----------
28
批注:最好在之前设置的时间点3s之后执行闪回操作
00:09:27 SQL> flashback table myemp to timestamp to_timestamp('2014-06-18 00:03:50','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
00:10:10 SQL> select count(*) from myemp;
COUNT(*)
----------
56
批注:只要在设置的UNDO保留的900s之内,可以执行任意基于时间点的表闪回操作。
2.基于SCN的闪回表
1)对scoot用户下的myemp表执行如下操作:
SQL> conn / as sysdba
Connected.
SQL> select count(*) from scott.myemp;
COUNT(*)
----------
56
SQL> select current_scn from v$database; --查看当前数据库的SCN号
CURRENT_SCN
-----------
606722
SQL> insert into scott.myemp select * from scott.myemp;
56 rows created.
SQL> commit;
Commit complete.
SQL> select count(*) from scott.myemp;
COUNT(*)
----------
112
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
606736
SQL> delete from scott.myemp;
112 rows deleted.
SQL> commit;
Commit complete.
SQL> select count(*) from scott.myemp;
COUNT(*)
----------
0
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
606756
2)基于SCN号的闪回表
SQL> flashback table scott.myemp to scn 606722;
Flashback complete.
SQL> select count(*) from scott.myemp;
COUNT(*)
----------
56
SQL> flashback table scott.myemp to scn 606736;
Flashback complete.
SQL> select count(*) from scott.myemp;
COUNT(*)
----------
112
SQL> flashback table scott.myemp to scn 606756;
Flashback complete.
SQL> select count(*) from scott.myemp;
COUNT(*)
----------
0
批注:只要在设置的UNDO保留的900s之内,可以执行任意基于SCN的表闪回操作。
闪回删除(Flashback Drop)
闪回删除类似于操作系统的垃圾回收站功能,可以从中恢复被drop的表或者索引。该功能基于回收站(RecycleBin)。 如果使用drop table指令删除表,该表不会从数据库中立即删除,而是保存原表的位置,但是将删除的表重新命名,并将删除的表信息存储在回收站中,回收站记录了被删除表的新名字和原名字,记录在回收站中信息会保留一段时间,直到回收站空间不足或者使用purge指令删除回收站中的记录。回收站是一个逻辑结构,不具有物理数据结构,只要删除的表信息记录在回收站中,就可以通过闪回技术恢复误删除的表。
数据字典视图USER_RECYCLEBIN和DBA_RECYCLEBIN供用户查询数据库中回收站中记录的信息。
闪回删除不适用于:驻留在system表空间中的表;使用细粒度级审计或虚拟专用数据库的表; 驻留在字典管理表空间中的表;已清除的表,无论是手动删除的,还是在空间压力下自动删除的。
闪回删除示例1如下:
首先,要启动闪回删除,关键是启动recyclebin,默认情况下是启动的
SQL> show parameter recyclebin;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string on
1.删除scott用户下的myemp表
SQL> drop table myemp;Table dropped.
SQL> show recyclebin; --此时recyclebin是user_recyclebin的同义词
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
MYEMP BIN$/ArGYSO8X4TgQKjACgoP7Q==$0 TABLE 2014-06-18:00:38:34
批注:在重命名被删除的表时,也会重命名该表的依赖对象如涉及的索引、触发器等,在恢复表时,该表涉及的依赖对象会自动恢复,但是会保留系统名称。
2.恢复删除的表
SQL> flashback table "BIN$/ArGYSO8X4TgQKjACgoP7Q==$0" to before drop;
Flashback complete.
批注:如果知道删除之前的表名,也可以如下方式恢复误删除的表 flashback table myemp to before drop;
SQL> select tname,tabtype from tab where tname like '%MYEMP%'; --验证表是否恢复
TNAME TABTYPE
------------------------------ -------
MYEMP TABLE
批注:闪回的时候也可以为表重命名,如下
SQL> flashback table "BIN$/ArGYSO8X4TgQKjACgoP7Q==$0" to before drop rename to emp;
闪回删除示例2如下:
1.在scott用户下创建mydept表,
SQL> create table mydept as select * from dept;
2.创建基于表mydept下字段dname的索引
SQL> create index mydept_dname on mydept(dname);
Index created.
SQL> select table_name,index_name from user_indexes where table_name like '%MYDEPT%'; --查看索引是否创建成功
TABLE_NAME INDEX_NAME
------------------------------ ------------------------------
MYDEPT MYDEPT_DNAME
3.现在删除mydept表,然后闪回,查看基于该表的索引名称的变化,如下:
SQL> drop table mydept;
Table dropped.
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
MYDEPT BIN$/AwWTga9PSHgQKjACgoQJA==$0 TABLE 2014-06-18:01:00:55
SQL> select table_name,index_name from user_indexes where table_name like '%MYDEPT%'; --查询可知基于表mydept中字段dname的索引已经删除
no rows selected
4.执行闪回表操作
SQL> flashback table "BIN$/AwWTga9PSHgQKjACgoQJA==$0" to before drop;
Flashback complete.
查询基于表mydept的索引闪回情况,如下:
SQL> select table_name,index_name from user_indexes where table_name like '%MYDEPT%';
TABLE_NAME INDEX_NAME
------------------------------ ------------------------------
MYDEPT BIN$/AwWTga8PSHgQKjACgoQJA==$0
批注:我们看到mydept的索引闪回成功,但是名称依然是在闪回表时的为该索引起的名字,所以需要用户自己修改该索引的名字。
SQL> drop index "BIN$/AwWTga8PSHgQKjACgoQJA==$0";
Index dropped.
SQL> create index mydept_dname on mydept(dname);
Index created.
SQL> select table_name,index_name from user_indexes where table_name like '%MYDEPT%';
TABLE_NAME INDEX_NAME
------------------------------ ------------------------------
MYDEPT MYDEPT_DNAME
补充:回收站相关操作
1.回收站:手动回收空间
使用 PURGE 命令可从回收站中永久地删除对象。从回收站中清除某个对象时,会从数据库中永久地删除该对象及其相关对象。因此,将无法再使用闪回删除功能恢复从回收站中清除的对象。下面是可能使用的一些 PURGE 命令:
PURGE TABLE 清除指定表。
PURGE INDEX 清除指定索引。
PURGE TABLESPACE 清除驻留在指定表空间内的所有对象。另外,如果驻留在其它表空间内的对象是相关的,则这些对象也可能被清除。此外,还可以指定 USER 子句,以仅清除属于指定用户的那些对象,这些对象对于指定表空间运行于较低的磁盘限额上。
PURGE RECYCLEBIN 清除属于当前用户的所有对象。RECYCLEBIN 与 USER_RECYCLEBIN 功能相同。
PURGE DBA_RECYCLEBIN 清除所有对象。要发出此命令,必须具有足够的系统权限或 SYSDBA 系统权限。
批注:对于 PURGE TABLE 和 PURGE INDEX 命令,如果指定原始名称且回收站包含多个具有该名称的对象,则首先清除位于回收站中时间最长的对象 (FIFO)。
2.绕过回收站
可以使用 DROP TABLE PURGE 命令从数据库中永久地删除表及其相关对象。使用此命令时,对应的对象不会移动到回收站中。此命令的功能与 DROP TABLE 在先前版本中提供的功能相同。
发出 DROP TABLESPACE ...INCLUDING CONTENTS 命令后,表空间中的对象不会移到回收站中。而且,回收站中属于该表空间的对象也将被清除。发出没有 INCLUDING CONTENTS 子句的相同命令时,要使命令能够成功地得以执行,表空间必须是空的。但回收站中可以有属于该表空间的对象。在这种情况下,这些对象将被清除。
发出 DROP USER ...CASCADE 命令后,将从数据库中永久地删除该用户及其拥有的所有对象。回收站中属于已删除用户的所有对象都将被清除。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14288937/viewspace-1264062/ ,如需转载,请注明出处,否则将追究法律责任。