Oracle表的删除和简单恢复
Oracle数据库可以看做一个独立的系统,因此,它提供了回收站功能,以防止误操作。
假设我现在安装了一个Oracle11g数据库,安装时选择了其中自带范例emp表,以下操作均在OracleSQLdevelope下操作:
1.查看表(emp表也可以自己手工建立,SQL语句见博文
2,,删除表数据
delete from emp; 在查询表,可以看到没有内容了,只有表结构。因为,desc emp;可以看到输出为:
名称 空值 类型
-------- -- ------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
还有第二种删除表数据的方法,
truncate table emp; 此时执行rollback,回退,会发现数据并没有回来,截断删除是真的删除了表数据了,delete 方法是并没有真正的删除哦,除非提交。
简单的说,truncate是delete+comit组合的效果,并且是全部表数据,delete可以后面加where选择删除列。
3. 删除表结构,当然,表结构都没有了,自然表数据也没有了。
drop table emp; 删除表整体,也就是drop后rollback回退是没有用的。但Oracle系统默认是放入回收站了,此时如果查询该用户下的所有表,会看到bin打头的一个回收站表。
当然了,如果你确定要删除这个表,那么,bin打头的表对你来说就是垃圾了,这个时候需要清除垃圾,毕竟垃圾也占磁盘空间的对吧。
如果,你是误删除了,那么,这个bin打头的表就是你的后悔药了。先看看是否开启回收站功能: show parameter bin;
可以看到回收站功能是开启的,如果要关闭整个系统的回收站,需要将数据库更改状态为mount时,执行ALTER SYSTEM SET recyclebin = ON; ALTER SYSTEM SET recyclebin = OFF; 以开启或者关闭回收站功能
如果是当前会话级的回收站功能开关,则命令为:ALTER SESSION SET recyclebin = ON;ALTER SESSION SET recyclebin = OFF;(仅在当前会话生效,更改session后失效)。也就是如果在当前会话执行off,那么回收站功能关闭,drop删除表没有后悔药。
(1),使用后悔药
首先,你可能有很多份后悔药(很多表都被误删除了……),但是,有些药你并不后悔,只想要其中的某一份。那么,问题来了,假设有n个bin表,单从名字看基本都一样,你并不会知道哪个bin表对应于哪个表,怎么办?
SELECT * FROM RECYCLEBIN; 或者SELECT * FROM USER_RECYCLEBIN;可以查询到bin表原来属于哪个表,例如,
这我们就可以指定BIN$uTo/4dQLfzXgUKjAFQAeBw==$0 这个表是通过删除emps这个表而得到的,是通过drop这个操作得到的。
然后,执行以下命令就可以恢复了,恢复成功会提示,flashback 成功的。
flashback table "BIN$uTo/4dQNfzXgUKjAFQAeBw==$0" to before drop; --查询到的bin表名称,当然后面可以加rename to,直接恢复的时候改名,比如:
flashback table "BIN$uTo/4dQPfzXgUKjAFQAeBw==$0" to before drop rename to abcde; 恢复的同时改名为abcde这个表。
(2),清除垃圾
全部垃圾清除:purge recyclebin; --清空回收站
清除指定垃圾:purge table bin表名;--删除指定的垃圾