19.3.3 管理回收站
回收站是表示删除的对象使用的存储空间的一个术语
查询回收站
每个用户都有他们白己的回收站, 并且总是在他们自己的模式下查看删除的表.
查询方法:
命令:SHOWRECYCLEBIN
SQL> show recyclebin; ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME ---------------- ------------------------------ ------------ -------------------
TEST_ORDERS BIN$6ZtimNY8TNernOCNAKv60A==$0 TABLE 2018-02-12:17:12:36
SQL> create table t2(id number); create table t2(id number) * 第 1 行出现错误: ORA-00955: 名称已由现有对象使用
SQL> drop table t2;
表已删除。
SQL> show recyclebin; ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME ---------------- ------------------------------ ------------ -------------------
T2 BIN$i+Pkgz9BSX6SZia4fuYIWA==$0 TABLE 2018-05-06:21:58:51
TEST_ORDERS BIN$6ZtimNY8TNernOCNAKv60A==$0 TABLE 2018-02-12:17:12:36
SQL> select original_name,object_name,type,droptime from user_recyclebin;
ORIGINAL_NAME OBJECT_NAME -------------------------------- ------------------------------ TYPE DROPTIME ------------------------- ------------------- TEST_ORDERS BIN$6ZtimNY8TNernOCNAKv60A==$0 TABLE 2018-02-12:17:12:36
T2 BIN$i+Pkgz9BSX6SZia4fuYIWA==$0 TABLE 2018-05-06:21:58:51 |
回收站中的已删除对象的空间得不到保障,当活动对象需要时,可以使用已删除对象的空间(先删先重用).如此,已删除对象无法通过flashback drop恢复,且此对象也将从视图中清除.
所以,如果感觉回收站里的对象还有用处,应该立即执行flashback drop.
考点: flashbackdrop不适用于SYSTEM表空间里的表,由于这些表被彻底删除,所以从回收站视图中无法查询.
回收站中的对象所占用的空间根据删除时间先后被oracle重用,算法:先进先出,假定最近删除的最可能被flashback drop.
使用各种形式的PURGE 命令永久性地清除刷掉的对象,相关命令如下:
drop table <table_name> purge ; --drop the table and do not move it to the recycle bin.彻底删除,不进回收站 |
purge table <table_name> ; --remove the table from the recycle bin. 清空回收站中的表 |
purge index <index_name> ; --remove an index from the recycle bin清空回收站中的索引 |
purge tablespace <tablespace_name> ; -remove all dropped objects from the tablespace.从表空间中清除所有删除的对象。 |
purge tablespace <tablespace_name> user <user_name> ; --remove all dropped objects belonging to one user from the tablespace.从表空间中删除属于指定用户的对象 |
purge user_recyclebin ; --remove all your dropped objects. 清空用户回收站 |
purge dba_recyclebin ; --remove all dropped objects. 清空系统回收站(DBA权限) |
19.4 闪回查询
ORACLE为用户提供可以查询过去某个时间的数据库状况。原理为: 将查询指定的时间映射到一个系统变更号和SCN ,每当查询找到自从该SCN以来更改的一个块,它将转到撤销段以提取回滚此更改所需的撤销数据。
可以用来检索一个行的所有版本,可以反转各个事务,或反转某个时间以来对表做出的所有更改.
考点:
所有形式的闪回查询依赖撇销数据来重构它在过去某个时间点的数据.
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY ------------------- 2018-05-07 10:46:41
SQL> select * from t;
ID ---------- 1 2 3
SQL> delete from t where id=1;
已删除 1 行。
SQL> commit;
提交完成。 SQL> select * from t;
ID ---------- 2 3
SQL> select * from t as of timestamp to_timestamp('2018-05-07 10:46:41','yyyy-mm -dd hh24:mi:ss');
ID ---------- 1 2 3
SQL> select * from t as of timestamp to_timestamp('2018-05-07 10:46:41','yyyy-mm -dd hh24:mi:ss') minus select * from t;
ID ---------- 1
|
通过使用DBMS_FLASHBACK程序包可以将整个会话回退到过去某个时间(非SYS用户):
SQL> execute dbms_flashback.enable_at_time(query_time => to_timestamp('2018-05-0 7 10:46:41','yyyy-mm-dd hh24:mi:ss'));
PL/SQL 过程已成功完成。
SQL> select * from t;
ID ---------- 1 2 3
SQL> insert into t values (4); insert into t values (4) * 第 1 行出现错误: ORA-08182: 在闪回模式下操作不受支持
|
从此以后,所有的查询将看到数据库在指定的时间(即2018-05-0
7 10:46:41)的状态。启用闪回查询的语法接受时间戳或SCN, 如果使用SCN ,那么闪回转到的时间点是精确的,如果指定某个时间,那么它将映射到一个SCN 上并且精度是3 秒.
考点:
可以查询以前某个时间点的数据库, 但是永远不能对过去版本的数据执行DML .
注意 :
使用execute dbms_flashback.enable_at_time()方法之后,我们以直接的方式查询到过去的时间点的数据,如果操作结束,需要使用execute dbms_flashback.disable方法关闭设置的上下文时间。
SQL> execute dbms_flashback.disable;
PL/SQL 过程已成功完成。
SQL> select * from t;
ID ---------- 2 3 |
类似的,可以指定SCN进行闪回查询
execdbms_flashback.enable_at_system_change_number(query_scn => 2107631);
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER ------------------------ 3320196
SQL> select * from t;
ID ---------- 2 3
SQL> insert into t values (4);
已创建 1 行。
SQL> commit;
提交完成。
SQL> exec dbms_flashback.enable_at_system_change_number(query_scn =>3320196);
PL/SQL 过程已成功完成。
SQL> select * from t;
ID ---------- 2 3
SQL> execute dbms_flashback.disable;
PL/SQL 过程已成功完成。
SQL> select * from t;
ID ---------- 4 2 3 |