关于Oracle11g回收站(Recycle Bin)对象的进入与恢复实验

 

天哥-天行健 2018-09-12 19:11:57 946 收藏 1
文章标签: oracle
版权
关于Oracle11g回收站(Recycle Bin)对象的进入与恢复实验

一、基本原理
windows桌面系统有个回收站,文件删除后通常放到回收站里,用户可以将回收站中的文件还原。
Oracle回收站的原理完全一样,只是实现的细节方面有些差异.另外回收站中只能回收表和相关的对象包括索引、约束、触发器、嵌套表、大的二进制对(LOB)段和LOB索引段.

二、回收站功能的开启和关闭

查看回收站功能是否开启(默认为开启)
SQL> show parameter recyclebin;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      on
 

开启命令:alter system set recyclebin=on deferred;
关闭命令:alter system set recyclebin=off deferred;

deferred参数,对当前已经连接的sesion没有影响,但新连接的session将受到影响.

三、回收站的实验准备
Flashback不支持sys用户,system表空间下面的对象,也不能从回收站里拿到。故使用sys或是system用户登录时,show recyclebin为空。
所以,为了实验,新创建表空间test_ts及用户test
create tablespace test_ts datafile '/u01/app/oracle/oradata/orcl/test_ts.dbf' size 10m;
create user test identified by test default tablespace test_ts quota unlimited on test_ts;
grant connect,resource to test;

四、回收站实验,可以恢复表及主键和唯一约束(恢复后名称有变化,需手工rename)
用户test登录,检查回收站表,建普通表test_tab;

通过查询user_recyclebin或recyclebin获取当前用户drop掉的对象,发现无内容。
create table test_tab(id number);
insert into test_tab values (1);
commit;
select * from test_tab;
drop table test_tab;
select OBJECT_NAME,ORIGINAL_NAME,TS_NAME,DROPTIME from recyclebin;

OBJECT_NAME                    ORIGINAL_NAME                    TS_NAME                        DROPTIME
------------------------------ -------------------------------- ------------------------------ -------------------
BIN$dacz1p9VzWXgUKjABZavgg==$0 TEST_TAB                         TEST_TS                        2018-09-12:17:32:15

由此可知:用户的表test_tab被drop后,进入回收站后命名为'BIN$dacz1p9VzWXgUKjABZavgg==$0',原名称以ORIGINAL_NAME字段记录,表空间仍然使用原来的表空间TEST_TS.

创建新表test_tab,插入数据后,再次drop,如下:

create table test_tab(id number);
insert into test_tab values (2);
commit;
drop table test_tab;


SQL> select OBJECT_NAME,ORIGINAL_NAME,TS_NAME,DROPTIME from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME                    TS_NAME                        DROPTIME
------------------------------ -------------------------------- ------------------------------ -------------------
BIN$dapFp5Bb0ELgUKjABZa1kQ==$0 TEST_TAB                         TEST_TS                        2018-09-12:17:32:42
BIN$dacz1p9VzWXgUKjABZavgg==$0 TEST_TAB                         TEST_TS                        2018-09-12:17:32:15


由此可知:回收站可以保存原名称为TEST_TAB的多个同名对象,对应的OBJECT_NAME、删除日期(DROPTIME)不同。
由于启动闪回功能后,对象的删除为逻辑删除,本质上为修改名称。所以可以直接对上述回收站中的对象进行操作。
例如:
查看表结构:desc "BIN$dapFp5Bb0ELgUKjABZa1kQ==$0";
查看表的记录:select count(*) from "BIN$dapFp5Bb0ELgUKjABZa1kQ==$0";
越过回收站直接删除(相当于windows下的按shift+delete键删除文件):
drop table test_tab purge;
当然也可以清空回收站:
purge table "BIN$dapFp5Bb0ELgUKjABZa1kQ==$0"
purge user_recyclebin; 
purge recyclebin;

下面试验带有主键的表如何恢复
create table student(id number,name varchar(5));
alter table student add constraint STU_PK primary key (id);
insert into student values (2,'wb');
commit;
drop table student;

SQL> select OBJECT_NAME,ORIGINAL_NAME,TS_NAME,DROPTIME from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME                    TS_NAME                        DROPTIME
------------------------------ -------------------------------- ------------------------------ -------------------
BIN$dacz1p9YzWXgUKjABZavgg==$0 STUDENT                          TEST_TS                        2018-09-12:17:36:17
BIN$dacz1p9XzWXgUKjABZavgg==$0 STU_PK                           TEST_TS                        2018-09-12:17:36:17
BIN$dapFp5Bb0ELgUKjABZa1kQ==$0 TEST_TAB                         TEST_TS                        2018-09-12:17:32:42
BIN$dacz1p9VzWXgUKjABZavgg==$0 TEST_TAB                         TEST_TS                        2018-09-12:17:32:15


