前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【DB笔试面试812】在Oracle中,什么是闪回表(Flashback TABLE)?

【DB笔试面试812】在Oracle中,什么是闪回表(Flashback TABLE)?

作者头像
小麦苗DBA宝典
发布2020-06-04 10:39:51
5130
发布2020-06-04 10:39:51
举报

题目部分

在Oracle中,什么是闪回表(Flashback TABLE)?

答案部分

闪回表(Flashback TABLE)是将表恢复到过去的某个时间点或某个SCN值时的状态。对闪回表语句不能进行回滚,如果要闪回表,那么需要有对表的FLASHBACK对象权限或者FLASHBACK ANY TABLE系统权限。

代码语言:javascript
复制
LHR@orclasm > CREATE TABLE T_FT_20170617_LHR (A NUMBER,B NUMBER);

Table created.

LHR@orclasm > INSERT INTO T_FT_20170617_LHR VALUES(1,1);

1 row created.

LHR@orclasm > COMMIT;

Commit complete.

LHR@orclasm > SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                67902120

LHR@orclasm > INSERT INTO T_FT_20170617_LHR VALUES(2,2);

1 row created.

LHR@orclasm > COMMIT;

Commit complete.

LHR@orclasm > SELECT * FROM T_FT_20170617_LHR;

         A          B
---------- ----------
         1          1
         2          2

LHR@orclasm > SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                67902215

LHR@orclasm > FLASHBACK TABLE T_FT_20170617_LHR TO SCN 67902120;----闪回表的时候,需要对表执行ROW MOVMENT
FLASHBACK TABLE T_FT_20170617_LHR TO SCN 67902120
                *
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled


LHR@orclasm > ALTER TABLE T_FT_20170617_LHR ENABLE ROW MOVEMENT;

Table altered.

LHR@orclasm > FLASHBACK TABLE T_FT_20170617_LHR TO SCN 67902120;

Flashback complete.

LHR@orclasm > SELECT * FROM T_FT_20170617_LHR;

         A          B
---------- ----------
         1          1

LHR@orclasm > FLASHBACK TABLE T_FT_20170617_LHR TO SCN 67902215;---闪回到最后的位置

Flashback complete.

LHR@orclasm > SELECT * FROM T_FT_20170617_LHR;

         A          B
---------- ----------
         1          1
         2          2

下面是验证索引在FLASHBACK TABLE TO SCN中的情况:

代码语言:javascript
复制
LHR@orclasm > DROP TABLE T_FT_20170617_LHR;

Table dropped.

LHR@orclasm > CREATE TABLE T_FT_20170617_LHR (A NUMBER,B NUMBER);

Table created.

LHR@orclasm >  INSERT INTO T_FT_20170617_LHR VALUES(1,1);

1 row created.

LHR@orclasm > COMMIT;

Commit complete.

LHR@orclasm > SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                67902871

LHR@orclasm > INSERT INTO T_FT_20170617_LHR VALUES(2,2);

1 row created.

LHR@orclasm > COMMIT;

Commit complete.

LHR@orclasm > CREATE INDEX IDX_T_LHR ON T_FT_20170617_LHR(A);

Index created.

LHR@orclasm > SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;---该SCN表中存在索引

GET_SYSTEM_CHANGE_NUMBER
------------------------
                67902969

LHR@orclasm > INSERT INTO T_FT_20170617_LHR VALUES(3,3);

1 row created.

LHR@orclasm > COMMIT;

Commit complete.

LHR@orclasm > SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                67903002

LHR@orclasm > SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME='T_FT_20170617_LHR';

INDEX_NAME                     STATUS
------------------------------ --------
IDX_T_LHR                      VALID

LHR@orclasm > ALTER TABLE T_FT_20170617_LHR ENABLE ROW MOVEMENT;

Table altered.

LHR@orclasm > FLASHBACK TABLE T_FT_20170617_LHR TO SCN 67902871;

Flashback complete.

LHR@orclasm > SELECT * FROM T_FT_20170617_LHR;--恢复到没有创建索引之前的SCN

         A          B
---------- ----------
         1          1

LHR@orclasm > SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME='T_FT_20170617_LHR';--此时索引仍然存在

INDEX_NAME                     STATUS
------------------------------ --------
IDX_T_LHR                      VALID

LHR@orclasm > FLASHBACK TABLE T_FT_20170617_LHR TO SCN 67903002;--闪回到最后的SCN

Flashback complete.

LHR@orclasm > SELECT * FROM T_FT_20170617_LHR;

         A          B
---------- ----------
         1          1
         2          2
         3          3

LHR@orclasm >  DROP INDEX IDX_T_LHR;

Index dropped.

LHR@orclasm >  FLASHBACK TABLE T_FT_20170617_LHR TO SCN 67902969;--闪回到创建索引的SCN ,但是经过闪回后索引已经不再存在了

Flashback complete.

LHR@orclasm > SELECT INDEX_NAME,STATUS FROM USER_INDEXES WHERE TABLE_NAME='T_FT_20170617_LHR';

no rows selected

LHR@orclasm > 

本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DB宝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档