ITPub博客

首页 > 数据库 > Oracle > Flashback

Flashback

原创 Oracle 作者:ashic 时间:2014-07-11 01:19:08 0 删除 编辑

Flashback database 架构

Flashback Database 整个架构包括一个进程Recover Writer(RVWR)后台进程、Flashback Database Log 日志和Flash Recover Area

一旦数据库启用了Flashback Database,则RVWR进程会启动,RVWR进程会向Flash Recover Area内写入Flashback Database Log,这些日志包括的是数据块的"前镜像"(before image)。这也是Flashback Database比不完全恢复快的原因

ps -ef| grep rvwr

oracle 11742 1 0 09:38 ? 00:00:03 ora_rvwr_PROD



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


设置闪回恢复区


闪回恢复区主要通过3个初始化参数来设置和管理:

db_recovery_file_dest:指定闪回恢复区的位置

db_recovery_file_dest_size:指定闪回恢复区的可用空间大小

db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟,也就是一天。当然,实际上可回退的时间还决定于闪回恢复区的大小,因为里面保存了回退所需要的flash log。所以这个参数要和db_recovery_file_dest_size配合修改。



sys@PROD>show parameter recover


NAME                                 TYPE         VALUE

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

db_recovery_file_dest                 string         /u01/app/oracle/flash

db_recovery_file_dest_size         big integer 4G




sys@PROD>show parameter retention


NAME                                                          TYPE         VALUE

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

db_flashback_retention_target         integer         1440单位是分钟

undo_retention                                          integer         5400


1440分钟时24小时代表数据库能回退24小时


Flashback Query 和 Flashback Table 都是利用UNDO内容来完成的,所以回复效果取决于保留的UNDO内容多少,要达到理想效果,就要考虑UNDO_RETENTION的参数设置。

UNDO_RETENTION参数定义的是提交修改后的UNDO记录还要保留多长时间。但是ORACLE并不强制保留这么长时间,如果UNDO空间不够,即使还没有达到时间限制,这些记录还是会被覆盖。可以通过在UNDO表空间或者数据库设置retention guarantee 来强制这种保留时间限制,缺省是这个特性没有启用。这个属性可以再dba_tablespace视图中查看。


sys@PROD>select tablespace_name,retention from dba_tablespaces;


TABLESPACE_NAME          RETENTION

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

SYSTEM                         NOT APPLY

SYSAUX                         NOT APPLY

UNDOTBS                  NOGUARANTEE

TEMPTS                         NOT APPLY

USERS                         NOT APPLY

LXTB                         NOT APPLY

TOOLS                         NOT APPLY


alter tablespace undotbs retention guarantee;


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


启动数据库Flashback功能(开闪回一定要开归档!)


1.数据库启动到MOUNT

检查Flashback功能,缺省时功能是关闭的

select name,flashback_on from v$database;

NAME

FLASHBACK_ON

---------

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

PROD        

NO

启动Flashback功能

alter database flashback on;


2.设置db_flash_retention_target参数

alter system set db_flashback_retention_target=1440;


3.开库


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

闪回查询

利用select * from emp1 as of timestamp to_timestamp('2014-03-30 00:34:09','yyyy-mm-dd hh24:mi:ss');


Flashback Table



注意:SYS用户不支持闪回

ORA-08185: Flashback not supported for user SYS


Flashback Table也是使用UNDO tablespace的内容来实现对数据的回退。该命令相对简单,输入:flashback table table_name to scn(to timestamp) 即可。

flashback table tm1 to timestamp to_timestamp('2014-06-14 22:50:00','yyyy-mm-dd hh24:mi:ss');


scott@PROD>flashback table tm1 to timestamp to_timestamp('2014-06-14 22:50:00','yyyy-mm-dd hh24:mi:ss');

flashback table tm1 to timestamp to_timestamp('2014-06-14 22:50:00','yyyy-mm-dd hh24:mi:ss')

*

ERROR at line 1:

ORA-08194: Flashback Table operation is not allowed on materialized views


