欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ORACLE闪回机制分析与研究应用

程序员文章站 2022-03-13 19:20:59
1.查看数据库归档和闪回状态,及环境准备SQL> archive log list;SQL> select flashback_on from v$database;关闭数据库,启动归档和闪回SQL> shutdown immediate;启动到mount模式SQL> startup mount;开 ......

1.查看数据库归档和闪回状态,及环境准备
sql> archive log list;
sql> select flashback_on from v$database;
关闭数据库,启动归档和闪回
sql> shutdown immediate;
启动到mount模式
sql> startup mount;
开启归档
sql> alter database archivelog;
如果归档没有打开,打开归档[因为flashback依赖media recovery,所以在打开flashback之前必须先启用归档]
sql> alter database flashback on;
sql> alter database open;
sql> archive log start;
sql> archive log list;
启用闪回数据库
要想使用flashback database, 必须使用flash recovery area。 要配置的2个参数如下,一个是大小,一个是位置。如果数据库是rac,flash recovery area 必须位于共享存储中。数据库必须处于archivelog 模式.参数db_flashback_retention_target控制闪回日志的保留时间,默认是1440,即24小时。

sql>alter system set db_flashback_retention_target=2880;设置归档时间:(默认的是一天1440分钟)
sql> show parameter db_flashback_retention_target;(查询归档时间)
设置撤销表信息:
alter system set undo_managerment=auto;设置为auto才可以使用闪回查询
alter system set undo_retention=900 scope=both;最长保留时间(单位秒)
alter system set undo_tablespace=undotbs1;

sql> show parameter undo;(查询undo撤销时间)

关于oracle闪回的打开和关闭,主要就是需要注意以下几点:
1、闪回打开的前提是数据库归档必须打开
2、闪回打开/关闭和归档打开/关闭一样,都是在mount模式下
3、如果要在打开闪回的数据库上关闭归档则必须先关闭依赖于归档的闪回功能

关于v$flashback_database_log
flashback database 所能回退到的最早时间,取决与保留的flashback database log 的多少, 该视图就可以查看许多有用的信息。
oldest_flashback_scn / oldest_flashback_time : 这两列用来记录可以恢复到最早的时点
flashback_size: 记录了当前使用的flash recovery area 空间的大小
retention_target: 可以恢复的时间长度
estimated_flashback_size: 根据恢复时间长度对需要的空间大小的估计值

sql> select oldest_flashback_time,oldest_flashback_scn,flashback_size,retention_target,estimated_flashback_size from v$flashback_database_log;

 

关于v$flashback_database_stat 
这个视图用来对flashback log  空间情况进行更细粒度的记录和估计。 这个视图以小时为单位记录单位时间内数据库的活动量, flashback_data  代表 flashback log 产生数量, db_date  代表数据改变数量, redo_date 代表日志数量,通过这3 个数量可以反映出数据的活动特点,更准确的预计 flash recovery area 的空间需求
sql> select begin_time bt,end_time et,flashback_data fd,db_data dd,redo_data rd,estimated_flashback_size efs from v$flashback_database_stat;


v$flashback_database_logfile
该视图主要记录闪回日志的详细信息,name闪回日志的位置,first_change#闪回日志中记录的最早的scn,first_time闪回日志中记录的最早时间
sql> select * from v$flashback_database_logfile;


2.flashback query闪回时间点查询
闪回时间点查询的另一种方法是首先用pl/sql包dbms_flashback的enable_at_time或enable_at_scn存储过程锁定一个会话级别的闪回时间目标,即进入闪回模式,随后的查询命令就可以省略“as of”,但也能达到使用“as of”的闪回效果,直到调用dbms_flashback. disable存储过程关闭闪回模式为止。
比如,将闪回模式会话定格在15分钟前:
sql> exec dbms_flashback.enable_at_time(systimestamp - interval '15' minute);

