目录
一、目标
1、掌握9i的闪回查询的方法
2、掌握10g的闪回版本查询的方法
3、掌握10g的闪回事务查询的方法,以及如何结合闪回版本查询、闪回事务查询来恢复数据
4、掌握10g的闪回表的方法
5、掌握10g的闪回删除的方法
6、掌握10g的闪回数据库的方法
二、Oracle9i的闪回查询
1、四种SCN
闪回查询从9i引入,可以按照时间点或者SCN【System Change Number 简称 SCN,在ORACLE中,有四种SCN,分别为:系统检查点SCN、数据文件检查点SCN、启动SCN、终止SCN。SCN最大值:281,474,976,710,656】向前查询,获取修改 前的数据。
2、设置undo_retention
闪回查询依赖于回滚段中存储的数据前镜像,通过设置undo_retention参数设置前镜像的保留时间。
3、查询的语法:
select … as of scn | timestamp
4、举例:
(1)记录第一个时间点 select to_char(sysdate,'yyyymmdd hh24:mi:ss')from dual; TO_CHAR(SYSDATE,' ----------------- 20200427 10:49:13 (2)创建表,并插入数据 create table student(sno int,sname varchar2(10),sage int); insert into student values(1,'Tom',21); insert into student values(2,'Kite',22); insert into student values(3,'Bob',23); insert into student values(4,'Peter',24); insert into student values(5,'Mike',25); commit; (3)记录第二个时间点 SQL> select to_char(sysdate,'yyyymmdd hh24:mi:ss')from dual; TO_CHAR(SYSDATE,' ----------------- 20200427 10:49:39 (4)删除一行 SQL>delete student where sno=1; SQL>commit; (5)记录第三个时间点 SQL> select to_char(sysdate,'yyyymmdd hh24:mi:ss')from dual; TO_CHAR(SYSDATE,' ----------------- 20200427 10:51:05 (6)更新数据 SQL> update student set sage = 50; (7)记录第四个时间点 SQL> select to_char(sysdate,'yyyymmdd hh24:mi:ss')from dual; TO_CHAR(SYSDATE,' ----------------- 20200427 10:51:32(8)查询第3个时间点的记录SQL> select * from student as of timestamp to_date('20200427 10:51:05','yyyymmdd hh24:mi:ss'); SNO SNAME SAGE ----- ---------- ---------- 2 Kite 22 3 Bob 23 4 Peter 24 5 Mike 25
5、查询时间
select to_char(sysdate,'yyyymmdd hh24:mi:ss')from dual;
6、查询SCN
SQL>select dbms_flashback.get_system_change_number from dual;
7、SCN与时间戳转换
select scn_to_timestamp(9804400) from dual; select timestamp_to_scn(to_date('20200427 10:51:32','yyyymmdd hh24:mi:ss')) timestamp_to_scn from dual;
三、Oracle10g的闪回版本查询
1、9i与10g的不同
(1)对于9i的闪回查询进行增强,Oracle10g提供了闪回版本查询,因为9i的闪回查询仅仅能够得到过去某个时间点上的数据,但是无法反映出一段时间内数据表中数据的变化,
(2)10g的闪回版本查询可以对时间段内数据表的不同版本进行查询。
2、闪回版本查询的语法:
select … from … versions between
其中,select后面可以选择伪列(列不在表中,但是可以使用),来获得事务的开始、结束时间、SCN号、ID号等。
3、举例:
(1)创建表
create table student(sno int,sname varchar2(10),sage int); insert into student values(1,'Tom',21); insert into student values(2,'Kite',22); insert into student values(3,'Bob',23); insert into student values(4,'Peter',24); insert into student values(5,'Mike',25); commit;
(2)记录第一个时间:
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') sys_date from dual;
SYS_DATE
-------------------
2020-04-29 20:38:35
(3)更新表:
update student set sno=11 where sno=1; commit; update student set sname='zhangsan' where sno=2; commit; delete student where sno=5; commit; update student set sage =sage+100; commit;
(4)查看表经历的变化过程:
select versions_starttime,versions_endtime,versions_xid,versions_operation,sno,sname,sage from student versions between timestamp minvalue and maxvalue; 表前面是最新发生的,versions_XID,事务号,同一个命令,事务号相同 select versions_starttime,versions_endtime,versions_xid,versions_operation,sno,sname,sage from student versions between scn minvalue and maxvalue;
四、Oracle10g的闪回事务查询
1、Oracle10g可以进行基于闪回版本查询的恢复,就是闪回事务查询。
2、flashback_transaction_query
从flashback_transaction_query中查询引起数据变化的事务,和撤销事务的SQL语句,就是查询 operation和undo_sql 列。
SQL>select xid,operation,undo_sql from flashback_transaction_query where table_name='STUDENT' and table_owner='SCOTT' order by START_TIMESTAMP desc;
3、查出来为空:使用如下更改数据库配置
alter database add supplemental log data
4、增加上述配置后,重新查询
5、撤销前的记录:
6、执行undo_sql撤销后记录:
update "SCOTT"."STUDENT" set "SAGE" = '21' where ROWID = 'AAAUe+AAEAAAACkAAA'; update "SCOTT"."STUDENT" set "SAGE" = '22' where ROWID = 'AAAUe+AAEAAAACkAAB'; update "SCOTT"."STUDENT" set "SAGE" = '23' where ROWID = 'AAAUe+AAEAAAACkAAC'; update "SCOTT"."STUDENT" set "SAGE" = '24' where ROWID = 'AAAUe+AAEAAAACkAAD';
五、Oracle10g的闪回表
1、闪回表是什么
闪回表是把表里的数据回退到以前的某个时刻或者SCN上。
2、特点:
可以在线操作;自动恢复相关的属性,包括索引、触发器等。
3、前提:
对表启用行迁移。alter table scott.sudent enable row movement;
4、语法:
flashback table <table_name> to timestamp | scn
注意:sys的表不能闪回。
5、举例:
sys执行或scott都可以
SQL>flashback table scott.student to scn 10923200;需要启用行迁移
开启行迁移:SQL>alter table scott.sudent enable row movement;
六、Oracle10g的闪回删除
Oracle10g的闪回删除:可以恢复一个被drop的对象,因为进行drop时,Oracle先把它放到回收站中。
1、回收站内的信息:show recyclebin或select * from recyclebin
2、闪回删除:flashback table <table_name> to before drop;
3、彻底删除:drop table <table_name> purge;
4、清空回收站: purge recyclebin;
5、通过参数recyclebin来启用、禁用回收站:
SQL>show parameter recyclebin SQL>alter session set recyclebin=off SQL>alter session set recyclebin=on
6、通过回收站查找原表名称
SQL>select * from user_recyclebin;
七、Oracle10g的闪回数据库
如果数据库出现逻辑错误,无法采用闪回表的方式进行恢复,或者数据库的结构发生了改变,可以通过闪回数据库的方式把整个数据库回退到出错前的时间点上。步骤:
1、配置数据库为归档模式【必须在mount下闪回】
SQL>alter database archivelog
2、配置闪回恢复区【数据库open状态下就可以启用】
(1)位置:db_recovery_file_dest
(2)大小:db_recovery_file_dest_size
3、配置闪回保留时间【数据库open状态下就可以启用】
db_flashback_retention_target
4、启用数据库闪回【数据库open状态下就可以启用】
SQL>alter database flashback on;
5、查看闪回是否启用
SQL>select flashback_on from v$database
6、进行闪回数据库【必须在mount下闪回】
SQL>startup mount; SQL>flashback database to timestamp |scn; SQL>alter database open read only; SQL>startup force; SQL>alter database open resetlogs;---此时redo.log已经不好用了,所以需要用resetlogs打开
7、测试:
文章评论