scott@PROD>create table tm2 as select * from tm1 as of timestamp to_timestamp('2014-06-14 22:50:00','yyyy-mm-dd hh24:mi:ss');


Table created.

如果存在基于这个表的物化视图,执行闪回操作时会报错 ,可以通过create一个新表来恢复



注意:如果想要对表进行flashback,必须允许表的row movement.

ORA-08189: cannot flashback the table because row movement is not enabled


SQL>Alter table table_name row movement;


要查看某表是否启用row movement,可以到user_tables 中查询(或all_tables,dba_tables).


sys@PROD>select TABLE_NAME,ROW_MOVEMENT from dba_tables where OWNER='SCOTT';


TABLE_NAME                 ROW_MOVE

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

DEPT                         DISABLED

EMP                         DISABLED

BONUS                         DISABLED

SALGRADE                 DISABLED

DEPT1                         ENABLED

SYS_TEMP_FBT                 DISABLED


行迁移

意思就是,一个现存的行允许改变其rowid(物理存储地址),通常情况下,数据行在分配了空间之后,行的rowid就固定了,即使以后行长度超出预留的空间,也不会将其移动,在长数据行的情况下,表会产生行链接,对于io来说,行链接是不利的,为了性能,就需要将行调整为在单个物理存储地址下能保存行的所有信息,这需要行迁移.另外在flashback的时候,由于原始版本的行占据了相应的物理地址,所以,也需要行迁移.

其它的,比如说在收缩段空间的情况下,由于要把所有段数据向段前挤压,大部分行都需要改变其物理地址.也需要行迁移



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


实验1:用SYS用户闪回

14:36:13 sys@PROD>insert into ftest values(8000,'fan','MANAGER',null,'26-may-14',8000,null,40);


1 row created.


14:36:21 sys@PROD>select * from ftest;


EMPNO ENAME JOB         MGR HIREDATE         SAL COMM DEPTNO

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

7369 SMITH CLERK         7902 17-DEC-80         800                  20

7499 ALLEN SALESMAN         7698 20-FEB-81         1600 300         30

7521 WARD SALESMAN         7698 22-FEB-81         1250 500         30

7566 JONES MANAGER         7839 02-APR-81         2975                  20

7654 MARTIN SALESMAN         7698 28-SEP-81         1250 1400         30

7698 BLAKE MANAGER         7839 01-MAY-81         2850                  30

7782 CLARK MANAGER         7839 09-JUN-81         2450                  10

7788 SCOTT ANALYST         7566 19-APR-87         3000                  20

7839 KING PRESIDENT          17-NOV-81         5000                  10

7844 TURNER SALESMAN         7698 08-SEP-81         1500          0         30

7876 ADAMS CLERK         7788 23-MAY-87         1100                  20

7900 JAMES CLERK         7698 03-DEC-81         950                  30

7902 FORD ANALYST         7566 03-DEC-81         3000                  20

7934 MILLER CLERK         7782 23-JAN-82         1300                  10

8000 fan         MANAGER                 26-MAY-14         8000                  40


15 rows selected.


14:36:27 sys@PROD>commite;


14:36:39 sys@PROD>update ftest set sal=10000 where empno=8000;


1 row updated.


14:37:10 sys@PROD>commit;


Commit complete.


14:41:01 sys@PROD>flashback table ftest to timestamp to_timestamp('2014-05-26 14:36:00','yyyy-mm-dd hh24:mi:ss');

flashback table ftest to timestamp to_timestamp('2014-05-26 14:36:00','yyyy-mm-dd hh24:mi:ss')

*

ERROR at line 1:

ORA-08185: Flashback not supported for user SYS


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



试验2:用SCOTT的用户闪回

14:52:01 scott@PROD>select * from dept1;


DEPTNO DNAME                  LOC

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

10 ACCOUNTING         NEW YORK

20 RESEARCH         DALLAS

30 SALES         CHICAGO

7 OPERATIONS         BOSTON


14:52:10 scott@PROD>update dept1 set deptno=44 where loc='BOSTON';


