一,Flashback Table功能描述
将数据表恢复到之前的一个时间点或SCN号。
注意:该功能将改变当前表及附属对象统一闪回到之前的一个状态。
二,需要修改的系统参数
undo_management,参数需要是“AUTO”,保证回滚段使用模式是SMU mode
undo_retention,单位是秒,调整可回滚的时间范围
确认系统的相关参数
三,原理
闪回表(Flashback table)与闪回查询(Flashback query)的原理大致相同,也是利用undo信息来恢复表对象到以前的某一个时间点(一个快照),因此也要确
保AUM(automatic undo management)有足够的Retention值。Flashback table技术是以Undo segment中的内容为基础的, 因此受限于UNDO_RETENTON参数。要
使用flashback 的特性,必须启用自动撤销管理表空间。
但闪回表不等于闪回查询,其区别如下:
闪回查询只是查询以前的一个快照而已,并不改变当前表的状态。
闪回表则是将恢复当前表及附属对象一起回到以前的时间点。
四,特性:
1. 在线操作
2. 恢复到指定的时间点(或者SCN)的任何数据
3. 自动恢复相关属性
4. 满足分布式的一致性
5. 数据的一致性,所有相关对象将自动一致。
五,语法:
SQL> flashback table flashback_table_test to timestamp to_timestamp('2012-12-29 16:44:17', 'yyyy-mm-dd hh24:mi:ss');
SQL> flashback table flashback_table_test to scn 662421;
SQL> flashback table flashback_table_test to timestamp to_timestamp('2012-12-29 16:44:17', 'yyyy-mm-dd hh24:mi:ss') enable triggers;
六,运用闪回表前提
1,普通用户中需要有Flashback any table的系统权限。命令如:
2.,有该表的select、insert、delete、alter权限。
3,必须保证该表有row movement(行移动)。
七,下面是具体的实验:
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
1.创建flashback_table_test表
SQL> conn hr/hr
Connected.
SQL> create table flashback_table_test as select * from employees;
Table created.
2.查询flashback_table_test表中数据量
SQL> select count(*) from flashback_table_test;
COUNT(*)
----------
107
3.为flashback_table_test表创建索引和触发器(触发器为null,不做任何操作)
SQL>create index ind_test on flashback_table_test(employee_id);
SQL> create or replace trigger tr_test
after update on flashback_table_test
for each row
begin
null;
end
tr_test;
/
Trigger created
4.记录当时的时间点,试图恢复到该时间点
SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') time, to_char(dbms_flashback.get_system_change_number) scn from dual;
TIME SCN
-------------------------------------- --------------------------------------------------------------------------------
2012-12-29 16:44:17 662421
oracle 10g可以通过下面得到SCN。
SQL> SELECT current_scn from v$database;
CURRENT_SCN
-----------
662403
5.删除flashback_table_test表中数据
SQL> delete from flashback_table_test;
107 rows deleted.
SQL> commit;
Commit complete.
6.查询删除数据后的flashback_table_test,确定其表中已没有数据
SQL> select count(*) from flashback_table_test;
COUNT(*)
----------
0
7.删除flashback_table_test表中索引ind_test
SQL> drop index ind_test;
Index dropped
8.更改tr_test触发器
SQL> create or replace trigger tr_test
after insert on flashback_table_test
for each row
begin
null;
end
tr_test;
/
Trigger created
9.确保该表中的行迁移(row movement)功能
SQL> alter table flashback_table_test enable row movement;
Table altered
10.恢复flashback_table_test表到刚记录的时间点(或scn),由于表中存在触发器,因此使用了关键字enable triggers;
SQL> flashback table flashback_table_test to timestamp to_timestamp('2012-12-29 16:44:17', 'yyyy-mm-dd hh24:mi:ss') enable triggers;
Flashback complete.
11.查看恢复结果如下:(数据回来了)
SQL> select count(*) from flashback_table_test;
COUNT(*)
----------
107
但是索引没有回来
SQL> select index_name from user_indexes where table_name = 'flashback_table_test';
INDEX_NAME
------------------------------
SQL> select object_name, status from user_objects where object_name in('TR_TEST', 'IND_TEST');
OBJECT_NAME STATUS
------------------------------ --------------
TR_TEST VALID
SQL> set pages 0
SQL> set line 100
SQL> set long 2000
SQL> select text from user_source t where t.name = 'TR_TEST';
trigger tr_test
after insert on flashback_table_test
for each row
begin
null;
end
tr_test;
7 rows selected.
总结:
1. Flashback table在真正的高可用环境中,使用意义不大,受限比较多,要必须确保行迁移功能
2. Flashback table过程中,阻止写操作
3. 使用flashback table可以将delete方式删除的表闪回到之前某个时间点,而表中索引却不能正常恢复,因为drop索引的过程是不记录undo的。
4. 恢复的触发器本身还是修改后的,并不随表flashback到修改以前的时间点。说明关键字enable triggers只能保证触发器的状态正常,而不是内容回滚.
5. 由于原理利用其undo信息,来恢复其对象,因此也是不能恢复truncate数据
6. 恢复数据用flashback query实现比较好
7,flashback table功能不能够将被truncate的表内容恢复出来,原因也是truncate操作过程是不记录undo信息。
其他注意:
1.当闪回删除操作之前,如果某个键值如主键被重用,将导致违反主键约束,闪回失败。
2.若闪回所需要的UNDO信息不存在,将引发ORA-08180:no snapshot found based on specified time(未找到基于指定时间的快照)错误
3.如果受闪回影响的记录被其它用户锁定,将引发ORA-00054:resource busy and acquire with NOWAIT specified (资源忙碌)错误
4.表定义在闪回期间不能发生变化,否则导致ORA-01466:unable to read data - table definition has changed(表定义已变化)错误
5.闪回前未启用row movement,将收到ORA-08189: cannot flashback the table because row movement is not enabled 错误
6.对于存在参照关系的情况,建议将主表等一起实施闪回,否则,将收到ORA-02091: transaction rolled back,ORA-02291错误
7.SYS 模式中的表不能使用表闪回技术
在汇编中 $ 的作用是取 $ 所在处的地址。所以jmp $就是一个死循环了。除非有
中断,会转去执行中断服务程序。但要注意的是:返回的地址还是jmp $,而不是其
下一条语句。
因为,在jmp $执行是会把jmp $语句所在的地址装到程序计数器PC中。中断来临
后PC被压栈。中断服务程序返回后,从栈中取回PC的值并开始执行。此时,PC的值
是jmp $的地址!
微机课设就栽在了这条语句上了。。。
个人觉得遇到这个问题的主要原因就在于不够理解什么才叫“下一条语句”。在调用
函数返回的时候,我们经常会说返回到下一条语句,而这下一条语句时由PC指定的。
建议最好先看看上一篇http://ylq365.iteye.com/blog/1763856
上一篇主要是说明了用tortoisesvn怎么merge
下面主要说一下在eclipse下怎么merge,这里eclipse没有安装工具的就先安装svn,可以参考
http://ylq365.iteye.com/blog/1571052#bc2288353
在eclipse下就行代码的merge也很简单
首先把svn拉到本地,这个还用我们一篇中建的工程
然后查看我们的工程,点右键merge
这里面的三个选项和tortoisesvn是对应的
这是唯一不一样的就是,tortoisesvn的第二项在这里变成了第三项,就是这个名字reintegrate 如果选了这个本地文件是不能有修改的,其他两个没有这方面的要求
已有 0 人发表留言,猛击->>这里<<-参与讨论
ITeye推荐
- —软件人才免语言低担保 赴美带薪读研!—