tspitr恢复restore recovery啥的很费时间,依赖archivelog和redo,flashbacckup功能则基本靠undo,只要在undo里面,不用restore和recovery就可以恢复数据。
flashback的功能分类
a。flashback drop不依赖undo。
b。flashback database不依赖undo,依赖flashback log。
c。flash query(包括flashback query, flashback version query, flashback transaction query)依赖undo
d。flashback table依赖undo
e。flashback data archive不依赖undo。11g新增的。
1.flashback drop。
flashbackup drop不依赖undo,因为drop语句不是dml,不进undo。oracle搞了一个回收站recyclebin,drop后进这里。回收站的东西的删除是自动的,当表空间不够时,会自动被删,这里的表空间不够是说在【表自动扩张前】的不够,也就是表空间不够时,会先去删recylebin,不够的话再去扩张。回收站以schema单位存在,所以普通用户也是可以查看恢复自己的表。
打开recycylebin,看recyclebin paramer,为on表示已经启动了。默认就是on。这个参数是可以session级别修改的 alter session set recyclebin = off。
普通用户select * from user_recyclebin或者recyclebin可以看自己的,dba用dba_recyclebin看全部。回收站里的只能看,不能再ddl或者dml了。要恢复时,用
flashback table 原来表名 to before drop。恢复时根据【后进先出】规则,比如一个表建了删删了再建再删,反复drop了n次,那么,flashback table时先恢复最后删的。
当然,也可以直接fashback table 垃圾相里的名字 to before drop,这样就可以直接恢复指定时间的表了。
恢复是,可以重命名表名
flashback table zyz to before drop rename to zyz_flashback。
drop 表的时候,和表相关的比如索引约束triger啥的,会一起进recyclebin,但是flashback时,也会restore回来,但是名字不会变,这个得自己去重命名alter index bin$xxx rename to xxx这样。当然,重建也是可以的。
可以用
purge table tablename
purge index indexname
purge tablespace tablespacename
purge user_recyclebin
purge dba_recyclebin
来清空垃圾或者垃圾的object。
flashback drop不支持存储过程或者函数,如果不小心删掉了,得用flashback query(从dba_source或者all_source里面往回找)
flashback drop不支持system表空间里的对象,删掉了就没了。
2。flashback query
可以查会以前的数据内容,只要还在undo里。
用时间转换
select * from tbl_test1
as of timestamp to_timestamp('2015-04-19 20:00:00', 'YYYY-MM-DD HH24:MI:SS');
时间查
select * from tbl_test1
as of timestamp (systimestamp - interval '60' minute);
先找scn再query
select timestamp_to_scn(systimestamp - interval '60' minute) as scn from dual;
select * from tbl_test1
as of scn 8734545
3.flashback version query
可以查询一段时间或者scn内的数据演变,只要这些数据还在undo里面
根据scn
select versions_starttime, versions_endtime, versions_operation col1 from tbl_test1
versions between scn minvalue and maxvalue
根据实际
select versions_starttime, versions_endtime, col1 from tbl_test1
versions between timestamp to_timestamp('2015-04-19 20:00:00', 'YYYY-MM-DD HH24:MI:SS') and to_timestamp('2015-04-19 21:00:00', 'YYYY-MM-DD HH24:MI:SS');
这里可以有几个伪列
versions_starttime
versions_endtime
versions_startscn
versions_endscn
versions_operation
versions_xid 当时的transaction id
version query对外部表(外部表只能select,不能dml),临时表(临时表,虽然有undo,但是comit后或者session完了后就没了),固定表(X$打头的表,oracle内部使用),view都没有效果。
4.flashback transaction query
前面的flashback version只能一个表一个表的看,如果一个事物里面更新了多个表,就回退需要用到flashback transaction了。
flashback transaction (query)需要archivemode才可以。
使用条件,使用flashback transaction的话11g需要开启附加log(supplemental logging)功能,这个功能默认情况下是关闭的。这个功能更分几个级别。附加log会影响redo的产生。
alter database add supplemental log data; 打开是最小功能min。
alter database add supplemental log data(all) columns;
alter database add supplemental log data(primary key) columns;
alter database add supplemental log data(unique) columns;
alter database add supplemental log data(foreign key) columns;
调整了这些参数后,虽然会立刻反应进v$database,但需要重新启动instance才干活。
查看打开的级别
select supplemental_log_data_min, 这个最小构成
supplemental_log_data_pk, 是否打开了主键的附加log
supplemental_log_data_ui, unique key的log
supplemental_log_data_fk, 外键的log
supplemental_log_data_all,是否支持所有类型,比如LONG,LOB等集合
from v$database;
另外,用户也需要权限select any transaction的权限
grant select any transaction to zyz;
满足这个最小mini条件后,再谈flashback transaction的功能。
另外,flash drop或者flash query是不需要 supplemental logging开启的。
先用flashback version找到versions_xid,然后再根据xid查找事物。这个是在flashback_transaction_query里面表里有字段
xid
table_name
start_scn
logon_user
operation
undo_sql 可以执行这个sql,进行将数据还原
select * from flashback_transaction_query
where xid = '01001700A7160000'
5.flashback transaction
flashback transaction 除了flashback transaction query的前提条件外,还需要 dbms_flashback.transaction_backout的执行权限。
使用dbms_flashback.transaction_backout来取消transaction
有三个参数,一个numtxns表示后面xids有多个item,一个xids是一个数组,数组元素是transaction的xid。
decalre
trans_arr sys.xid_array
begin
trans_arr := sys.xid_array('01001700A7160000 ');
dbms_flashback.transaction_backout(numtxns => 1, xids => trans_arr);
end
这个我没执行成功,报错
ORA-55507:Encountered mining error during Flashback Transaction Backout. function:krvxglsr ORA-01291: missing logfile
查询了一些资料,开去了附加log的pk和fk,仍然不成功。
这个func还有第三个参数
分别是
NOCASCADE,事务不被依赖,自己做自己的取消,有依赖时就失败。
CASCADE,将依赖事务也给取消
NOCASCADE_FORCE,不考虑其他依赖事务,先自己取消。其他依赖事物照样执行。
NONCONFILICT_ONLY,只取消和其他事务没冲突的。
例子
比如有数据3行,分别值1,2,3。
tx1修改后变成值为11,22,33。tx2修改后变成11,222,333。现在打算backout tx1。
NOCASCADE,报错,因为tx2依赖tx1。
CASCADE,均回退,数据变成1,2,3。
NOCASCADE_FORCE,tx1取消(取消了t1更新的3行),tx2照样执行,结果变成1,222,333
NONCONFILICT_ONLY,tx1取消(取消了t1更新的第一行,因为2,3行在tx2里),tx2照样执行,结果变成,1,222,333
用dbms_flashback.transaction_backout恢复后,还需要手动commit或者rollback的。
最后,这个dbms_flashback已经不光只用到了undo,它其实后面用了logminer去找redo和archivelog了。
可以通过
dba_flashback_txn_state 查看已经取消了的transaction的依存关系
dba_flashback_txn_report 查看依存transaction的具体信息
没有评论:
发表评论