闪回可以做的操作有如下几种类型:
1、当数据错误删除,并且提交时(flashback table)
2、当错误删除了一张表drop table(flashback drop)
3、通过闪回获取表的历史记录(flashback version query)
4、当错误地执行了一个事务,并且提交了(flashback transaction query)
5、将整个数据库进行恢复。
使用闪回条件:
1、切换到管理员上。
假设开始登录的用户名和密码是MISPS
如果是连接远程的,连接sqlplus的方式是:
sqlplus MISPS/[email protected]:1521/nmcdb.nmc.gov.cn as sysdba;(此时用户名为MISPS,密码为MISPS,nmcdb.nmc.gov.cn为servicename)。
执行下面的命令切换到管理员:
conn / as sysdba;
2、查询undo表空间(undo是一个表空间,这个表空间对应着很多物理上的存储文件,这些文件中记录了所有的操作日志,闪回就是通过undo这个表空间里的日志来做的)
查看表空里的参数
show parameters undo;
结果为:
注意:undo_retention这个参数表示的是闪回的时间限制,其后面的value表示900秒。表示超过2个G的数据,在过了900秒之后不可以回复了。在900秒之内可以恢复!
将900秒改成20分钟的命令: alter system set undo_retention=1200 scope=both;
scope的取值:1、memory(在当前的会话中有效),2.spfile(在配置文件修改,不修改当前会话),3.both(既修改当前会话也修改配置文件)
3闪回表概念:
闪回表,实际上是将表中的数据快速恢复到过去的一个是焦点或者系统改变号SCN上。实际表的闪回,需要使用到与撤销表空间相关的undo信息,通过
show parameter undo命令可以了解这些信息。
用户对表数据的修改操作,都记录在撤销表空间中,这为表的闪回提供了数据恢复的基础。例如,修改某个操作在提交后被记录在撤销表空间,保留时间
为900秒,用户可以在这900秒的时间内对表进行闪回操作,从而将表中的数据恢复到修改之前的状态。
执行表的闪回,需要有flashback any table的权限。
4、授予MISPS用户闪回表的权限
grant flashback any table to MISPS;
这时候MISPS就可以执行闪回表的相关操作了。
5、这时候回到MISPS用下:conn MISPS/MISPS
6、闪回表的语法:
FLASHBACK TABLE [schema.]<table_name>
TO
{[BEFORE DROP
[RENAME TO table]]
[SCN|TIMESTAMP]expr
[ENABLE|DISABLE]TRIGGERS}
schema:模式名,一般为用户名
TO TIMESTAMP:系统邮戳,包含年、月、日、时、分、秒。
TO SCN:系统改变好(system change number,对应修改时的时间)
ENABLE TRIGGERS:表示触发器恢复以后为enable状态,而默认为disable状态。
TO BEFORE DROP:表示恢复到删除之前。
RENAME TO table:表示更换表名。
7、通过时间获取SCN
select timestamp_to_scn(sysdate) from dual;
8、单独创建一张表,来做实验
create table flashback_table
(fid number,
fname varchar(20))
插入3条数据insert into flashback_table values(1,‘tom‘):
查询一下结果:
select * from flashback_table;
10、记录当前的SCN
select timestamp_to_scn(sysdate) from dual;
11、删除一条数据:delete from flashback_table where fid=2;
执行:commit
12、现在的业务是fid=2的数据删除错了,要把它改回来,这时候使用的命令为,这时候就要执行闪回操作。
给出一个错误案例:flashback table flashback_table to scn 8029021
错误原因:
select rowid,fid,fname from flashback_table;
注意:这里的rowid表示的是在硬盘上的位置。错误原因的是Oracle将fid为1和3的数据进行了优化,现在给它的rowid变成连续的了,也就是说在AAASP4AAHAAAAaFAAA和AAASP4AAHAAAAaFAAC之间没有位置了:
默认是不能够移动rowid的,所以出现了上面的错误,所以下面进行配置的修改:开启行移动功能。
语句为:alter table flashback_table enable row movement;
再执行闪回操作:flashback table flashback_table to scn 8029021
select rowid,fid,fname from flashback_table;
这时发现删除的数据再次恢复了。
注意:
1、需要flashback any table的权限
2、开启行移动功能
3、如何获取回退的scn/时间?
4、系统表不能被闪回(管理员的表不能被闪回)
5、数字字典不能被闪回。不能跨越DDL操作。
----------------------------------------------------------------------------------------------------------------------------------
二、闪回删除(drop)
实际上从系统的回收站中的将已删除的对象,回复到删除之前的状态。
系统的回收站只对普通用有用。
---关于Oracle系统回收站。(讲解一个案例)
1、删除一个表
首先查询当前用户下有哪些表
select * from tab;
删除表:
查看系统回收站
show recyclebin;
这时候发现了drop掉的表在recyclebin中发现了。
查看当前是哪个用户:show user;
因为用户MISPS为普通用户所以才有回收站,如果是管理员,就没有回收站:
彻底删除一张表的方式是:drop table T_USER_L purge;purge参数表示彻底删除。
清空回收站的方式:purge recyclebin;
执行闪回删除, flashback table T_USERS_L to before drop;
select * from tab;
发现表恢复了。
方式二:通过回收站中的名字闪回删除。
1、删除表: drop table T_USERS_L;
2、查看回收站的名字:show recyclebin;
通过回收站的名字返回: flashback table "BIN$hIr1xeS0RY2sls0cyMHE3g==$0"
to before drop;
--闪回重名的对象
执行闪回删除,这时候恢复的是最后删除的那个次表
flashback table test to before drop;
如果在此执行闪回表,这时候将出现错误,这时候要对删除的表进行重命名:
查看返回的表:select * from tab;
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
闪回版本查询(侧重点查询)
《未完待续》
闪回的用途与实战