现在,虽然没有“as of”子句,以下查询命令的含义就是查看15分钟前的hr.employees表:
需要注意此时若访问sysdate、systimestamp等日期函数,它们的返回值还是正常的当前的值,而不是静止在15分钟以前。另外,处于闪回会话模式时,执行dml和ddl将报错:
还有,sys用户不能调用enable_at_time和enable_at_scn


在回到过去对所有感兴趣的表查询一番后,再调用disable存储过程关闭闪回会话模式回到正常状态:
sql> exec dbms_flashback.disable

flashback version query(闪回版本查询)
闪回版本查询可以贯穿一定长度的时间窗口,通过只使用一条查寻命令就能返回该时间窗口内的不同时间点上的数据,其语法是在表名之后加“versions between”子句。


4.闪回数据归档(flashback data archive)
闪回查询对撤销数据及参数undo_retention的依赖注定了它们在大事务量的情况下闪回时间窗口将会很小,想要查询数月之前的“旧”数据绝对不可能,但在闪回数据归档面前这并不是不可能的。
闪回数据归档的工作原理
将原本只能保存在undo表空间的撤销数据额外的以一种历史表的形式保存在指定的普通表空间(permanent类型的表空间)中。并且不像undo_retention参数那样是个影响整个数据库的设置,闪回数据归档可以只为特定的表服务,这样就可以长时间地保存感兴趣的“旧”数据了。
闪回数据归档区
闪回数据归档区是闪回数据归档的历史数据存储区域,在一个系统中,可以有一个默认的闪回数据归档区,也可以创建其他许多的闪回数据归档区域。每一个闪回数据归档区都可以有一个唯一的名称。同时,每一个闪回数据归档区都对应了一定的数据保留策略。例如可以配置归档区flashback_data_archive_1中的数据保留期为1年,而归档区flashback_data_archive_2的数据保留期为2天或者更短。  以后如果将表放到对应的闪回数据归档区,则就按照该归档区的保留策略来保存历史数据。闪回数据归档区是一个逻辑概念,是从一个或者多个表空间中拿出一定的空间,来保存表的修改历史,这样就摆脱了对undo撤销数据的依赖,不利用undo就可以闪回到归档策略内的任何一个时间点上。
flashback archive相关数据字典

* 代表dba 或者user。

比如,在users表空间中创建一个能够将“旧”数据保存1年的数据归档,取名为“fda1”,操作者必须拥有“flashback archive administer”系统权限:
sql> create flashback archive fda1 tablespace users retention 1 year;
有了归档,就可以使用“flashback archive”子句在特定的表上启用闪回数据归档功能了。比如,让hr.employees使用fda1,从此该表的修改历史将保留1年:
sql> alter table t_dealer flashback archive fda1;

或新建一个归档闪回区给一个表空间或指定一个表空间
sql>create flashback archive default fbar_1 tablespace "users" quota 100m
sql>create flashback archive fbar_1 tablespace "tbs_data1"
一个归档区可以不仅仅对应一个表空间,可以采用如下的命令增加或者删除该归档区的表空间的个数,这样也达到了增加或者减少该归档区空间的目的。
sql>alter flashback archive fbar_1 add tablespace "tbs_data2" quota 20m;

也可以从归档区中删除表空间。注意:这个删除仅仅是表示从数据归档区删除,并不是删除该表空间。
4.删除数据归档区fbar_2的表空间tbs_data2
sys>alter flashback archive fbar_2 remove tablespace "tbs_data2";

若执行以上命令的是个普通账号,比如hr用户,那么其在执行命令前必须被授予“flashback archive”对象权限,比如:
sql> grant flashback archive on fda1 to hr;

使用“no flashback archive”子句可以关闭特定表上的闪回数据归档功能。执行该命令需要“flashback archive administer”系统权限:
sql> alter table t_dealer no flashback archive;
删除整个数据归档区
sql> drop flashback archive fla2;

flashback table
当一张表被修改后(非删除)需要恢复指定表,需在修改表是记录时间戳以便恢复。
sql> select sysdate,timestamp_to_scn(sysdate) from dual; (修改数据时要记录时间戳)
sysdate timestamp_to_scn(sysdate)

