文章目录
1. 闪回查询
闪回查询从9i引入,可按照时间点或scn向前查询,获得修改前的数据;
闪回查询依赖于回滚段中存储的数据前镜像,通过设置 undo_retention 参数设置前镜像的保留时间;

查询的语法:
select ... as of scn | timestamp;
注:
说明:如果想让表中的数据回到操作之前,闪回的数据写入另一个表,然后将现在的表删除,将另一表改名 rename ;
如:
1.1. 闪回时间查询
对emp表进行修改,记录一下操作时间:
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;




查看不同时间点的数据:
select * from emp as of timestamp to_date('2022-04-03 22:51:14','yyyy-mm-dd hh24:mi:ss');

1.2. 闪回scn查询
(1) 获取scn号的方法
select dbms_flashback.get_system_change_number from dual;
或
select current_scn from v$database;

(2) 闪回scn查询命令
命令格式:
select * from emp as of scn 2086698;
2. 闪回版本查询
select ... from ... versions between
select 后面可选择伪列,来获理事务的开始、结束时间、SCN号、ID号等
如:




闪回版本查询:
select versions_starttime ,versions_endtime,versions_xid,versions_operation,EMPNO, ENAME,JOB,MGR,HIREDATE, SAL ,COMM, DEPTNO from emp versions between timestamp minvalue and maxvalue;
versions_xid 表示 事务号
versions_operation 表示 执行的操作类型

select versions_starttime ,versions_endtime,versions_xid,versions_operation,EMPNO, ENAME,JOB,MGR,HIREDATE, SAL ,COMM, DEPTNO from emp versions between scn minvalue and maxvalue;
3. 闪回事务查询
oracle10g开始可以进行基于闪回版本查询的恢复,就是闪回事务查询 ,从 flashback_transaction_query 中查询引起数据变化的事务,和撤销事务的 SQL 语句,就是查询 operation 和 undo_dql 列

select xid,operation,undo_sql from flashback_transaction_query where table_name='EMP' and table_owner='SCOTT' order by start_timestamp desc;
通过执行同一事务下的undo_dql,即可回滚事务;
4. 闪回表
闪回表是把表里的数据回退到以前的某个时刻或者 SCN 上
特点:可以在线操作;自动恢复相关的属性,包括索引、触发器等;
前提:对表启用行迁移
语法:
flashback table <table_name> to timestamp | scn
步骤:
alter table emp enable row movement;
flashback table emp to timestamp to_date('2022-04-03 22:51:14','yyyy-mm-dd hh24:mi:ss');

注意:sys 的表不能闪回
5. 闪回删除
可以恢复一个被 drop 的对象,因为进行 drop 时,Oracle 先把它放到回收站中;
flashback table student to before drop;

5. 1 查看回收站内的信息
select * from user_recyclebin;


select * from "BIN$1Y6FIVerS1eZtaHVmioWRg==$0";

5. 2 彻底删除
drop table <table_name> purge
5. 3 清空回收点
purge recyclebin;

5. 4 通过参数 recyclebin 来启用、禁用回收站
必须使用 ststem 用户:
show parameter recycle;

alter session set recyclebin=off; --表示在当前会话中,不再使用回收站
6. 闪回数据库
如果数据库出现逻辑错误,无法采用闪回表的方式进行恢复,或者数据库的结构发生了改变,可以通过闪回数据库的方式把整个数据库回退到出错前的时间点上。
步骤如下:
6. 1 配置数据库为归档模式
sqlplus /nolog
conn / as sysdba
archive log list; 查询数据库日志模式

shutdown immediate; 关闭数据库

startup mount ;打开到 mount 状态

alter database archivelog; 配置归档;

alter database open; --打开数据库;

6. 2 配置闪回恢复区:
show parameter db_rec; 查询恢复区地址;

show parameter db_flashback_retent; 得到最长的数据库返回时间,一般是 1440 分钟,即可以回到一天前

6. 3 配置闪回保留时间
6. 4 启用数据库闪回,在数据库 mount 状态时执行
alter database flashback on;

在闪回目录下自动创建文件

记录时间,对数据库进行修改,用于测试:


6. 5 进行闪回数据库,必须在 mount 状态下执行
flashback database to timestamp | scn
如:
flashback database to timestamp to_date('2022-04-04 00:03:37','yyyy-mm-dd hh24:mi:ss');

alter database open read only; 打开数据库只读
被删除的表闪回了

startup force 强制启动报错

执行命令,闪回数据库之后必须以 resetlogs(重置日志) 的方式启动
alter database open resetlogs;

2120

被折叠的 条评论
为什么被折叠?



