ORACLE闪回----闪回删除flashback drop

flashback分类:

   1)flashback drop

   2)flashback query

   3)flashback data archive

   4)flashback table

   5)flashback version query

   6)flashback transaction

   7)flashback database

闪回删除的前提和应用

很多场景的数据库都会出现误删除数据并提交,(未提交的情况可以rollback)

提交后发现数据或者表有用影响程序运行,但处于生产中的数据库不能做停机操作来进行不完全数据恢复怎么办!!?

flashback

能闪则闪这是经验主义的惯性思维,这话固然是有道理的毕竟闪回删除的数据一般是不需要停机。

图出自哪里我不清楚,但是表述很清晰。

1、employees表存在切有PK 主键

2、DROP TABLE /or delete from 

3和4、此时查看一下recyclebin 就能看到这些信息。 解释一下当前数据块状态:我执行了删除drop表的命令后,数据被清除但是存放数据的数据块被标记未DBA_FREE_SPACE状态,

如果此空间不被新的数据占用,那么将一直保留此信息。有个特例情况就是,删除后新建了一张同名的表,并也执行了删除命令这个我后续会补充,请读者先记得这个事情

EXAMPLE

废话不多说 上示例:

我操作的是我自己创建的一个用户tony。

查看一下TONY的默认表空间以及表空间里的表

SYS@ prod>select username,default_tablespace from dba_users where username='TONY';

USERNAME                                                                                   DEFAULT_TABLESPACE
------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------
TONY                                                                                       TEST01
SYS@ prod>
SYS@ prod>select segment_name from dba_segments where tablespace_name='TEST01';

SEGMENT_NAME
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
BIN$vcfnm3iVKF7gVYv2vTElrw==$0
EMP01
EMP1

清理掉这些表,后查看表空间使用大小。这里出先了一个小插曲,大家可以自行查阅一下相关ORA-55610报错,后续的文章我也会提到这部分内容

SYS@ prod>drop table tony.emp1;
drop table tony.emp1
           *
第 1 行出现错误:
ORA-55610: 针对历史记录跟踪表的 DDL 语句无效


SYS@ prod>select owner_name,flashback_archive_name,create_time,status from dba_flashback_archive;

OWNER_NAME
------------------------------------------------------------------------------------------
FLASHBACK_ARCHIVE_NAME
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE_TIME                                                                 STATUS
--------------------------------------------------------------------------- ---------------------
SYS
FLA1
2021-03-18 15:59:59.000000000

SYS@ prod>alter table tony.emp1 no flashback archive;

表已更改。

SYS@ prod>drop table tony.emp01;

表已删除。

SYS@ prod>select segment_name from dba_segments where tablespace_name='TEST01';

SEGMENT_NAME
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
BIN$vcfnm3iVKF7gVYv2vTElrw==$0
EMP1

SYS@ prod>drop table tony.emp1;

表已删除。

SYS@ prod>
SYS@ prod>
SYS@ prod>
SYS@ prod>
SYS@ prod>select segment_name from dba_segments where tablespace_name='TEST01';

SEGMENT_NAME
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
BIN$vdzkcdKXe7XgVYv2vTElrw==$1
BIN$vdzkcdKYe7XgVYv2vTElrw==$0

SYS@ prod>purge recyclebin;

回收站已清空。
SYS@ prod>
SYS@ prod>
SYS@ prod>select segment_name from dba_segments where tablespace_name='TEST01';

SEGMENT_NAME
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
BIN$vdzkcdKXe7XgVYv2vTElrw==$1
BIN$vdzkcdKYe7XgVYv2vTElrw==$0
SYS@ prod>select sum(bytes) from dba_free_space where tablespace_name='TEST01';

SUM(BYTES)
----------
   9437184

 

创建一张表,将表空间撑爆。

ORA-01653


TONY@ prod>create table emp as select * from scott.emp;

表已创建。

TONY@ prod>insert into emp select * from emp;

已创建 14 行。

TONY@ prod>/

已创建 28 行。

TONY@ prod>/

已创建 56 行。

TONY@ prod>/

已创建 112 行。

TONY@ prod>/

已创建 224 行。

TONY@ prod>/

已创建 448 行。

TONY@ prod>/

已创建 896 行。

TONY@ prod>/

已创建 1792 行。

TONY@ prod>/

已创建 3584 行。

TONY@ prod>/

已创建 7168 行。

TONY@ prod>/

已创建 14336 行。

TONY@ prod>/

