再学oracle 10g flashback table

来源:互联网 发布:java web start安装 编辑:程序博客网 时间:2024/09/21 09:04
 

flashback table与9i的flashback query相似,利用undo信息来恢复一个或者一些表到现在以前的一个时间点(一个快照)。Undo相关参数如下,需要确保AUM与足够的retention值。
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- -----------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
首先要说明的是,flashback table不等于flashback query,所谓query,仅仅是查询以前的一个快照点而已,并不改变当前表的状态,而flashback table不一样,将改变当前表及附属对象一起回到以前的时间点。
其实9i的flashback query在10g中也有了新的变化,10g中可以简单的利用以下语句实现flashback query,而不再需要象9i那样需要调用DBMS_FLASHBACK包。
SELECT * FROM TABLENAME AS OF TIMESTAMP
TO_TIMESTAMP('2003-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
WHERE ……;

10g的flashback table有如下特性
? 在线操作
? 恢复到指定时间点或者SCN的任何数据.
? 自动恢复相关属性,如索引,触发器等
? 满足分布式的一致性
? 满足数据一致性,所有相关对象将自动一致
语法为:
FLASHBACK TABLE tablename TO TIMESTAMP (JUL-07-2003, 02:33:00)
FLASHBACK TABLE employee TO SCN 123456;
FLASHBACK TABLE t1 TO TIMESTAMP '2003-03-03 12:05:00' ENABLE TRIGGERS;
其中ENABLE TRIGGERS表示触发器恢复之后为enable状态,而默认为disable状态。

注意:如果需要flashback一个表,需要保证
需要有flashback any table的系统权限或者是该表的flashback对象权限。
需要有该表的SELECT, INSERT, DELETE, ALTER权限
必须保证该表ROW MOVEMENT

下面,我们用一个详细的例子来说明这个过程:
16:16:51 SQL> create user flash identified by flash;
User created.
16:17:04 SQL> grant connect,resource to flash;
Grant succeeded.
16:17:19 SQL> connect flash/flash;
Connected.
16:26:35 SQL> create table t1 as select * from all_objects;
Table created.
16:37:24 SQL> create table t2 as select * from t1;
Table created.

16:37:35 SQL> select count(*) from t1;
COUNT(*)
----------
38949
16:37:43 SQL> select count(*) from t2;
COUNT(*)
----------
38949
16:38:06 SQL> create index inx_test1 on T1 (object_name);
Index created.
16:39:55 SQL> create index inx_test2 on T1 (object_id);
Index created.
16:40:47 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2004-04-06 16:41:18
以上获得一个时间戳,假定我们要恢复该表到这个时间,那么以下对该表的操作都将被前滚。
16:41:18 SQL> drop index inx_test1;
Index dropped.
16:41:33 SQL> delete from t1;
38949 rows deleted.
16:41:46 SQL> commit;
Commit complete.
16:41:49 SQL> truncate table t2;
Table truncated.

在以上的操作中,我们delete一个表,然后truncate一个表,下面,我们将来看看flashback table的效果,能恢复到什么程度
16:37:55 SQL> ALTER TABLE t1 ENABLE ROW MOVEMENT;
Table altered.
16:38:03 SQL> ALTER TABLE t2 ENABLE ROW MOVEMENT;
Table altered.

16:43:10 SQL> flashback table t1 TO TIMESTAMP to_timestamp('2004-04-06 16:41:18','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
16:43:49 SQL> flashback table t2 TO TIMESTAMP to_timestamp('2004-04-06 16:41:18','yyyy-mm-dd hh24:mi:ss');
flashback table t2 TO TIMESTAMP to_timestamp('2004-04-06 16:41:18','yyyy-mm-dd hh24:mi:ss')
*
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed

我们可以发现,执行delete操作的表是可以恢复的,而执行truncate操作的表是不可以恢复的,这正好也说明了flashback table利用undo的结论。
看看我们的结果:
SQL> select count(*) from t1;
COUNT(*)
----------
38949
SQL> select count(*) from t2;
COUNT(*)
----------
0

SQL> select t.index_name from user_indexes t where t.table_name='T1';
INDEX_NAME
------------------------------
INX_TEST2
还可以看到,对于drop的索引,也是没有办法恢复的,因为drop并不记录undo,所以所谓索引的恢复,仅仅是相关索引树的改变而不能找回删除掉的索引。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脑组织供血不足怎么办 尖锐湿锐喝酒了怎么办 快递寄错地方了怎么办 16岁掉头发严重怎么办 18岁老是掉头发怎么办 17岁头发老是掉怎么办 19岁老是掉头发怎么办 植发的了毛囊炎怎么办 长得好看不上镜怎么办 鬓角的头发总翘怎么办 戴贞洁锁硬了怎么办 欠很多钱还不了怎么办 理财平台跑路了怎么办 联通4g信号不好怎么办 老年人耳朵嗡嗡响什么原因怎么办 单侧耳朵嗡嗡响怎么办 蚊子钻到耳朵里怎么办 小飞虫进耳朵里怎么办 耳朵里飞进去虫怎么办 耳朵里进虫子了怎么办 耳朵进虫子了怎么办啊 耳朵里进了蚊子怎么办 有虫子爬进耳朵怎么办 虫子死在耳朵里怎么办 早上起床口苦口臭怎么办 耳朵被耳屎堵了怎么办 油耳朵被堵住了怎么办 棉签掏耳朵堵了怎么办 耳朵被气堵住了怎么办 掏耳朵发炎了疼怎么办 掏耳朵掏深了疼怎么办 耳朵里进了虫子怎么办? 耳朵里飞进小虫怎么办 一只耳朵听力差怎么办 62岁耳朵有点聋怎么办 一支耳朵有点聋怎么办 80岁老人耳朵聋怎么办 被nlp课程洗脑了怎么办 手上张了个鸡眼怎么办 手上长了个鸡眼怎么办 6岁儿童手指脱皮怎么办