rman 粒度最细只到表空间级别,单纯恢复表级别数据可以用闪回技术。
闪回flashback取决于undo retention,undo表空间要置为自动管理。
闪回分为:
flashback database
flashback drop
flashback query
flashback table
Flashback Query和Flashback Table都是利用undo实现回退功能,当需要闪回到过去某一时刻时,先利用Flashback Query查询,确认闪回的SCN或Timestamp,然后再利用Flashback Table真正实现闪回.
1.闪回查询(flashback query)
闪回查询可以通过时间戳timestamp或SCN号来查询前一段时间的数据。
具体用法:
select * from xxx as of timestamp to_timestamp('20170120 090000','yyyymmdd hh24miss');
select * from xxx as of scn xxx;
查看当前SCN号:
select current_scn from v$database;
查看SCN和时间戳的对应关系
select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;
恢复误操作的数据:
insert into xxx select * from xxx as of timestamp to_timestamp('20170120 090000','yyyymmdd hh24miss');
2.闪回表(flashback table)
根据Flashback Query的演变历史,就可以确定需要回退的时间点,然后再利用Flashback table恢复
flashback查询的最早时间点受限于初始化参数undo_retention。
使用flashback table语句可以将表恢复到先前时间点
通过使用该特征,可以避免执行基于时间点的不完全恢复,注意如果要在某个表上使用flashback table特征,则要求必须具有以下条件:
a.用户必须具有flashback any table系统权限或flashback对象权限
b.用户必修在表上具有select insert delete和alter权限
c.必须合理设置初始化参数undo_retention,以确保UNDO信息保留足够时间
d.必须激活行移动特征:alter table table_name enable row movement;
使用flashback table恢复表数据到先前时间点
flashback table xxx to timestamp to_timestamp('2017-01-20 09:00:00','YYYY-MM-DD HH24:MI:SS');
3.闪回删除(flashback drop)
回收数据库表,用于表误drop后恢复。类似Windows的回收站。
数据库回收站是oracle10g新引入的概念,当执行drop table删除表时,数据库不会立即释放与表相关的空间,该表实际被改名,并且与其相关的对象存放在数据库回收站里,因此使用flashback table可以恢复回收站的对象,注意,数据库回收站具有以下限制:
(1)回收站只适用于非system的局部管理表空间
(2)oracle没有为回收站分配固定的预留空间,因此不能保证数据库对象在回收站中的保留时间,当被删除对象所在表空间没有足够空间时,oracle会使用FIFO(先进先出)机制清除回收站的相应对象
(3)使用select语句可以查询回收站对象的数据,但不能再回收站对象上执行DML和DDL操作
(4)使用drop table xxx purge 不会放入回收站
查看回收站中被删除的表:
Show recyclebin;
恢复被删除表:
flashback table "xxx" to before drop;
4.闪回数据库(flashback database)
闪回数据库和RMAN类似,都是将数据库进行不完全恢复。闪回数据库通过flashback log来恢复,更加高效。
区别是闪回数据库不能解决介质损坏。如删除了物理文件或者通过shrink技术对数据文件进行压缩,则不能用闪回数据库进行恢复。
需要先通过rman,将删除或者压缩后的物理文件restore后再通过闪回恢复。
需要先了解:
--
闪回恢复区(Flashback Recovery Area)
在oracle 9i中引入flashback查询,
以便能在需要的时候查到过去某个时刻的一致性数据,依赖于undo表空间存储的信息来闪回查询以前的版本,当然这个受限于undo表空间的大小,以及保留策略。如果undo 被覆盖了就不能进行查询。
oracle10g中增强了闪回查询的功能,并且提供了将整个数据库回退到过去某个时刻的能力,这是通过引入一种新的flashback log实现的。flashback log有点类似redo log,只不过redo log将数据库往前滚,flashback log则将数据库往后滚。为了保存管理和备份恢复相关的文件,oracle10g提供了一个叫做闪回恢复区(Flashback recovery area),这个区域默认创建在oracle_base目录下。 可以将所有恢复相关的文件,比如flashback log,archive log,backup set等,放到这个区域集中管理。
--
闪回恢复区主要通过3个初始化参数来设置和管理:
db_recovery_file_dest:指定闪回恢复区的位置
db_recovery_file_dest_size:指定闪回恢复区的可用空间大小 db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟,也就是一天。当然,实际上可回退的时间还决定于闪回恢复区的大小,因为里面保存了回退所需要的flash log。所以这个参数要和db_recovery_file_dest_size配合修改。
--
开启闪回数据库需要配置如下参数:
SQL> alter system set db_recovery_file_dest_size=2G scope=both;
SQL> alter system set db_recovery_file_dest='/oradatab/flashback' scope=both;
flash recovery area 的大小就至少是数据库所占容量的20%。
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> alter database flashback on;
SQL> select name,flashback_on from v$database;
NAME FLASHBACK_ON
--------- ------------------
O01DMS0 YES
4)设置db_flashback_retention_target:
SQL> alter system set db_flashback_retention_target=1440 scope=both;
db_flashback_retention_target参数为闪回恢复区保存时间,上面保存为1440分钟,也就是1天。
SQL> alter database open;
--
Flashback Database 操作示例
1)模拟数据丢失:
SQL> create table test as select * from dba_objects;
Table created.
SQL> select count(*) from test;
COUNT(*)
----------
10318
SQL> truncate table test;
Table truncated.
SQL> select count(*) from test;
COUNT(*)
----------
0
2)确认能恢复的时间点
能回退的最早时间,取决于保留的Flashback database log的多少,可以从v$flashback_database_log查看:
SQL> select to_char(OLDEST_FLASHBACK_TIME,'yyyy-mm-dd hh24:mi:ss') from v$flashback_database_log;
TO_CHAR(OLDEST_FLAS
-------------------
2011-12-15 02:41:48
3)恢复数据到指定时间点
SQL> shutdown immediate;
SQL> startup mount;
SQL> flashback database to timestamp to_timestamp('2011-12-15 02:43:00','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
4)打开数据库
恢复成功后,以resetlog方式打开数据库并检查数据是否已经恢复:
SQL> alter database open read only;
Database altered.
SQL> select count(*) from test;
COUNT(*)
----------
10318
5)确认恢复后,关闭数据库,并以resetlog方式打开数据库
SQL> shutdown immediate;
SQL> startup mount
SQL> alter database open resetlogs;
用resetlog方式打开数据库后,闪回时间点后的所有数据将会丢失。
如果要保证损失降到最低,可以先用read-only模式打开数据库,将误操作的表通过数据泵导出,
然后执行recover database,通过redo重新生成丢失的数据。再将误操作的数据导入即可。
--关于闪回日志过大的清除问题
开启闪回数据库后,将由rvwr进程取用undo表空间中的before image,写入flashback log中。
闪回恢复区能存放的闪回日志大小由db_recovery_file_dest_size参数控制,闪回日志的保留时间由
db_flashback_retention_target参数控制,该参数和undo_retention类似,并不是一个精确的保留时间,
往往和库繁忙程度有关。若闪回恢复区闪回日志占用空间过大,可能导致归档日志,RMAN备份无法写入。
清除闪回日志目前没有便捷的方法,一般采用重启数据库,关闭闪回数据库,再重新开启。这样闪回日志将会被清理。
手动删除闪回恢复目录下的闪回日志是无效的,库中依然会显示空间被占用。




