暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle 闪回删除——从回收站恢复

oracleEDU 2017-09-27
469

Flash Drop

闪回删除用到的是回收站

删除表 ,实际就给表和索引取了系统名字(重命名),数据没有移动。

回收站(RECYCLEBIN参数)设置开或者关被用来控制是否能闪回。如果RECYCLEBIN 被设置成OFF,被删除的表就不会进到回收站;如果RECYCLEBIN 设置成ON,被删除的表就会进入回收站并能被恢复。

1

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;

2

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 ;

3

回收站

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就是一个表

4

闪回删除表

回收站有一表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

6

闪回删除表的对象关系

删除表,表相关对被全部删除 ,闪回表的时候除了外键外 所有的相关对象会被闪回。

建立一个表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     #手添加的 必须做

7

回收站空间管理

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表


最后修改时间:2021-04-28 20:11:06
文章转载自oracleEDU,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论