已创建 28672 行。

TONY@ prod>/

已创建 57344 行。

TONY@ prod>/
insert into emp select * from emp
*
第 1 行出现错误:
ORA-01653: 表 TONY.EMP 无法通过 128 (在表空间 TEST01 中) 扩展


TONY@ prod>/
insert into emp select * from emp
*
第 1 行出现错误:
ORA-01653: 表 TONY.EMP 无法通过 128 (在表空间 TEST01 中) 扩展

这个地方我的显示是128是因为我给了db_cache_size非标准块了大小

查看表数据量,稍微剩余1M多空间无碍!

TONY@ prod>select count(*) from emp;

  COUNT(*)
----------
    114688

SYS@ prod>select sum(bytes) from dba_free_space where tablespace_name='TEST01';

SUM(BYTES)
----------
   1048576

此时表空间仍有剩余空间

删除表 查看回收站里内容及表空间大小,说明表空间里被删除的数据释放出来的表空间仍可以被使用,对应上图1 中就是DBA_FREE_SPACE。

TONY@ prod>purge recyclebin;

回收站已清空。

TONY@ prod>
TONY@ prod>drop table emp;

表已删除。

TONY@ prod>desc recyclebin;
 名称                                                                                                                                                                        是否为空? 类型
 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- --------------------------------------------------------------------------------------------------------------------
 OBJECT_NAME                                                                                                                                                                   NOT NULL VARCHAR2(30)
 ORIGINAL_NAME                                                                                                                                                                          VARCHAR2(32)
 OPERATION                                                                                                                                                                              VARCHAR2(9)
 TYPE                                                                                                                                                                                   VARCHAR2(25)
 TS_NAME                                                                                                                                                                                VARCHAR2(30)
 CREATETIME                                                                                                                                                                             VARCHAR2(19)
 DROPTIME                                                                                                                                                                               VARCHAR2(19)
 DROPSCN                                                                                                                                                                                NUMBER
 PARTITION_NAME                                                                                                                                                                         VARCHAR2(32)
 CAN_UNDROP                                                                                                                                                                             VARCHAR2(3)
 CAN_PURGE                                                                                                                                                                              VARCHAR2(3)
 RELATED                                                                                                                                                                       NOT NULL NUMBER
 BASE_OBJECT                                                                                                                                                                   NOT NULL NUMBER
 PURGE_OBJECT                                                                                                                                                                  NOT NULL NUMBER
 SPACE                                                                                                                                                                                  NUMBER

TONY@ prod>show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP              BIN$vd6orv2YNIHgVYv2vTElrw==$0 TABLE        2021-03-19:14:17:02
TONY@ prod>
SYS@ prod>select sum(bytes) from dba_free_space where tablespace_name='TEST01';

SUM(BYTES)
----------
   9437184

SYS@ prod>

查看TEST01表空间段的信息,仍有段信息存在只不过名字不一样了。

SYS@ prod> select segment_name from dba_segments where tablespace_name='TEST01';

SEGMENT_NAME
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
BIN$vd6orv2YNIHgVYv2vTElrw==$0

SYS@ prod>

查询表数据结果:

TONY@ prod>select * from emp;
select * from emp
              *
第 1 行出现错误:
ORA-00942: 表或视图不存在

执行闪回删除重新查询数据

TONY@ prod>select * from emp;
select * from emp
              *
第 1 行出现错误:
ORA-00942: 表或视图不存在


TONY@ prod>flashback table emp  to before drop;

闪回完成。

TONY@ prod>select count(*) from emp;

  COUNT(*)
----------
    169036

TONY@ prod>

闪回删除操作完成!!

NOTICE!!!!!!!

*****************接下来我要说第二种情况***************

当我删除表数据之后,新的事务占据了原来的表空间,也就是说DBA_FREE_SPACE空间被占用,闪回时候会生效呢?

重新做一遍删除表操作 并建立新的数据表 插入大量数据

TONY@ prod>drop table  emp;

表已删除。

SYS@ prod>select sum(bytes) from dba_free_space where tablespace_name='TEST01';

SUM(BYTES)
----------
   9437184

SYS@ prod>

TONY@ prod>create table emp2 as select * from scott.emp;

表已创建。

TONY@ prod>insert into emp2 select * from emp2;

已创建 14 行。

TONY@ prod>/

已创建 28 行。

TONY@ prod>/

已创建 56 行。

TONY@ prod>/

已创建 112 行。

TONY@ prod>/

已创建 224 行。

