目录
一、9i中的闪回查询方法
二、10g的闪回版本查询方法
三、10g闪回事物查询方法和恢复数据
四、10g闪回表
五、10g闪回删除
六、10g闪回数据库
可以按照时间点或者SCN(System Change Number)向前查询,获取修改前的数据。闪回查询依赖于回滚段中存储的数据前镜像,通过设置undo_retention参数前镜像保留的时间。
select ... as of scn |timestamp
例如现有表中有8行数据:
在回滚段保留时间还生效的情况下,知道想要恢复到的确切时间可以
delete salary_tbl where employer_nm like '雇佣者导入1';
commit ;
select * from salary_tbl as of timestamp to_date('20200723 22:45:30','yyyymmdd hh24:mi:ss');
检查点查询:需要去估计检查点的值
select current_scn from v$database; --查询当前检查点
delete salary_tbl where employer_nm like '雇佣者导入1';
commit ;
select * from salary_tbl as of scn 8681060;
利用闪回查询恢复数据
create table salary_tbl_bak as select * from salary_tbl as of timestamp to_date('20200723 22:45:30','yyyymmdd hh24:mi:ss');
truncate table salary_tbl;
insert into salary_tbl select * from salary_tbl_bak;
drop table salary_tbl_bak;
10g 提供了闪回版本可以在时间段内不同版本进行查询。
select ... from ... versions between
其中select 可以选择伪劣,查询ID,SCN号等
select versions_startTime,versions_endtime,versions_xid,versions_operation,
salary_tbl.employer_nm,
salary_tbl.department,
salary_tbl.salary,
salary_tbl.leader_nm from salary_tbl versions between timestamp minvalue and maxvalue
其中 version_xid代表事物Id ,version_operation 可以看见操作类型
alter database add supplemental log data; ----启用最小附加日志
select * from flashback_transaction_query where TABLE_NAME='SALARY_TBL' order by start_timestamp desc;
这张视图的作用如下
comment on table SYS.FLASHBACK_TRANSACTION_QUERY is 'Description of the flashback transaction query view';
comment on column SYS.FLASHBACK_TRANSACTION_QUERY.XID is 'Transaction identifier';
comment on column SYS.FLASHBACK_TRANSACTION_QUERY.START_SCN is 'Transaction start SCN';
comment on column SYS.FLASHBACK_TRANSACTION_QUERY.START_TIMESTAMP is 'Transaction start timestamp';
comment on column SYS.FLASHBACK_TRANSACTION_QUERY.COMMIT_SCN is 'Transaction commit SCN';
comment on column SYS.FLASHBACK_TRANSACTION_QUERY.COMMIT_TIMESTAMP is 'Transaction commit timestamp';
comment on column SYS.FLASHBACK_TRANSACTION_QUERY.LOGON_USER is 'Logon user for transaction';
comment on column SYS.FLASHBACK_TRANSACTION_QUERY.UNDO_CHANGE# is '1-based undo change number';
comment on column SYS.FLASHBACK_TRANSACTION_QUERY.OPERATION is 'forward operation for this undo';
comment on column SYS.FLASHBACK_TRANSACTION_QUERY.TABLE_NAME is 'table name to which this undo applies';
comment on column SYS.FLASHBACK_TRANSACTION_QUERY.TABLE_OWNER is 'owner of table to which this undo applies';
comment on column SYS.FLASHBACK_TRANSACTION_QUERY.ROW_ID is 'rowid to which this undo applies';
comment on column SYS.FLASHBACK_TRANSACTION_QUERY.UNDO_SQL is 'SQL corresponding to this undo';
特别注意:UNDO_SQL是事物回滚的SQL;只要按照COMMIT_TIMESTAMP 排一个序就能够知道提交事物的历史情况。
想要恢复否个表的数据:首先通过 TABLE_NAME 进行筛选,COMMIT_TIMESTAMP排个序,想要恢复到什么位置上一个个执行UNDO_SQL 就可以
10g可以把表里的数据回退到某个时刻,或者SCN。前提是必须启用行迁移
alter table salary_tbl enable row movement;
然后可以进行表闪回。
flashback table table_name to timestamp|SCN
flashback table salary_tbl to timestamp timestamp'2020-7-23 22:00:00'
oracle 也有像回收站这样的东西,用来装已经被删除的数据。 启用回收站,回收站只放普通用户的删除表,所以SYS用户,SYSTEM表空间是不会放在这里的;
alter session set recylcebin=on
>>show recyclebin
flashback table
drop table
purge recyclebin ;---------清空回收站
-----查询原来的表名和回收站情况
select * from tab where TABTYPE='TABLE';
select * from recyclebin;
--------删除一张表------------
create table salary_tbl_bak as select * from salary_tbl;
drop table salary_tbl_bak;
------闪回----------
flashback table salary_tbl_bak to before drop;
在Oracle 中如果重复删除相同的表,那么闪回的表就是最近删除的表 或者可以直接select <"在recyclebin中的表名"> 双引号
如果数据库出现物理错误,如硬盘损坏,那么闪回数据库在此处不适用。如果数据库出现逻辑错误,那么可以通过闪回数据库进行恢复回退。之前的闪回都是利用回滚段闪回,而闪回数据库是利用日志进行返回。
1.数据库需为归档模式
>>shutdown immediate;
>>startup mount
>>alter database archivelog
>> alter database open
2.配置闪回恢复区
show parameter DB_RECOVE
3.配置闪回保留时间(单位:分钟)
show parameter db_flashback_reten
4.在mount状态,启用数据库闪回 alter database flashback on ;
此时你可以在db_recovery_file_dest参数值下的目录中看见闪回需要用到的文件;
5.在mount状态下闪回数据库
flashback database to timestamp | scn
现有一张表,此时的时间是 select systimestamp from dual; ---- 26-7月 -20 03.14.24.153000 下午 +08:00
执行drop table salary_tbl;