参考文章:
http://blog.itpub.net/23135684/viewspace-1065601/
务必详细阅读
查看undo相关设置:
show parameter undo
查看undo表空间及其使用情况:
select tablespace_name,
round(sum(decode(status, 'ACTIVE', bytes, 'UNEXPIRED', bytes, 0)) * 100 /
sum(bytes),
2) || '%' "used %"
from DBA_UNDO_EXTENTS
group by tablespace_name
order by 1;
查看undo表空间数据文件位置:
select file_name,tablespace_name from dba_data_files where tablespace_name = 'UNDOTBS1';
查看undo表空间数据文件自动扩展情况:
select FILE_NAME,TABLESPACE_NAME,AUTOEXTENSIBLE,STATUS,MAXBYTES,USER_BYTES
from dba_data_files where tablespace_name like '%UNDO%';
查看回滚段信息:
select rownum,sys.dba_rollback_segs.segment_name Name,v$rollstat.extents Extents,
v$rollstat.rssize Size_in_Bytes,v$rollstat.xacts XActs,
v$rollstat.gets Gets,v$rollstat.waits Waits,v$rollstat.writes Writes,sys.dba_rollback_segs.status status
from v$rollstat,sys.dba_rollback_segs,v$rollname
where v$rollname.name(+) = sys.dba_rollback_segs.segment_name and v$rollstat.usn(+) = v$rollname.usn
order by rownum;
说明:
V$ROLLSTAT
只有在 automatic undo management mode 模式下有效,包含回滚段的一些行为。
V$UNDOSTAT
这个视图只在 automatic undo management mode 模式下才有意义。包含监控和调试 UNDO 表空间的信息,通过这个视图可以估计现有数据库所需的 UNDO 表空间的大小。
将期望的undo保留时间改大:
ALTER SYSTEM SET undo_retention=10800 SCOPE=BOTH;
查看当前闪回是否开启:
select flashback_on from v$database;
设置闪回目录:
alter system set db_recovery_file_dest='/flashback_area' scope=spfile;
设置闪回目录大小:
alter system set db_recovery_file_dest_size=30g scope=spfile;
设置闪回保留时间为7天:
alter system set db_flashback_retention_target=10080 scope=spfile;
重启数据库后检查:
show parameter db_recovery_file_dest;
show parameter db_flashback
检查完成后开启闪回:
alter database flashback on;
开启后检查:
select open_mode,flashback_on from v$database;
检查快闪恢复区的使用情况:
set linesize 200 pagesize 80;
select * from V$FLASH_RECOVERY_AREA_USAGE;
select sum(percent_space_used)*3/100 used from v$flash_recovery_area_usage;
归档日志检查:
select archiver from v$instance;
select name from v$archived_log;
手动切换归档:
alter system switch logfile;
【实验】
直接用t1的数据来创建测试表(表中有3条数据):
create table flashback_table_test as select * from t1;
为flashback_table_test表创建索引:
create index ind_test on flashback_table_test(id);
为flashback_table_test表创建触发器(触发器为null,不做任何操作)
create or replace trigger tr_test
after update on flashback_table_test
for each row
begin
null;
end
tr_test;
/
记录当时的时间点和SCN,试图恢复到该时间点:
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') time, to_char(dbms_flashback.get_system_change_number) scn from dual;
2021-04-23 13:27:34 2125757
或通过如下语句获得SCN:
SELECT current_scn from v$database;
模拟误改flashback_table_test表中数据:
update flashback_table_test set SN='djb' where id =3;
commit;
模拟误删除flashback_table_test表中索引ind_test:
drop index ind_test;
更改tr_test触发器:
create or replace trigger tr_test
after insert on flashback_table_test
for each row
begin
null;
end
tr_test;
/
确保该表中的行迁移(row movement)功能:
默认情况下,oracle数据块中的一行其生命周期内是不会发生移动的,即块的rowid不会发生改变.
但是在某些情景下,如分区表、闪回、收缩空间时,我们希望行的rowid可以发生变化,
这时候我们就需要启动表的row movement特性
启用row movement特性:
alter table flashback_table_test enable row movement;
恢复flashback_table_test表到刚记录的时间点(或scn),由于表中存在触发器,因此使用了关键字enable triggers:
flashback table flashback_table_test to timestamp to_timestamp('2021-04-23 13:27:34', 'yyyy-mm-dd hh24:mi:ss') enable triggers;
再检查数据:
select * from flashback_table_test;
发现数据已经还原:
检查索引:
select index_name from user_indexes where table_name = 'flashback_table_test';
发现索引未还原;
检查触发器:
select text from user_source t where t.name = 'TR_TEST';
发现触发器是修改后的而非之前的;
闪回查询:
select *
from flashback_table_test as of timestamp to_timestamp('2021-04-23 13:27:34', 'yyyy-mm-dd hh24:mi:ss')
where id = '3';
如果不加条件则查询结果为当时的全表数据;
闪回还原误删的行
insert into flashback_table_test
(select *
from flashback_table_test as of timestamp to_timestamp('2021-04-23 13:27:34', 'yyyy-mm-dd hh24:mi:ss')
where id = '3');