TONY@ prod>/

已创建 448 行。

TONY@ prod>/

已创建 896 行。

TONY@ prod>/

已创建 1792 行。

TONY@ prod>/

已创建 3584 行。

TONY@ prod>/

已创建 7168 行。

TONY@ prod>/

已创建 14336 行。

TONY@ prod>/

已创建 28672 行。

TONY@ prod>/

已创建 57344 行。

TONY@ prod>/
insert into emp2 select * from emp2
*
第 1 行出现错误:
ORA-01653: 表 TONY.EMP2 无法通过 128 (在表空间 TEST01 中) 扩展


TONY@ prod>
TONY@ prod>
TONY@ prod>commit;

提交完成。

TONY@ prod>show recyclebin;

我再次进行闪回操作,很遗憾 对象已经不在回收站里了

ORA-38305: 对象不在回收站中

 

第三中操作,删除后清除回收站

TONY@ prod>select count(*) from emp2;

  COUNT(*)
----------
    114688

TONY@ prod>his
SP2-0042: 未知命令 "his" - 其余行忽略。
TONY@ prod>history
SP2-0042: 未知命令 "history" - 其余行忽略。
TONY@ prod>drop table emp2;

表已删除。

TONY@ prod>select count(*) from emp2;
select count(*) from emp2
                     *
第 1 行出现错误:
ORA-00942: 表或视图不存在


TONY@ prod>show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP2             BIN$vd6orv2bNIHgVYv2vTElrw==$0 TABLE        2021-03-19:14:36:31
TONY@ prod>flashback table "BIN$vd6orv2bNIHgVYv2vTElrw==$0" to before drop;

闪回完成。

TONY@ prod>select count(*) from emp2;

  COUNT(*)
----------
    114688

TONY@ prod>drop table emp2;

表已删除。

TONY@ prod>purge recyclebin;

回收站已清空。

TONY@ prod>show recyclebin;
TONY@ prod>flashback table emp2 to before drop;
flashback table emp2 to before drop
*
第 1 行出现错误:
ORA-38305: 对象不在回收站中


TONY@ prod>

 

第四种情况,如果表中包含索引,索引会随着表删除而删除,随着表flashback而恢复只不过显示出来会有乱码,乱码解决方法即重名命索引名

TONY@ prod>create table emp3 as select * from scott.emp;

表已创建。

TONY@ prod>create index  pk_empno emp3(empno);
create index  pk_empno emp3(empno)
                       *
第 1 行出现错误:
ORA-00969: 缺失 ON 关键字


TONY@ prod>create index  pk_empno on emp3(empno);

索引已创建。

TONY@ prod>select * from user_indexes;

INDEX_NAME                                                                                 INDEX_TYPE                                                                        TABLE_OWNER
------------------------------------------------------------------------------------------ --------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------
TABLE_NAME                                                                                 TABLE_TYPE                        UNIQUENESS                  COMPRESSION              PREFIX_LENGTH TABLESPACE_NAME                                 INI_TRANS
------------------------------------------------------------------------------------------ --------------------------------- --------------------------- ------------------------ ------------- ------------------------------------------------------------------------------------------ ----------
 MAX_TRANS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE PCT_THRESHOLD INCLUDE_COLUMN  FREELISTS FREELIST_GROUPS   PCT_FREE LOGGING       BLEVEL LEAF_BLOCKS DISTINCT_KEYS AVG_LEAF_BLOCKS_PER_KEY AVG_DATA_BLOCKS_PER_KEY CLUSTERING_FACTOR STATUS                          NUM_ROWS
---------- -------------- ----------- ----------- ----------- ------------ ------------- -------------- ---------- --------------- ---------- --------- ---------- ----------- ------------- ----------------------- ----------------------- ----------------- ------------------------ ----------
SAMPLE_SIZE LAST_ANALYZED       DEGREE                                                                                                                   INSTANCES                                                                            PARTITION TEM GEN SEC
----------- ------------------- ------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------ --------- --- --- ---
BUFFER_POOL           FLASH_CACHE           CELL_FLASH_CACHE      USER_STAT DURATION                                      PCT_DIRECT_ACCESS ITYP_OWNER
--------------------- --------------------- --------------------- --------- --------------------------------------------- ----------------- ------------------------------------------------------------------------------------------
ITYP_NAME
------------------------------------------------------------------------------------------
PARAMETERS
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
GLOBAL_ST DOMIDX_STATUS                        DOMIDX_OPSTATUS    FUNCIDX_STATUS           JOIN_INDE IOT_REDUN DROPPED   VISIBILITY                  DOMIDX_MANAGEMENT                          SEGMENT_C
--------- ------------------------------------ ------------------ ------------------------ --------- --------- --------- --------------------------- ------------------------------------------ ---------
PK_EMPNO                                                                                   NORMAL                                                                            TONY
EMP3                                                                                       TABLE                             NONUNIQUE                   DISABLED                               TEST01                                          2
       255          65536     1048576           1  2147483645                                                                              10 YES                0           1            14                       1                       1     1 VALID                             14
         14 2021-03-19 14:39:37 1                                                                                                                        1                                                                                    NO         N   N   N