1 row updated.


14:52:35 scott@PROD>commit;


Commit complete.


14:52:38 scott@PROD>flashback table dept1 to timestamp to_timestamp('2014-05-26 14:52:00','yyyy-mm-dd hh24:mi:ss');

flashback table dept1 to timestamp to_timestamp('2014-05-26 14:52:00','yyyy-mm-dd hh24:mi:ss')

*

ERROR at line 1:

ORA-08189: cannot flashback the table because row movement is not enabled



14:53:36 scott@PROD>alter table dept1 enable row movement;


Table altered.


14:56:47 scott@PROD>flashback table dept1 to timestamp to_timestamp('2014-05-26 14:52:00','yyyy-mm-dd hh24:mi:ss');


Flashback complete.


14:57:00 scott@PROD>select * from dept1;


DEPTNO DNAME         LOC

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

10 ACCOUNTING         NEW YORK

20 RESEARCH         DALLAS

30 SALES         CHICAGO

7 OPERATIONS         BOSTON


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


试验3:闪回查询

15:06:14 scott@PROD>update dept1 set deptno=45 where loc='BOSTON';


1 row updated.


15:06:47 scott@PROD>commit;


Commit complete.


15:06:50 scott@PROD>update dept1 set deptno=46 where loc='BOSTON';


1 row updated.


15:06:55 scott@PROD>commit;


Commit complete.


14:57:05 scott@PROD>select * from dept1 as of timestamp to_timestamp('2014-05-26 14:52:00','yyyy-mm-dd hh24:mi:ss');


DEPTNO DNAME                  LOC

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

10 ACCOUNTING         NEW YORK

20 RESEARCH         DALLAS

30 SALES         CHICAGO

7 OPERATIONS         BOSTON


15:04:21 scott@PROD>select * from dept1 as of timestamp to_timestamp('2014-05-26 14:53:00','yyyy-mm-dd hh24:mi:ss');


DEPTNO DNAME                  LOC

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

10 ACCOUNTING         NEW YORK

20 RESEARCH         DALLAS

30 SALES         CHICAGO

44 OPERATIONS         BOSTON        


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


Flashback Database


1.模拟误操作

16:12:22 scott@PROD>create table ftest as select * from dba_objects;


Table created.


16:12:45 scott@PROD>select count(*) from ftest;


COUNT(*)

----------

16242


2.truncate清空数据

16:12:58 scott@PROD>truncate table ftest;


Table truncated.


16:13:32 scott@PROD>select count(*) from ftest;


COUNT(*)

----------

0


3.Flashback Database 实际是对数据库的一个不完全恢复操作,因此需要关闭数据库,重启数据库到MOUNT状态;但是与不完全恢复不同的是它不需要restore操作;

sys@PROD>shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.


sys@PROD>startup mount


sys@PROD>flashback database to timestamp to_timestamp('2014-05-26 16:13:00','yyyy-mm-dd hh24:mi:ss');


Flashback complete.

恢复成功后先把数据库以read only的方式打开,检查是否达到预期的恢复目的,如果没有达到目的,还有机会进行第二次恢复;


sys@PROD>alter database open read only;


Database altered.


scott@PROD>select count(*) from ftest;


COUNT(*)

----------

16242


恢复成功,一resetlog方式打开数据库


关闭数据库

ys@PROD>shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.


启动到MOUNT

sys@PROD>startup mount


OPEN RESETLOGS

sys@PROD>alter database open resetlogs;


sys@PROD>select count(*) from scott.ftest;


COUNT(*)

----------

16242

恢复成功



如果第一次没有成功需要

1.shutdown immediate

2.startup mount

3.继续flashback database

4.alter database open read only

剩余步骤一样



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


Flashback Drop


这个功能是从Oracle 10g开始出现的,用于恢复用户误删除的对象(包括表、索引等)。这个技术依赖于Tablespace Recycle Bin(表空间回收站)。这个功能和windows的回收站非常类似


Tablespace Recycle Bin

