
Flash Drop
闪回删除用到的是回收站
删除表 ,实际就给表和索引取了系统名字(重命名),数据没有移动。
回收站(RECYCLEBIN参数)设置开或者关被用来控制是否能闪回。如果RECYCLEBIN 被设置成OFF,被删除的表就不会进到回收站;如果RECYCLEBIN 设置成ON,被删除的表就会进入回收站并能被恢复。
recyclebin = on (默认)
SQL> show parameter recyclebin;
NAME TYPE VALUE
------------------------ ----------- ------------------------------
recyclebin string #on 表示删除表进入回收站
conn scott/oracle
show recyclebin;
drop table e;
drop table scott.emp ; #删除对象 --> 进入回收站
查看回收站
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP BIN$+e5BhV4rJ9TgQKjAAQMdJg==$0 TABLE 2017-09-27:02:35:09
闪回删除语法
flashback table 表名 to before drop;
如:闪回emp表
flashback table emp to before drop;
recyclebin 设置成 off
关闭回收站
conn as sysdba
SQL> alter system set recyclebin =off scope=both;
alter system set recyclebin =off scope=both
*
ERROR at line 1:
ORA-02096: specified initialization parameter is not modifiable with this option
#静态参数,必须先修改参数文件,重启生效
alter system set recyclebin =off scope=spfile ;
shutdown immediate;
startup
SQL> show parameter recyclebin;
NAME TYPE VALUE
------------------- ----------- ------------------------------
recyclebin string OFF 关闭回收站,删除对象不可恢复
conn scott/oracle
create table e as select * from scott.emp ;
drop table scott.e;
Table dropped.
SQL> show recyclebin; #不在 不能恢复!
默认是:on ,重新开启
alter system set recyclebin=on scope=spfile ;
startup force ;
回收站
create table e as select * from scott.emp ;
drop table e; #实际是对该表取一个别名
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
E BIN$+e529u7etCLgQKjAAQMlJQ==$0 TABLE 2017-09-27:02:50:05
实际对e重命名为BIN$+e529u7etCLgQKjAAQMlJQ==$0
BIN$+e529u7etCLgQKjAAQMlJQ==$0 表名 你对表的操作 该对象也可以做
查询表
SQL> select * from "BIN$+e529u7etCLgQKjAAQMlJQ==$0";
EMPNO JOB MGR HIREDATE SAL COMM DEPTNO
---------- --------- ---------- --------- ---------- ---------- ----------
7839 PRESIDENT 17-NOV-81 5000 10
7844 SALESMAN 7698 08-SEP-81 1500 0 30
7876 CLERK 7788 23-MAY-87 1100 20
7900 CLERK 7698 03-DEC-81 950 30
7902 ANALYST 7566 03-DEC-81 3000 20
7934 CLERK 7782 23-JAN-82 1300 10
看表的结构
SQL> desc "BIN$+e529u7etCLgQKjAAQMlJQ==$0";
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NUMBER(4)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
所以BIN$+e529u7etCLgQKjAAQMlJQ==$0就是一个表
闪回删除表
回收站有一表e
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
E BIN$+e529u7etCLgQKjAAQMlJQ==$0 TABLE 2017-09-27:02:50:05
可以再建立一个和表名叫e
SQL> create table e (id number) ;
Table created.
SQL> insert into e values(1);
1 row created.
SQL> commit;
Commit complete.
SQL> drop table e ;
Table dropped.
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
E BIN$+e6GYqcIe5jgQKjAAQMnRw==$0 TABLE 2017-09-27:02:54:24
E BIN$+e529u7etCLgQKjAAQMlJQ==$0 TABLE 2017-09-27:02:50:05
要求先闪回表中有6条数据的表,再闪回表中有一条数据的表
语法:
flashback table 表名 to before drop ;
如果有多个原始名字相同,则后进先出
TIPS:闪回删除不要用原始名字,建议使用系统产生的名字去闪回表
步骤1:查询哪个表是你要闪回的
SQL> select count(*) from "BIN$+e6GYqcIe5jgQKjAAQMnRw==$0";
COUNT(*)
----------
1
SQL> select count(*) from "BIN$+e529u7etCLgQKjAAQMlJQ==$0";
COUNT(*)
----------
6
步骤2:闪回下面那个
flashback table "BIN$+e529u7etCLgQKjAAQMlJQ==$0" to before drop ;
SQL> select count(*) from e;
COUNT(*)
----------
6
步骤3: 再去闪回只有1条记录的表
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BIN$+e6GYqcIe5jgQKjAAQMnRw==$0 TABLE
BONUS TABLE
DEPT TABLE
E TABLE
EMP TABLE
SALGRADE TABLE
flashback table "BIN$+e6GYqcIe5jgQKjAAQMnRw==$0" to before drop ;
ERROR at line 1:
ORA-38312: original name is used by an existing object
重复了名字,闪回的同时重命名
闪回语法
flashback table 表名 to before drop rename to 新名字
flashback table "BIN$+e6GYqcIe5jgQKjAAQMnRw==$0" to before drop rename to e2;
SQL> select count(*) from e2;
COUNT(*)
----------
1
闪回删除表的对象关系
删除表,表相关对被全部删除 ,闪回表的时候除了外键外 所有的相关对象会被闪回。
建立一个表t1
id 主键 --> 和主键同名的索引
name 唯一约束 --> 和唯一约束同名的索引
age 检查约束
deptno 外键
表名:t1
约束名:pk_id un_name ck_age fk_d_dept
索引名:pk_id un_name
create table scott.t1(id number constraint pk_id primary key ,name char(10) constraint un_name unique,age number constraint ck_age check(age <=18),deptno number,constraint fk_d_dept foreign key(deptno) references dept(deptno));
insert into scott.t1 values(1,'tom',17,10);
commit;
SQL> select * from scott.t1;
ID NAME AGE DEPTNO
---------- ---------- ---------- ----------
1 tom 17 10
drop table scott.t1 ;
表被删除,索引约束都被删除。
可以通过dba_objects查出新的名字
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T1 BIN$+e63DH8R1ajgQKjAAQMrcQ==$0 TABLE 2017-09-27:03:08:00
select INDEX_NAME,TABLE_NAME from user_indexes where table_name='T1';
no rows selected #索引被删除了
闪回表
SQL> flashback table "BIN$+e63DH8R1ajgQKjAAQMrcQ==$0" to before drop ;
Flashback complete.
SQL> select * from tab;
NAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
E TABLE
E2 TABLE
EMP TABLE
SALGRADE TABLE
T1 #TABLE 被闪回了
SQL> select INDEX_NAME,TABLE_NAME from user_indexes where table_name='T1';
INDEX_NAME TABLE_NAME
------------------------------ ------------------------------
BIN$+e63DH8Q1ajgQKjAAQMrcQ==$0 T1
BIN$+e63DH8P1ajgQKjAAQMrcQ==$0 T1
索引闪回了,没有还原成原来的名字。闪回后得手工去重命名
重命名索引
alter index "BIN$+e63DH8Q1ajgQKjAAQMrcQ==$0" rename to pk_id;
alter index "BIN$+e63DH8P1ajgQKjAAQMrcQ==$0" rename to un_name;
SQL> select INDEX_NAME,TABLE_NAME from user_indexes where table_name='T1';
INDEX_NAME TABLE_NAME
------------------------------ ------------------------------
PK_ID T1
UN_NAME T1
SQL> select CONSTRAINT_NAME, CONSTRAINT_TYPE,TABLE_NAME from user_constraints where TABLE_NAME='T1';
CONSTRAINT_NAME C TABLE_NAME
------------------------------ - ------------------------------
BIN$+e63DH8M1ajgQKjAAQMrcQ==$0 C T1
BIN$+e63DH8N1ajgQKjAAQMrcQ==$0 P T1
BIN$+e63DH8O1ajgQKjAAQMrcQ==$0 U T1
发现少了外键 :所有约束都被闪回,除了外键(必须手工添加)
加外键
alter table scott.t1 add constraint fk_d_dept foreign key(deptno) references dept(deptno);
给约束重命名(可选)
alter table scott.t1 rename constraint "BIN$+e63DH8N1ajgQKjAAQMrcQ==$0" to pk_id;
alter table scott.t1 rename constraint "BIN$+e63DH8M1ajgQKjAAQMrcQ==$0" to ck_age;
alter table scott.t1 rename constraint "BIN$+e63DH8O1ajgQKjAAQMrcQ==$0" to un_name;
SQL> select CONSTRAINT_NAME, CONSTRAINT_TYPE,TABLE_NAME from user_constraints where TABLE_NAME='T1';
CONSTRAINT_NAME C TABLE_NAME
------------------------------ - ------------------------------
CONSTRAINT_NAME C TABLE_NAME
------------------------------ - ------------------------------
CK_AGE C T1
PK_ID P T1
UN_NAME U T1
FK_D_DEPT R T1 #手添加的 必须做
回收站空间管理
A. 手动空间管理
purge recyclebin ; #清除当前用户删对象
删除对象不进回收站
修改参数:recyclebin =off
ALTER SYSTEM SET RECYCLEBIN=OFF SCOPE=SPFILE;
或者删除对象加purge
drop table 表名 purge ;
DROP TABLESPACE <ts_name> INCLUDING CONTENTS
DROP USER <user_name> [CASCADE] ;
如:
清除users表空间上的所有删除对象
purge tablespace users ;
清除users表空间上的拥有者是scott的对象
purge tablespace users user scott;
清空所有删除的对象
purge dba_recyclebin;
B. 自动空间管理
先使用没有使用过的空间,然后去占用回收站的空间,最后做空间扩展;如果表空间扩展了,意味着该表空间上的回收站被全清空,不能闪回了。
create tablespace t datafile '/u01/app/oracle/t.dbf' size 3m autoextend on;
conn scott/oracle
create table t2 tablespace t as select * from scott.emp;
insert into t2 select * from t2;
/
/
commit;
drop table t2 ;
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T2 BIN$+e7vfRa/qpDgQKjAAQMv+A==$0 TABLE 2017-09-27:03:23:47
#在此时此刻 是可以闪回
另外一个用户
create table scott.t3 tablespace t as select * from scott.emp;
insert into scott.t3 select * from scott.t3;
/
/
…
SQL> show recyclebin;
没有结果 ,空间不够,回收站中记录对象的空间占用了,就不能闪回t2表