DEFAULT               DEFAULT               DEFAULT               NO


YES                                                                                        NO        NO        NO        VISIBLE                                                                YES


TONY@ prod>select index_name,index_type,table_name from user_indexes;

INDEX_NAME                                                                                 INDEX_TYPE                                                                        TABLE_NAME
------------------------------------------------------------------------------------------ --------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------
PK_EMPNO                                                                                   NORMAL                                                                            EMP3

TONY@ prod>col index_name for a20
TONY@ prod>col index_type for a20
TONY@ prod>select index_name,index_type,table_name from user_indexes;

INDEX_NAME           INDEX_TYPE           TABLE_NAME
-------------------- -------------------- ------------------------------------------------------------------------------------------
PK_EMPNO             NORMAL               EMP3

TONY@ prod>
TONY@ prod>
TONY@ prod>
TONY@ prod>
TONY@ prod>
TONY@ prod>drop table emp3;

表已删除。

TONY@ prod>show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP3             BIN$vd6orv2eNIHgVYv2vTElrw==$0 TABLE        2021-03-19:14:41:12
TONY@ prod>select index_name,index_type,table_name from user_indexes;

未选定行

TONY@ prod>select * from user_constraints;

未选定行

TONY@ prod> flashback table emp3 to before drop;

闪回完成。

TONY@ prod>select * from user_constraints;

未选定行

TONY@ prod>select index_name,index_type,table_name from user_indexes;

INDEX_NAME           INDEX_TYPE           TABLE_NAME
-------------------- -------------------- ------------------------------------------------------------------------------------------
BIN$vd6orv2dNIHgVYv2 NORMAL               EMP3
vTElrw==$0


TONY@ prod>select * from emp3;

     EMPNO ENAME                          JOB                                MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ------------------------------ --------------------------- ---------- ------------------- ---------- ---------- ----------
      7369 SMITH                          CLERK                             7902 1980-12-17 00:00:00        800                    20
      7499 ALLEN                          SALESMAN                          7698 1981-02-20 00:00:00       1600        300         30
      7521 WARD                           SALESMAN                          7698 1981-02-22 00:00:00       1250        500         30
      7566 JONES                          MANAGER                           7839 1981-04-02 00:00:00       2975                    20
      7654 MARTIN                         SALESMAN                          7698 1981-09-28 00:00:00       1250       1400         30
      7698 BLAKE                          MANAGER                           7839 1981-05-01 00:00:00       2850                    30
      7782 CLARK                          MANAGER                           7839 1981-06-09 00:00:00       2450                    10
      7788 SCOTT                          ANALYST                           7566 1987-04-19 00:00:00       3000                    20
      7839 KING                           PRESIDENT                              1981-11-17 00:00:00       5000                    10
      7844 TURNER                         SALESMAN                          7698 1981-09-08 00:00:00       1500          0         30
      7876 ADAMS                          CLERK                             7788 1987-05-23 00:00:00       1100                    20
      7900 JAMES                          CLERK                             7698 1981-12-03 00:00:00        950                    30
      7902 FORD                           ANALYST                           7566 1981-12-03 00:00:00       3000                    20
      7934 MILLER                         CLERK                             7782 1982-01-23 00:00:00       1300                    10

已选择14行。

TONY@ prod>
TONY@ prod>alter index "BIN$vd6orv2dNIHgVYv2vTElrw==$0" rename to pk_empno;

索引已更改。

TONY@ prod>select index_name,index_type,table_name from user_indexes;

INDEX_NAME           INDEX_TYPE           TABLE_NAME
-------------------- -------------------- ------------------------------------------------------------------------------------------
PK_EMPNO             NORMAL               EMP3

TONY@ prod>

 

OWNER:Jrojyun

DATE:2021-03-19

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值