oracle-闪回技术1

时间:2022-03-31 20:43:35

 

http://blog.csdn.net/lqx0405/article/details/44776737

 Oracle Study案例之--基于表空间的时间点恢复(TSPITR)

 

DBPITR 数据库时间点恢复

TSPITR 表空间时间点恢复

 

########################################

闪回技术涉及的初始化参数与数据字典

undo_management string  AUTO     
undo_retention  integer 900      
undo_tablespace string  UNDOTBS1
db_flashback_retention_target integer 1440

select * from v$restore_point;

########################################

闪回数据库使用闪回日志执行闪回。闪回删除使用回收站。其他所有功能都使用undo数据。

闪回数据库

闪回丢弃表

闪回表

闪回查询

闪回版本查询

闪回事务查询

oracle-闪回技术1

 

oracle-闪回技术1

 

flashback database

闪回还原点分两种,一种是Normal Restore Points(正常还原点),另一种是Guaranteed Restore Points(担保还原点)
正常还原点和担保还原点的信息都是保存在控制文件,区别在于正常还原点的信息如果不手动删除控制文件也会自动维护管理删除,而担保还原点如果不手动删除,控制文件是不会自动删除的,也就说只要设立了担保还原点没有手动删除,数据库就一定能恢复到那个还原点状态。如果担保还原点和Flashback Database一起使用,那么数据库就能闪回到担保还原点起和之后的任何时间点。
The database can retain up to 2048 restore point. Restore points are retained in the database for at least the number of days specified for the CONTROL_FILE_RECORD_KEEP_TIME initialization parameter. The default value of that parameter is 7 days. Guaranteed restore points are retained in the database until explicitly dropped by the user.

 

使用闪回数据库可以将数据库快速的闪回到过去某个时间点。在启用闪回数据时,会将修改过的块的前映像作为闪回数据库日志保存在闪回恢复区中,如出现逻辑坏块或用户错误操作需要恢复到过去的时间点,闪回数据库将还原数据库的前映像,然后使用归档日志和redo前滚到期望恢复的时间点,因为无需还原数据库的数据文件,所有此过程速度比较传统的还原恢复通常快很多。

启动闪回数据库时,会将前映像数据保存在“闪回缓冲区”中,然后由恢复写入器(Recovery Writer,RVWR)后台进程,将闪回缓冲区的前映像数据保存在闪回恢复区的闪回数据库日志中。

闪回数据库 -----这个功能可撤销导致逻辑数据损坏的更改
就是当出现逻辑错误时,能够将整个数据库回退到出错前的那个时间点上,
闪回数据库的日志文件不是由传统的Log Writer (LGWR)进程写入,而是由一个称为RecoVery WRiter (RVWR)的新进程写入,闪回日志文件由RCWR进程在恢复区中自动创建和维护。


可以使用闪回数据库的场景包括
1. 用户截断了表(trucate)
2. 系统管理员误删除了用户
3. 用户错误的执行了某个批处理任务,或者该批处理任务的脚本编写错误,使得多个表的数据发生混乱,我们无法采用闪回表的方式进行恢复
实现闪回数据库的基础是闪回日志,只要我们配置了闪回数据库,就会自动创建闪回日志。这时,只要数据库里的数据发生变化,oracle就会将数据被修改前的旧值保存在闪回日志里,当我们需要闪回数据库时,oracle就会读取闪回日志里的记录,并应用到数据库上,从而将数据库回退到历史的某个时间点上。


闪回数据库:减少还原时间
闪回数据库比使用还原文件和重做日志文件的传统时间点恢复的速度要更快。随着数据库规模的增加,通过还原所有数据文件来执行传统的时间点恢复所需的时间长度变得不太现实。使用闪回数据库时,因为不要需要还原数据文件,所以恢复数据库的时间与需要回退的更改数目(而不是数据库大小)成比例。
闪回数据库是通过使用一类被称为闪回数据库日志的日志文件来实施的。oracle数据库会定期将数据块的“前像”记录在闪回数据库日志中。为了快速将数据文件更改回退到捕获闪回日志的时间(就在所需目标时间之前),可以重用块前像。然后,应用重做日志文件中的更改来填充间隔。在快速恢复区中会自动创建和管理闪回数据库日志。
在不能使用闪回数据库功能的情况下,必须使用不完全恢复操作将数据库返回到特定时间。闪回数据库操作完成后,可在只读模式下打开数据库,验证是否使用了正确的目标时间或系统更改号(SCN)。如果没有,可以再次闪回数据库,或者通过执行恢复操作来前滚数据库。因此,要撤销闪回数据库操作,必须向前恢复数据库。
注:闪回保留目标并不能绝对保证闪回可用。如果闪回恢复区中必须存在的文件需要占用空间,可能会自动删除闪回日志。
闪回数据库操作完成后,必须使用以下一种方法打开数据库:
在只读模式下验证是否使用了正确的目标时间或SCN
使用RESETLOGS 参数才允许进行更新

