2015年4月21日星期二

flashback2

1。flashback database。
可以将数据库整个回到指定的时间或者scn。
flashback database不依赖undo log,而是flash log来实现的,flashback log是相对于redo log,redo log往前滚,flashback log则是往后滚。要想使用flashback database功能,首先得打开这个功能,这个功能默认是关闭的。
select flashback_on from v$database;看是否开区
alter database flashback on;开区flashback database功能。
另外,flashback log放在回闪区
db_recovery_file_dest位置
db_recovery_file_dest_size大小
db_flashback_retention_target可以回退的时间,单位分钟,默认1440,1天。
由于其他很多东西也在这个回闪区,所以要留意空间的大小。
select * from v$recovery_file_dest;看用量
select * from v$flash_recovery_area_usage;看各类用量
启动了flashback database功能后,会多一个进程Recover Writer(RVWR),它负责写flashback log。

flashback database时的步骤
1。进mount
2。flashback database to timestamp to_timestamp('2015-04-21 18:12:05','yyyy-mm-dd hh24:mi:ss');
flashback database to scn xxx;
3。alter database open resetlogs;
要想知道可以flashback log可以回到何时
select * from v$flashback_database_log;
这个view里有可以回到的最早时间和最早scn。
select * from v$flashback_database_stat这个view里有以小时为单位的统计,统计数据库的数据的变量量。可以用来估算回闪区容量。flashback_data 代表flashback log产生数量,db_date 代表数据改变数量,redo_date代表日志数量。


2。flashback table
将某个表回到指定的时间或者scn。
flashback table依赖undo,要回,首先的让表是行移动模式。
alter table zyz.tbl_test1 enable row movement;
--alter table zyz.tbl_test1 disable row movement;
--select current_scn from v$database; 要权限
select timestamp_to_scn(systimestamp) from dual;
flashback table tbl_test1 to scn 8994000;
flashback table tbl_test1 to timestamp to_timestamp('2015-04-21 18:43:47','yyyy-mm-dd hh24:mi:ss');
flashback table直接运行,也不用进mount,误操作时挺方便。

flashback table的限制是表的结构不能变,也不能是被truncate后的表,另外flashback table也会触发trigger,但是执行时会自动disable trigger,要想trigger有效,需要在语句后面增加enable triggers。

3。flashback data archive
有时,对于某个表,比起undo的flash query version,希望更长期的保留它的变更情况;比起普通的archive,又不希望是database级别的修改备份策略。flashback data archive就是不依赖undo,并且可以以[表]为单位来设置的。后台对应的进程是Flashback Data Archiver Process (FDBA)
 select name,description from v$bgprocess where name='FBDA';它负责将表的数据变化写入data archive区。
步骤如下。
第一步:创建fda的表空间,和普通一样。当然,也可以直接在已经存在的表空间创建fda区。
create tablespace fda1 datafile '/ORADATA/app/oradata/orcl11g/fda01_01.dbf' size 100m;
create tablespace fda2 datafile '/ORADATA/app/oradata/orcl11g/fda02_01.dbf' size 100m;
第二步:在表空间上创建 flashback data archive区。这里需要记得,其实fda区是一个逻辑概念,也即是一个fda区,是可以跨多个表空间的。对于每个表空间,可以指定各自的配额。另外,创建时可以指定是否是默认fda区,以及保留时间。
create flashback archive default fda1 tablespace fda01 quota 30m retention 1 year;
alter flashback archive fda1 add tablespace fda02 quota 40m;
这里先在fda01上创建了fda区fda1,配合30m,保留1年;然后再将fda02表空间的40m配额加到了fda1上。如果不指定配额,就是无限。
可以创建多个fda区,但是默认的只能有一个。每个fda区有自己的保留时间。
第三步:有了fda区,就可以将某个表的加进fda区,那么这个表的所有变化,就自动记录下来了。但是在这之前,有两个权限的说明一下。
FLASHBACK ARCHIVE ADMINISTER,这个是管理系统所有fda区的,有这个权限,才可以看到sys.dba_flashback_archive表。有这个权限才可以将指定的表,放进fda区。
grant flashback archive administer to fda_admin
要执行闪回,还需要FLASHBACK ANY TABLE 权限,以及DBMS_FLASHBACK的EXECUTE权限。
grant flashback any table to zyz;
grant execute on dbms_flashback to zyz;
有了 FLASHBACK ARCHIVE ADMINISTER,就可以在创建表的时候,直接
create table tbl_test2 (col varchar2(32)) flashback archive;
create table tbl_test3 (col varchar2(32)) flashback archive fda1;
或者对已经存在的表执行
alter table zyz.tbl_test1 flashback archive
alter table zyz.tbl_test1 flashback archive fda1;
alter table zyz.tbl_test1 no flashback archive;
这里,还没提供直接切换fda区,必须先取消掉已经配额的fda区,再换到别的区
alter table zyz.tbl_test1 no flashback archive;
alter table zyz.tbl_test1 flashback archive fda2;
前面当然也说到,fda实际是一个逻辑概念(虚的),所以用户还得有fda背后的表空间的访问权限和配额才可以。
第四步:配置好了,现在可以执行回返了。
所谓回返,其实还是query,和flashback query或者flash version query一样,只不过支持的时间或者scn长了很多。
select versions_starttime, versions_endtime, versions_operation, col1 from tbl_test1
versions between timestamp to_timestamp('2015-04-21 10:00','yyyy-mm-dd hh24:mi') and maxvalue;
select * from tbl_test1 as of timestamp (systimestamp - interval '60'minute);

对于fda的admin,有不少他需要做的事情。
select * from  dba_flashback_archive_ts查看有哪些fda区
select * from  dba_flashback_archive;查看哪些表放进了哪个fda区
select * from dba_flashback_archive_tables;查看fda区里的内容
alter flashback archive fda2 modify tablespace fda01 quota 50m;修改配额
alter flashback archive fda1 modify retention 1 day;
alter flashback archive fda1 remove tablespace fda02;去掉表空间
drop flashback archive fda1;删除fda区
 select current_scn from v$database;
alter flashback archive fda1 purge before scn 3232323; 清空scn以前的数据
alter flashback archive fda1 purge before timestamp (systimestamp - interval '1' day);
 alter flashback archive fda1 purge all;


fda的限制,不像flash query,flash version query,fda在truncate表,增删列,rename表,dropb表后仍然有效,因为它就是一个记录的log,不像ddl会清空undo数据。

没有评论:

发表评论