使用Truncate:清理并回收空间,(mysql,sqlserver等有自增序列的数据库将序列归零),无法恢复,不能回滚;
使用drop:删除表,但不回收空间,可以恢复,不能回滚;
使用delete:删除记录,不回收空间,可恢复,可回滚;
1. 使用drop和delete之后如何恢复?
使用flashback语句
flashback table test2 to before drop ;
查询回收站
select * from dba_recyclebin; 如果不知道原表名或有多个相同表在不同时间被drop,也可以直接使用回收站中的名称进行闪回。 例如: FLASHBACK TABLE "BIN$b2q1qVWuQZy+1TAWJ0M+OA==$0" TO BEFORE DROP; 这样就知道是恢复哪个时间drop掉的表了。
Oracle10g以前,Drop table后,那么该表就会从数据字典里被删除。但是Oracle10g中在drop table(非purge)后只是在数据字典中对被删除的表进行重命名,并没有真的把表从数据字典中删除,而用来维护被删除前的表的名字和后面重新生成的表名字之间的关系的数据字典表,我们称之为“回收站”(recycle bin), 当drop table(没有加 purge)的时候,索引,触发器也会一起进入回收站。 回收站中的对象将一直存在,直到用户决定永久删除它们,使用PURGE命令对回收站空间进行清除; 或是出现表空间的空间不足时它们才会被删除。 注意: 虽然只是数据字典中的表名(当然可能还有索引名,trigger名)发生变化(一般会变成类似BIN$Phio9oeiQYESLIAUICKSE==$0),但是实体的数据等还是存放在原表的表空间中。 回收站中表名的格式: BIN$globalUID$Sversion , globalUID是一个全局唯一的标识对象,长度为24个字符。它是Oracle内部使用的标识。$Sversion是数据库分配的版本号。
2. 使用drop表和delete之后如何回收表空间?
使用Purge语句
可直接使用以下语法彻底删除表并回收空间
DROP TABLE TABLE_NAME PURGE ;
回收站可以提供误操作后进行恢复的必要信息,但是如果不经常对回收站的信息 进行管理的话,磁盘空间会被长时间占用,因此要经常清除回收站中无用的东 西。要清除回收站,可以使用PURGE命令。PURGE命令可以删除回收站中的 表、表空间和索引,并释放表、表空间和索引所占用的空间。PURGE命令语法 格式如下: PURGE TABLE table_name ; PURGE INDEX index_name ; PURGE RECYCLEBIN ; PURGE DBA_RECYCLEBIN ; PURGE TABLESPACE tablespace_name USER username ; (1) TABLE指示清除回收站中的表。 (2) INDEX指示清除回收站中的索引。 (3) TABLESPACE指示清除回收站中的表空间。 (4) RECYCLEBIN指的是当前用户需要清除的回收站。 (5) RECYCLEBIN仅SYSDBA系统权限才能使用,此参数可使用户从Oracle系统回收站清除所有对象。