闪回数据库限制:(不能使用闪回数据库)
已还原或重新创建了控制文件
已删除了表空间
已收缩了数据文件

不能使用闪回数据库恢复自闪回目标时间以来已删除的数据文件。
删除的数据文件会添加到控制文件中且标记为脱机,但是不会闪回。
闪回数据库不能闪回自闪回目标时间以来已收缩的数据文件,这种数据文件必须先脱机,才能执行闪回操作。
#########################################

 

shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
archive log list;
alter database flashback on;


关闭闪回及归档
shutdown immediate;
startup mount
alter database flashback off
alter database noarchivelog;
alter database open;
archive log list;

 

 


闪回数据库的步骤
1、关闭数据库
2、启动数据库到mount状态[exclusive模式]
3、闪回至某个时间点,SCN或还原点
4、使用resetlogs打开数据库

闪回数据库的方法
1、sqlplus下基于SCN闪回
 FLASHBACK  DATABASE [<database_name>]  TO  SCN <system_change_number>
2、sqlplus下基于时间戳闪回
 FLASHBACK  DATABASE [<database_name>]  TO  TIMESTMP <system_timestamp_value>
3、sqlplus下基于还原点闪回
 FLASHBACK  DATABASE [<database_name>]  TO  RESTORE POINT <restore_point_name>
4、RMAN下基于时间戳闪回
 RMAN> FLASHBACK DATABASE TO TIME = "TO_DATE('2013-10-10 19:25:21','YYYY-MM-DD HH24:MI:SS')";
5、RMAN下基于SCN闪回
 RMAN> FLASHBACK DATABASE TO SCN=1121679;
6、RMAN下基于:归档序号
 RMAN> FLASHBACK DATABASE TO SEQUENCE=56 THREAD=1;

-----------------------------------------------

闪回需要在Mount状态下进行,可以指定Timestamp/SCN/Sequence进行闪回。
首先将数据库闪回到第一时间点,以Redo only的方式打开数据库:


在操作之前,先备份一个数据 expdp schemas=test select flashback_on from v$database;

show parameter keep_time;
alter system set control_file_record_keep_time=1;
select * from v$restore_point;
CREATE RESTORE POINT restore1;--正常恢复点
CREATE RESTORE POINT restore2 GUARANTEE FLASHBACK DATABASE;--担保恢复点,需要sysdba权限 创建恢复点后,就可以删除任意对象,甚至是用户本身。 drop table e1 purge; drop table colinfo purge; 或者 drop user test cascade; shutdown immediate; startup mount; FLASHBACK database TO RESTORE POINT restore1;--mount状态下执行 alter database open resetlogs;
alter database open read only;    ‍--以read only 方式打开检查数据库是否闪回成功,如不成功考虑其他形式的闪回
查看验证后,发现就跟快照一样,一切如初,与恢复点restore1之前的一模一样。 如果觉的没有用的话,就删除恢复点 drop restore point restore1;



 

Flashback Query闪回查询

flashback query是基于undo表空间的闪回,与之相关的参数如下:
show parameter undo
undo_management:undo管理方式分自动auto和手动manul两种,默认为auto。
undo_retention:此参数表示,如果undo表空间中的空间充足,那么undo数据至少为保留900秒;
undo_tablespace:指定undo表空间

注意:如果undo表空间为auto管理方式,那么当undo表空间中的空间不足的时候,还是会覆盖保留区内的undo数据,也就说这种情况下
不能保证undo数据保留900秒,900秒内不一定能恢复dml操作。特殊情况下可以用下面命令长期保留undo数据,但会影响undo空间和dml操作
SQL>alter tablespace undotbs1 retention guarantee;

create table e2 as 
select * from e1 as of timestamp systimestamp - interval '3' minute
where id not in(select id from e1);
select systimestamp - 7 from dual;
select * from e1 as of timestamp systimestamp - interval '3' minute
where id not in(select id from e1);

select id from e1;
select id from e2;



alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss";
select sysdate from dual;
create table e2 as
select * from e1 as of timestamp
to_timestamp('2017-04-27 12:10:06','yy-mm-dd hh24:mi:ss');
select * from e2;
select * from e1;
drop table e2 purge;
delete from e1 where id<22;
insert into e1 values('aaa',test.nextval);

 

 

Flashback Table闪回表的使用

However,
FLASHBACK TABLE TO SCN or TIMESTAMP does not preserve rowids,
and
FLASHBACK TABLE TO BEFORE DROP does not recover referential constraints.

将undo_retention设置的大一点24小时,或者增大undo tablespace;

select name,value/60/60 minutes_retained
from v$parameter
where name='undo_retention';
alter system set undo_retention=86400;

 

四种类型

flashback table to_scn clause

flashback table to_timestamp clause

flashback table to_restore_point clause

flashback table to_before_drop

 


其实就是delete语句的闪回,与下面的drop语句有所不同

Flashback Table和Flashback Query一样是基于undo的闪回。
闪回表时用户必须拥有flashback table权限和表row movement功能;


select ora_rowscn,scn_to_timestamp(ora_rowscn),id,name from e2;
一定要记准delete的时间,这是进行准确闪回的便捷之处 select dbms_flashback.get_system_change_number from dual; grant flashback any table to scott; select * from e2; delete from e2; commit; --必须开启行移动功能 alter table e2 enable row movement; --基于scn闪回表 --查询某个时间点对应的scn select timestamp_to_scn(to_timestamp('2017-04-27 15:15:06','yy-mm-dd hh24:mi:ss')) from dual; flashback table e2 to scn '981712'; select * from e2; --基于时间戳闪回表 flashback table e2 to timestamp to_timestamp('2017-04-27 15:15:06','yy-mm-dd hh24:mi:ss'); select * from e2;



在闪回表时,好像自动生成此表
CREATE GLOBAL TEMPORARY TABLE "TEST"."SYS_TEMP_FBT"
( "SCHEMA" VARCHAR2(32 BYTE),
"OBJECT_NAME" VARCHAR2(32 BYTE),
"OBJECT#" NUMBER,
"RID" UROWID (4000),
"ACTION" CHAR(1 BYTE) )
ON COMMIT PRESERVE ROWS ;

 

flashback drop table

recyclebin是user_recyclebin的同名词

查看回收站中的对象 show recyclebin; select * from user_recyclebin/dba_recyclebin; 手动清除回收站中的表 purge table "BIN$6Ah1cQuityrgQAB/AQBjbQ==$0"; 清除回收站中特定表空间的所有对象 purge tablespace 表空间名; 清除回收站中特定表空间上特定用户的所有对象 purge tablespace tablespace_name user scott; 清除数据库中所有回收站中的对象 purge dba_recyclebin;--管理员清空所有模式下的回收站 purge recyclebin;--普通用户清除自己的回收站 --删除对象系统统一以BIN$unique_id$version的形式命名 --can_undrop选项为no的选项为暂时不能恢复,比如索引依赖对应的表要先恢复 --删除的表已从回收站清除,则不能闪回。 先闪回表,再闪回索引与约束 三种形式 flashback table "BIN$5jXWCqj0Ad/gQAB/AQA2zQ==$0" to before drop; flashback table e2 to before drop; flashback table e2 to before drop rename to test02; 查询索引名,更改为原来的名称,如果是约束还要更改约束名称: select index_name,table_owner,table_name from user_indexes; select table_name,constraint_name from USER_CONSTRAINTS; alter table test01 rename constraint "BIN$5jYrRNeD9gfgQAB/AQA3rg==$0" to test01_pk; alter index "BIN$5jYrRNeB9gfgQAB/AQA3rg==$0" rename to test01_pk; --如果一个表删除多次,要还原较早版本的表,就必须指定在回收站中的表名 --如果在命令中指定原表名,将还原最近删除的版本 --如果删除后,表名已经重建,那需要用rename to选项重新指定其他表名。

 

############################

用还原点闪回表

create restore point aa as of timestamp|scn expr

11g还可以指定过去的scn或timestamp
CREATE RESTORE POINT res1 AS OF SCN 1229570;
CREATE RESTORE POINT res2 AS OF TIMESTAMP to_date('2013-10-10 23:12:12','YYYY-MM-DD HH24:MI');

默认保留7天

CONTROL_
FILE_RECORD_KEEP_TIME initialization parameter.

 

create restore point good_data;
select * from test02;
update test02 set id=15;
commit;

