ITPub博客

首页 > 数据库 > Oracle > Flashback

Flashback

原创 Oracle 作者:Ashic 时间:2014-07-04 02:00:15 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-1208957/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 一个CRS_STAT脚本
请登录后发表评论 登录
全部评论

注册时间:2014-02-18

  • 博文量
    21
  • 访问量
    102669