2017-08-16-16:17:52 196349262

使用数据归档前需要开启表上的行迁移:
sql> alter table t_dealer enable row movement;
sql> flashback table t_dealer to scn 196349262;
sql> alter table t_dealer disable row movement;(完成归档后关闭表上的行迁移)

若没有记录时间戳,这可以查询指定时间内数据量来判断数据是佛完整,来恢复数据。
sql> select count(*) from t_t_thirdpay_order_h as of timestamp to_timestamp('20170816 18:00:00','yyyy-mm-dd hh24:mi:ss');

count(*)
325
使用数据归档前需要开启表上的行迁移:
sql> alter table t_dealer enable row movement; 
开始闪回
sql> flashback table t_t_thirdpay_order_h to timestamp to_timestamp('2011-5-9 13:00:00','yyyy-mm-dd hh24:mi:ss');
sql> alter table t_dealer disable row movement;(完成归档后关闭表上的行迁移)

flashback data
若没有记录时间戳,则可恢复整个数据库
sql> select to_char(oldest_flashback_time,'yyyy-mm-dd hh24:mi:ss') from v$flashback_database_log;
*to_char(oldest_flas
2017-08-16 11:23:46*
这个日期为能回退的最早时间,取决于保留的flashback database log的多少
恢复数据到指定时间点
sql> shutdown immediate;
sql> startup mount;
sql> flashback database to timestamp to_timestamp('2017-08-16 16:00:46','yyyy-mm-dd hh24:mi:ss');
恢复成功后,最好先以readonly的方式打开数据库,以确认恢复达到预期,如果没有达到预期,还可以再进行恢复
sql> alter database open read only;
检查恢复完成后打开数据库
恢复成功后,以resetlog方式打开数据库:
sql> shutdown immediate;
sql> startup mount
sql> alter database open resetlogs;


查哪些表已经启用了闪回数据归档
sql>select * from dba_flashback_archive_tables;
查数据库中所有的闪回数据归档
sql>select flashback_archive_name,retention_in_days from dba_flashback_archive;
查有关闪回数据归档所使用的表空间的信息
sql>select flashback_archive_name,tablespace_name,quota_in_mb from dba_flashback_archive_ts;
删除闪回归档数据
sql>drop flashback archive flash1;

flashback drop
flashback drop是从oracle 10g开始才有的功能,原理是每个表空间都会有严格回收站的逻辑区域,当drop时,被删除的表及其关联对象不会被物理删除,只是转移到回收站中,给用户提供一个恢复的可能。


注意事项
对system表空间无效, 只能用于非系统表空间和本地管理的表空间
数据库的版本不能低于10g,否则很多命令无法使用
对象的参考约束不会被恢复,指向该对象的外键约束需要重建。
对象能否恢复成功,取决与对象空间是否被覆盖重用。
当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recycle bin,因此当你执行flashback table to before drop 时,也不能恢复依赖其的物化视图,需要dba 手工介入重新创建。
对于recycle bin中的对象,只支持查询.
删除几张表,然后指定表恢复


oracle11g则为flashback家族又带来一个新的成员:flashback data archive。

初看起来,flashback data archive和flashback query没有太大的不同,都是通过as of能够查询之前的数据,但是他们的实现机制是不一样的。flashback query是通过直接从undo中读取信息来构造旧数据,这样就有一个限制,就是undo中的信息不能被覆盖。而undo段是循环使用的,只要事务提交,之前的undo信息就可能被覆盖,虽然可以通过undo_retention等参数来延长undo的存活期,但这个参数会影响所有的事务,设置过大,可能导致undo tablespace快速膨胀。
falshback data archive特性则通过将变化数据另外存储到创建的flashback archive中,以和undo区别开来,这样就可以通过为flashback archive单独设置存活策略,使得可以闪回到指定时间之前的旧数据而不影响undo策略。并且可以根据需要指定哪些数据库对象需要保存历史变化数据,而不是将数据库中所有对象的变化数据都保存下来,这样可以极大的减少空间需求。