欢迎投稿

今日深度:

Oracle 闪回表实验,oracle闪回实验

Oracle 闪回表实验,oracle闪回实验


作业:闪回表实验

1.构造测试表flb_test,数据不小于10000行;

TEST_USER1@PROD>create table flb_test(id number,dd date);

Table created.

TEST_USER1@PROD>begin
  2  for i in 1..10000
  3  loop
  4  insert into flb_test values (i,sysdate+i);
  5  end loop;
  6  end;
  7  /

PL/SQL procedure successfully completed.

exec dbms_stats.gather_table_stats('TEST_USER1','FLB_TEST');
 --收集统计信息


2.查询当前时间与scn号;

TEST_USER1@PROD>select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2014-10-13 19:23:29

TEST_USER1@PROD>select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1144357

3.查看该测试表block数目及大小M;

TEST_USER1@PROD>select SEGMENT_NAME,BYTES/1024/1024 size_m, BLOCKS from user_segments   
  2  where SEGMENT_NAME='FLB_TEST';

SEGMENT_NAME        SIZE_M     BLOCKS
--------------- ---------- ----------
FLB_TEST               .25         32


4.在这张表的第一和第二列上,创建一个复合索引ind_flb;

TEST_USER1@PROD>create index ind_flb on flb_test(id,dd);

Index created.

5.查看该索引的叶子块的数目以及层数;

TEST_USER1@PROD>select INDEX_NAME,STATUS ,BLEVEL,LEAF_BLOCKS from dba_indexes 
  2  where index_name ='IND_FLB';

INDEX_NAME                     STATUS       BLEVEL LEAF_BLOCKS
------------------------------ -------- ---------- -----------
IND_FLB                        VALID             1          33

   --平衡树:  高度=层数+1

TEST_USER1@PROD>select SEGMENT_NAME,BYTES/1024/1024 size_m, BLOCKS from user_segments
  2  where SEGMENT_NAME='FLB_TEST';

SEGMENT_NAME        SIZE_M     BLOCKS
--------------- ---------- ----------
FLB_TEST               .25         32


6.删除测试表中一半的记录数并提交;

TEST_USER1@PROD>delete from flb_test where id<=5000;

5000 rows deleted.

TEST_USER1@PROD>commit;

Commit complete.

TEST_USER1@PROD>select count(*) from flb_test;

  COUNT(*)
----------
      5000

TEST_USER1@PROD>exec dbms_stats.gather_table_stats('TEST_USER1','FLB_TEST');

PL/SQL procedure successfully completed.

TEST_USER1@PROD>exec dbms_stats.gather_index_stats('TEST_USER1','IND_FLB');

PL/SQL procedure successfully completed.
    --收集表和索引的统计信息

7.闪回fls_test到第二步查询到的时间点;

TEST_USER1@PROD>select table_name ,row_movement from user_tables;

TABLE_NAME                     ROW_MOVE
------------------------------ --------
SALARY                         ENABLED
SYS_TEMP_FBT                   DISABLED
FLB_TEST                       DISABLED
EMP                            DISABLED

TEST_USER1@PROD>alter table flb_test enable row movement;

Table altered.

TEST_USER1@PROD>select table_name ,row_movement from user_tables;

TABLE_NAME                     ROW_MOVE
------------------------------ --------
EMP                            DISABLED
FLB_TEST                       ENABLED
SYS_TEMP_FBT                   DISABLED
SALARY                         ENABLED

TEST_USER1@PROD>flashback table flb_test to timestamp to_timestamp('2014-10-13 19:23:29','yyyy-mm-dd hh24:mi:ss');

Flashback complete.


TEST_USER1@PROD>exec dbms_stats.gather_table_stats('TEST_USER1','FLB_TEST');

PL/SQL procedure successfully completed.

TEST_USER1@PROD>exec dbms_stats.gather_index_stats('TEST_USER1','IND_FLB');

PL/SQL procedure successfully completed.
    --收集表和索引的统计信息
    --Oracle只是闪回表,所有的东西都原样保留,应重新收集统计信息


8.查看闪回结果,以及索引状态;

TEST_USER1@PROD>select count(*) from flb_test;

  COUNT(*)
----------
     10000

TEST_USER1@PROD>select INDEX_NAME,STATUS ,BLEVEL,LEAF_BLOCKS from dba_indexes
  2  where index_name ='IND_FLB';

INDEX_NAME                     STATUS       BLEVEL LEAF_BLOCKS
------------------------------ -------- ---------- -----------
IND_FLB                        VALID             1          33

 

 


oracle高级数据库应用,实验报告:数据闪回 使用flashback实现对表、模式以及数据库级误删除进行恢复

首先你要知道依赖关系:
flashback database依赖于:闪回日志
flashback drop依赖于:回收站
flashback table/query依赖于:undo
开启闪回要在mount状态下:
alter system set db_flashback_retention_target=2880 scope=both;
alter database flashback on;
再者你要利用事务号获得undo语句
查看事务号:select versions_xid,empno,ename,sal from tt01
versions between timestamp minvalue and maxvalue
order by empno;
根据得到的事务号查看undo_sql语句:
select undo_sql from flashback_transaction_query
where xid='versions_xid' //这里的XID就是上面查询到的versions_xid
如果只是闪回误删除的表:
flashback table TT01 to before drop;
闪回的是最近删除的一张表,当然也可以根据情况自定义闪回误删的表
步骤:
查看DB回收站内容:show recyclebin;
在里面可以查看到删除的表,根据里面的recyclebin name可以来查看表结构
比如:desc "BIN$3naDFKEKFIDISB332DI"
 

指点oracle闪回表有什限制?

用百度能搜大把出来吧。。。。

使用的限制和注意事项:
1. 使用闪回表语句恢复表到出现人为或应用错误事件之前的状态。

2. 可以闪回到过去多长时间取决于系统中undo数据量的大小。

3. 并且oracle数据库无法恢复通过DDL语句修改了结构的表。

4.oracle强烈建议设置UNDO_MANAGEMENT为AUTO(自动管理回滚数据)。另外,设置UNDO_RETENTION (回滚数据的保留时间)为一个合适的时间间隔。

5.你不能回滚flash back语句,然而你可以使用另外一个flash back语句并且指定一个当前时间之前的时间点。在声明一个flash back语句之前先记录下当前的SCN号。

另外如果要使用闪回表

1. 我们需要有在指定表上有flashback的权限或者FLASHBACK ANYTABLE权限才能闪回一个表到之前的时间点;

2.必须有对表的SELECT, INSERT, DELETE, andALTER object privileges一系列权限;

3.除非是使用TO BEFORE DROP,对于分区表的闪回都应该开启Row movement (alter table test_move enable row movement;)
一般用于分区表,某一行更新时,如果更新的是分区列,并且更新后的列值不属于原来的这个分区,如果开启了这个选项,就会把这行从这个分区中delete 掉,并加到更新后所属的分区。相当于一个隐式的delete+insert,但是不会触发insert/delete触发器。如果没有开启这个选项,就会在更新时报错。

4.恢复一个表到一个还原点,必须拥有SELECT ANY DICTIONARY orFLASHBACKANY TABLE system privilege or theSELECT_CATALOG_ROLE role。
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/3845.html NewsArticle Oracle 闪回表实验,oracle闪回实验 作业:闪回表实验 1.构造测试表flb_test,数据不小于10000行; TEST_USER1@PRODcreate table flb_test(id number,dd date); Table created. TEST_USER1@PRODbegin 2 for i in 1..10000 3 l...
评论暂时关闭