恢复被删除的表TEST_TAB,后进先出,即恢复最近删除的名,虽然回收站中有两张TEST_TAB表,当然可以指定时间恢复早期drop的表()
flashback table TEST_TAB to before drop;
如果闪回的表名与当前的表名相同,需要重命名才可以闪回:
Flashback table TEST_TAB to before drop rename to OLD_TEST_TAB;
也可以指定回收站的对象名称进行恢复:
flashback table “BIN$dacz1p9VzWXgUKjABZavgg==$0” to before drop;


恢复成功后,回收站中少了一条记录
SQL> select OBJECT_NAME,ORIGINAL_NAME,TS_NAME,DROPTIME from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME                    TS_NAME                        DROPTIME
------------------------------ -------------------------------- ------------------------------ -------------------
BIN$dacz1p9YzWXgUKjABZavgg==$0 STUDENT                          TEST_TS                        2018-09-12:17:36:17
BIN$dacz1p9XzWXgUKjABZavgg==$0 STU_PK                           TEST_TS                        2018-09-12:17:36:17
BIN$dacz1p9VzWXgUKjABZavgg==$0 TEST_TAB                         TEST_TS                        2018-09-12:17:32:15

可以恢复表STUDENT
SQL> flashback table STUDENT to before drop;
执行上述操作后,回收站中的表与主键约束都被恢复了

SQL> select OBJECT_NAME,ORIGINAL_NAME,TS_NAME,DROPTIME from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME                    TS_NAME                        DROPTIME
------------------------------ -------------------------------- ------------------------------ -------------------
BIN$dacz1p9VzWXgUKjABZavgg==$0 TEST_TAB                         TEST_TS                        2018-09-12:17:32:15


只不过查看表STUDENT时发现,主键和唯一约束名称为回收站中的名称,如下:
create unique index BIN$dacz1p9XzWXgUKjABZavgg==$0 on STUDENT (ID)
alter table STUDENT  add constraint BIN$dacz1p9WzWXgUKjABZavgg==$0 primary key (ID);
可以将唯一约束进行改名:
alter index "BIN$dacz1p9XzWXgUKjABZavgg==$0" rename to STU_PK;
alter table STUDENT  rename  constraint "BIN$dacz1p9WzWXgUKjABZavgg==$0" to STU_PK;


五、关于带约束和外键表的恢复

创建部门表dept和员工表emp
-- 创建部门表emp
create table DEPT
(
  DEPT_id   NUMBER(4) not null,
  DEPT_name VARCHAR2(30),
  manager_id      NUMBER(6),
  location_id     NUMBER(4)
);

alter table DEPT   add constraint DEPT_PK primary key (DEPT_ID);
insert into dept select * from DEPARTMENTS;

-创建员工表emp
create table EMP
(
  emp_id    NUMBER(6) ,
  first_name     VARCHAR2(20),
  last_name      VARCHAR2(25),
  email          VARCHAR2(25),
  phone_number   VARCHAR2(20),
  hire_date      DATE,
  job_id         VARCHAR2(10),
  salary         NUMBER(8,2),
  commission_pct NUMBER(2,2),
  manager_id     NUMBER(6),
  dept_id  NUMBER(4)
  );
--创建两个索引
create index EMPJOB_IX on emp (JOB_ID);
create index EMPMANAGER_IX on emp(MANAGER_ID)
--创建主键
alter table emp  add constraint EMPPK primary key (emp_ID);
--创建外键
alter table emp  add constraint EMPDEPT_FK foreign key (dept_ID) references DEPT (dept_ID);
--创建检查性约束
alter table emp  add constraint EMPSAL_MIN check (salary > 0);
insert into emp select * from employees;

3)下面实验表drop后,通过查询user_recyclebin或recyclebin获取当前用户drop掉的对象
drop table emp;


SQL> select OBJECT_NAME,ORIGINAL_NAME,TS_NAME,DROPTIME from recyclebin;
OBJECT_NAME                    ORIGINAL_NAME                    TS_NAME                        DROPTIME
------------------------------ -------------------------------- ------------------------------ -------------------
BIN$daeCdRADvgfgUKjABZawMg==$0 EMP                              TEST_TS                        2018-09-12:18:33:24
BIN$daeCdRACvgfgUKjABZawMg==$0 EMPPK                            TEST_TS                        2018-09-12:18:33:24
BIN$daeCdRABvgfgUKjABZawMg==$0 EMPMANAGER_IX                    TEST_TS                        2018-09-12:18:33:24
BIN$daeCdRAAvgfgUKjABZawMg==$0 EMPJOB_IX                        TEST_TS                        2018-09-12:18:33:24

由此可见,进回收站的只有表和索引(包括主键自带的唯一性索引),外建不进回收站也不恢复,主键和检查性约束不进回收站,但却能跟随表对象恢复。

恢复表emp;
flashback table EMP to before drop;

查看恢复后的表时,发现
进回收站的只有表和索引(包括主键自带的唯一性索引),外建不进回收站也不恢复,主键和检查性约束不进回收站,但却能跟随表对象恢复。
————————————————
版权声明:本文为CSDN博主「天哥-天行健」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lotusfromwater/article/details/82666666

posted @ 2021-04-01 09:20  耀阳居士  阅读(333)  评论(0编辑  收藏  举报