ALTER TABLE test02 ENABLE ROW MOVEMENT;
FLASHBACK TABLE test02 TO RESTORE POINT good_data;

 

##########################################

 

 

闪回技术由于只能处理更改数据,所以从根本上改变了恢复技术。
使用这个技术时,从错误中恢复花费的时间等于制造错误所花费的时间。
当闪回技术使用时,它与介质恢复相比,在易用性、可用性和还原时间方面有明显的优势。

 

闪回表:注意事项
1整个FLASHBACK TABLE 语句是在一个事务处理中执行的。有可能会闪回所指定表,也可能不闪回任何指定表。
2操作进行中,闪回表获取了该语句指定的所有表上的数据操作语言(DML)互斥锁。
3不会闪回受影响对象的统计信息。(该对象的统计信息不会闪回)
4会保留所有现有的索引。不会重新创建删除的索引。还会自动保留相关的提交时实体化视图。
5FLASHBACK TABLE 语句会写入预警日志文件。
6只要不违反任何表约束条件,就闪回FLASHBACK TABLE 语句中指定的表。如果在闪回执行期间违反了任何约束条件,则会中止操作,此时表的状态与FLASHBACK TABLE语句调用之前的状态相同。
7(闪回不能跨DDL,比如,在闪回数据之前,做过删除一个字段的操作,那么是无法闪回的。)不能将表闪回到早于执行数据定义语言(DDL)操作时的某个特定时间。
8不能对系统表、远程表和固定表执行闪回表操作。

使用这个功能时,会还原表及其关联对象(如索引、约束条件、触发器等)中的数据。
所谓闪回表,就是将表里的数据回退到历史的某个时间点,比如回退到用户误删除数据之前的时间点,从而将误删除的数据恢复回来,在这个操作过程中,数据库仍然可用而且不需要额外的空间。
闪回表利用的是UNDO表空间里记录的数据被改变前的值,因此,如果闪回表时所需要的undo数据,由于保留时间超过了初始化参数undo_retention所指定的值,从而导致该undo数据库数据被其他事务覆盖的话,那么就不能恢复到指定的时间了,除非在UNDO表空间上指定了retention guarantee选项。
使用闪回表,可将一组表恢复到特定的时间点,而不需要执行传统时间点恢复操作。
在数据库联机时,通过只回退对指定表及其相关对象所做的更改,闪回表操作可原位完成。
闪回表语句可作为单个事务处理来执行。必须成功闪回所有表,否则会回退整个事务处理。
1使用闪回表,可将一个或多个表恢复到特定的时间点,而不需要还原备份
2从回滚段表空间检索数据后可执行闪回表操作
3执行闪回表操作需要FLASHBACK TABLE 权限
4必须对要执行闪回操作的表启动行移动      
由于闪回表的操作会修改表里的数据,从而有可能引起数据行的移动。比如某一行数据当前在A数据块里,而在把表闪回到以前的某个时间点时,在那个时间上,该行数据位于B数据块里,于是在闪回表的操作中,数据行从当前A数据块转移到B数据块,因此在闪回表之前,必须启动数据行移动特性。

 

oracle能保留至少2048个正常恢复点,正常恢复点被保留在库中至少的天数,由
control_file_record_keep_time来指定。默认值是7天。
担保恢复点被保留在库中直到显式的由用户丢弃。

select *
from xyc_t1 versions between timestamp
to_timestamp('2013-10-06 08:17:58','YYYY-MM-DD HH24:MI:SS')
and
to_timestamp('2013-10-06 08:20:01','YYYY-MM-DD HH24:MI:SS');

select * from flashback_transaction_query
where logon_user!='SYS' and table_name not like '%$';

 

 

附加日志

alter database add supplemental log data;
alter database add supplemental log data (all) columns;
alter database add supplemental log data (primary key) columns;
alter database add supplemental log data (foreign key) columns;
alter database add supplemental log data (unique) columns;
alter database add supplemental log data for procedural replication;

丢弃时有先后顺序的,最后才能德育log data,其它没有次序。
alter database drop supplemental log data (all) columns;
alter database drop supplemental log data (primary key) columns;
alter database drop supplemental log data (foreign key) columns;
alter database drop supplemental log data (unique) columns;
alter database drop supplemental log data for procedural replication;
alter database drop supplemental log data;

查询开关是否打开
select Supplemental_Log_Data_Min,Supplemental_Log_Data_All,
Supplemental_Log_Data_Pk,Supplemental_Log_Data_Fk,
Supplemental_Log_Data_Ui,Supplemental_Log_Data_Pl
from v$database;