zoukankan      html  css  js  c++  java
  • 关于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

  • 相关阅读:
    STM32的低功耗模式
    C语言的面向对象技术
    SDIO学习
    读十倍效率开发者有感
    三极管
    压敏电阻
    freertos之任务
    tsar采集数据原理
    NTP学习路线
    使用awk提取字符串中的数字或字母
  • 原文地址:https://www.cnblogs.com/yaoyangding/p/14604812.html
Copyright © 2011-2022 走看看