从Oracle 10g开始,每个表空间都会有一个叫做回收站的逻辑区域,当用户执行drop命令时,被删除的表和表的关联对象(包括索引、约束、触发器、LOB段、LOB index段)不会被物理删除,这些对象先转到回收站中,这就给用户提供了一个恢复的可能。


show parameter recycle


NAME                         TYPE VALUE

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

recyclebin                 string        on


sys@PROD>show recyclebin;

ORIGINAL NAME         RECYCLEBIN NAME                 OBJECT TYPE DROP TIME

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

EMP1                 BIN$9ZG3UH9s7XbgQAB/AQAh1A==$0 TABLE         2014-03-27:15:41:41

EMP1                 BIN$9ZJdfj8Mm6ngQAB/AQAeCw==$0 TABLE         2014-03-27:15:16:38

EMP1                 BIN$9WlrO36I+1jgQAB/AQA9uA==$0 TABLE         2014-03-25:14:25:31

EMP2                 BIN$9ZJdfj8Lm6ngQAB/AQAeCw==$0 TABLE         2014-03-27:15:16:34

EMP3                 BIN$9ZLYhwS0uBLgQAB/AQAqDg==$0 TABLE         2014-03-27:17:02:33

EMP3                 BIN$9ZJdfj8Nm6ngQAB/AQAeCw==$0 TABLE         2014-03-27:15:17:32

EMP4                 BIN$9ZJdfj8Om6ngQAB/AQAeCw==$0 TABLE         2014-03-27:15:17:37


sys@PROD>select object_name,original_name from recyclebin;


OBJECT_NAME                 ORIGINAL_NAME

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

BIN$9WlrO36I+1jgQAB/AQA9uA==$0 EMP1

BIN$9ZJdfj8Lm6ngQAB/AQAeCw==$0 EMP2

BIN$9ZJdfj8Mm6ngQAB/AQAeCw==$0 EMP1

BIN$9ZJdfj8Nm6ngQAB/AQAeCw==$0 EMP3

BIN$9ZJdfj8Om6ngQAB/AQAeCw==$0 EMP4

BIN$9ZG3UH9s7XbgQAB/AQAh1A==$0 EMP1

BIN$9ZLYhwS0uBLgQAB/AQAqDg==$0 EMP3


可以像查看普通表一样,查看Recycle Bin 中这些对象的内容


sys@PROD>select * from "BIN$9ZG3UH9s7XbgQAB/AQAh1A==$0";


EMPNO ENAME JOB         MGR HIREDATE         SAL COMM DEPTNO

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

7369 SMITH CLERK         7902 17-DEC-80         800                  20

7499 ALLEN SALESMAN         7698 20-FEB-81         1600 300         30

7521 WARD SALESMAN         7698 22-FEB-81         1250 500         30


Flashback drop


sys@PROD>flashback table "BIN$9ZG3UH9s7XbgQAB/AQAh1A==$0" to before drop rename to empdrop;


Flashback complete.


sys@PROD>select * from empdrop;


EMPNO ENAME JOB         MGR HIREDATE         SAL COMM DEPTNO

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

7369 SMITH CLERK         7902 17-DEC-80         800                  20

7499 ALLEN SALESMAN         7698 20-FEB-81         1600 300         30

7521 WARD SALESMAN         7698 22-FEB-81         1250 500         30


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


Flash Recovery Area 空间监控


col name format a32 heading 'file name'

col spc_lmt_mb format 9999.99 heading 'space|limit|(mb)'

col spc_usd_mb format 9999.99 heading'space|used|(mb)'

col spc_rcl_mb format 9999.99 heading 'reclm|space|(mb)'

col number_of_files format 99999 heading 'files'

select name,space_limit/1024/1024 spc_lmt_mb,space_used/1024/1024 spc_usd_mb,space_reclaimable/1024/1024 spc_rcl_mb,number_of_files from v$recovery_file_dest;












   

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29492784/viewspace-1216200/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-02-18

  • 博文量
    21
  • 访问量
    102668