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