重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: 5dm
打印 上一主题 下一主题

[转帖]闪回技术

[复制链接]
11#
 楼主| 发表于 2013-1-22 10:05:20 | 只看该作者
2.4.2.4.9. 打开数据库

在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:
            1). 直接alter database open resetlogs 打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。
            2). 先执行alter database open read only 命令,以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。

这里演示,就以resetlogs方式打开:
SQL> alter database open resetlogs;
数据库已更改。

验证数据:
SQL> select * from A;
        ID NAME
---------- ----------
         1 tianlesoftware
         2 dave

2.4.2.5 和Flashback Database 相关的3个视图


2.4.2.5.1. V$database

这个视图可以查看是否启用了Flashback database功能
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES

2.4.2.5.2. 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_scn os, to_char(oldest_flashback_time,'yy-mm-dd hh2
4:mi:ss') ot, retention_target rt,flashback_size fs, estimated_flashback_size es
from v$flashback_database_log;

OS       OT             RT      FS        ES
----------  -----------------     ----------  ----------    ----------

946088  09-10-14 13:49:59  1440     16384000  350920704

2.4.2.5.3. V$flashback_database_stat

            这个视图用来对Flashback log 空间情况进行更细粒度的记录和估计。 这个视图以小时为单位记录单位时间内数据库的活动量:
            Flashback_Data 代表Flashback log产生数量,
            DB_Date 代表数据改变数量,
            Redo_Date代表日志数量,
通过这3个数量可以反映出数据的活动特点,更准确的预计Flash Recovery Area的空间需求

SQL> alter session set nls_date_format='hh24:mi:ss';
会话已更改。

SQL> select *from v$flashback_database_stat;
BEGIN_TI END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
-------- -------- -------------- ---------- ---------- ------------------------
14:43:10 15:15:28        6455296   29310976    3898368              0

2.4.3 Flashback Drop

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

            Flashback 不支持sys用户. system表空间下的对象,也不能从回收站里拿到。故使用SYS 或者SYSTEM用户登陆时, show recyclebin 为空。

            Flashback Drop 是基于Tablespace RecycleBin 来实现恢复的。 它只支持闪回与table 相关连的对象,比如表,索引,约束,触发器等。 如果是函数或者存储过程等,就需要使用Flashback Query来实现。

回复 支持 反对

使用道具 举报

12#
 楼主| 发表于 2013-1-22 10:05:52 | 只看该作者
2.4.3.1. Tablespace Recycle Bin

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

            When you drop a table, the database does not immediately remove the space associated with the table. The database renames the table and places it and any associated objects in a recycle bin, where, in case the table was dropped in error, it can be recovered at a later time. This feature is called Flashback Drop, and the FLASHBACK TABLE statement is used to restore the table. Before discussing the use of the FLASHBACK TABLE statement for this purpose, it is important to understand how the recycle bin works, and how you manage its contents.

            The recycle bin is actually a data dictionary table containing information about dropped objects. Dropped tables and any associated objects such as indexes, constraints, nested tables, and the likes are not removed and still occupy space. They continue to count against user space quotas, until specifically purged from the recycle bin or the unlikely situation where they must be purged by the database because of tablespace space constraints.

From:
http://download.oracle.com/docs/cd/E11882_01/server.112/e17120/tables011.htm#ADMIN11679

            初始化参数recyclebin 用于控制是否启用recyclebin功能,缺省是ON, 可以使用OFF关闭。

SQL> show parameter recycle
NAME                    TYPE        VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_recycle            string
db_recycle_cache_size         big integer 0
recyclebin                    string      on

禁用该功能:
SQL> alter system set recyclebin=off;
SQL> alter system set recyclebin=on;


SQL> alter session set recyclebin=off;
SQL> alter session set recyclebin=on;

            禁用后删除的对象将直接删除,不会写到Recycle中,当然在删除时,指定purge 参数,表也将直接删除,不会写到recyclebin中。
SQL> drop table name purge;

查看recyclebin中的对象列表:
SQL> select * from A;
        ID
        ----------
         1
         2
         3

SQL> drop table A;
表已删除。
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME       OBJECT TYPE  DROP TIME
----------------      -----------------------------          ------------     
A   BIN$RWXQQcTPRde0ws4h9ewJcg==$0  TABLE     2009-10-15:12:44:33

查看recyclebin中对象:
SQL> select original_name,object_name from recyclebin;
ORIGINAL_NAME       OBJECT_NAME
-------------------------------- ------------------------------
A                      BIN$RWXQQcTPRde0ws4h9ewJcg==$0



查看recyblebin对象里的内容:
SQL> select * from "BIN$RWXQQcTPRde0ws4h9ewJcg==$0";
        ID
       ----------
         1
         2
         3

            表空间的Recycle Bin 区域只是一个逻辑区域,而不是从表空间上物理的划出一块区域固定用于回收站,因此Recycle Bin是和普通对象共用表空间的存储区域,或者说是Recycle Bin的对象要和普通对象抢夺存储空间。
            当发生空间不够时,Oracle会按照先入先出的顺序覆盖Recycle Bin中的对象。

也可以手动的删除Recycle Bin占用的空间:
            1). Purge tablespace tablespace_name : 用于清空表空间的Recycle Bin
            2). Purge tablespace tablespace_name user user_name: 清空指定表空间的Recycle Bin中指定用户的对象
            3). Purge recyclebin: 删除当前用户的Recycle Bin中的对象
            4). Purge dba_recyclebin: 删除所有用户的Recycle Bin中的对象,该命令要sysdba权限
            5). Drop table table_name purge:  删除对象并且不放在Recycle Bin中,即永久的删除,不能用Flashback恢复。
            6). Purge index recycle_bin_object_name: 当想释放Recycle bin的空间,又想能恢复表时,可以通过释放该对象的index所占用的空间来缓解空间压力。 因为索引是可以重建的。
回复 支持 反对

使用道具 举报

13#
 楼主| 发表于 2013-1-22 10:06:16 | 只看该作者
2.4.3.2. Flashback Drop 实例操作


SQL> select original_name,object_name from recyclebin;
ORIGINAL_NAME         OBJECT_NAME
-------------------------------- ------------------------------
A                       BIN$RWXQQcTPRde0ws4h9ewJcg==$0

SQL> flashback table a to before drop;
闪回完成。

SQL> select * from a;
        ID
         ----------
         1
         2
         3

            当我们删除表A后,在新建表A,这时在恢复的时候就会报错,此时我们在闪回时,对表重命名就可以了:
SQL> drop table a;
表已删除。

SQL> create table a
  2  (id number(1));
表已创建。

SQL> flashback table a to before drop ;
flashback table a to before drop
*
第 1 行出现错误:
ORA-38312: 原始名称已被现有对象使用

SQL> flashback table a to before drop rename to B;
闪回完成。

SQL> select * from B;
        ID
        ----------
         1
         2
         3

            当我们删除表A,在新建表A,在删除它,这是在Recycle Bin中就会有2个相同的表明,此时恢复我们就要指定object_name才行.

SQL> select * from B;
        ID
        ----------
         1
         2
         3

SQL> drop table B;
表已删除。
SQL> create table B(name varchar(20));
表已创建。
SQL> drop table B;
表已删除。

SQL> select original_name,object_name from recyclebin;

ORIGINAL_NAME                    OBJECT_NAME
--------------------------------            ------------------------------
B                                BIN$vYuv+g9fTi2exYP9X2048Q==$0
B                                BIN$geQ9+NekSjuRvzG+TqDVWw==$0

SQL> flashback table "BIN$vYuv+g9fTi2exYP9X2048Q==$0" to before drop;
闪回完成。

SQL> select * from B;
        ID
       ----------
         1
         2
         3

            一旦完成闪回恢复,Recycle Bin中的对象就消失了.

            如果表上索引或者约束等信息,这些信息也会被恢复,但是这些对象会使用Oracle 自动的命名。 我们需要查看这些对象,然后对这些对象重新命名:如:

SQL>select index_name from user_indexes where table_name = 'job_history';
INDEX_NAME
------------------------------
BIN$DBo9UChwZSbgQFeMiAdCcQ==$0
BIN$DBo9UChtZSbgQFeMiAdCcQ==$0
BIN$DBo9UChuZSbgQFeMiAdCcQ==$0
BIN$DBo9UChvZSbgQFeMiAdCcQ==$0

重命名:
SQL>alter index "bin$dbo9uchtzsbgqfemiadccq==$0" rename to jhist_job_ix;



Flashback Drop 需要注意的地方:
1). 只能用于非系统表空间和本地管理的表空间
2). 对象的参考约束不会被恢复,指向该对象的外键约束需要重建。
3). 对象能否恢复成功,取决与对象空间是否被覆盖重用。
4). 当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recycle bin,因此当你执行flashback table to before drop 时,也不能恢复依赖其的物化视图,需要dba 手工介入重新创建。
5). 对于Recycle Bin中的对象,只支持查询.
回复 支持 反对

使用道具 举报

14#
 楼主| 发表于 2013-1-22 10:06:43 | 只看该作者
2.4.4 Flashback Query

            Flashback 是ORACLE 自9i 就开始提供的一项特性,在9i 中利用oracle 查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错误数据,该项特性也被称为Flashback Query。
            Flashback Query分Flashback Query,Flashback Version Query, Flashback Transaction Query 三种。


2.4.4.1  Flashback Query

            Flashback Query 是利用多版本读一致性的特性从UNDO 表空间读取操作前的记录数据。

            flashback query 对v$tables,x$tables 等动态性能视图无效,不过对于dba_*,all_*,user_*等数据字典是有效的。
            该特性也完全支持访问远端数据库,比如select * from tbl@dblink as of scn 3600;的形式。


2.4.4.1.1  多版本读一致性

            不同的事务在写数据时,会将数据的前映像写入undo 表空间,这样如果同时有其它事务查询该表数据,则可以通过undo 表空间中数据的前映像来构造所需的完整记录集,而不需要等待写入的事务提交或回滚。


            Flashback query 有多种方式构建查询记录集,记录集的选择范围可以基于时间或基于scn,甚至可以同时查询出记录在undo 表空间中不同事务时的前映象。         用法与标准查询非常类似,要通过flashback query 查询undo 中的撤销数据,最简单的方式只需要在标准查询语句的表名后面跟上as of timestamp(基于时间)或as of scn(基于scn)即可。
            as of timestamp|scn 的语法是自9iR2 后才开始提供支持。

2.4.4.1.2  As  of  timestamp 的示例:

SQL>  alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss';
会话已更改。

SQL> select sysdate from dual;
SYSDATE
-------------------
2009-10-15 19:04:16

SQL> select * from A;
        ID
        ----------
         2
         1
         3
         4

模拟用户误操作,删除数据
SQL> delete from A;
已删除4行。
SQL> commit;
提交完成。
SQL> select * from A;
未选定行

查看删除之前的状态:假设当前距离删除数据已经有5 分钟左右的话:
SQL> select * from A as of timestamp sysdate-5/1440;
        ID
        ----------
         2
         1
         3
         4
或者:
SQL>select * from A as of timestamp to_timestamp('2009-10-15 19:04:16','YYYY-MM-DD hh24:mi:ss');
        ID
        ----------
         2
         1
         3
         4

用Flashback Query恢复之前的数据:
SQL>Insert into A select * from A as of timestamp to_timestamp('2009-10-15 19:04:16','YYYY-MM-DD hh24:mi:ss');
已创建4行。
SQL> COMMIT;
提交完成。
SQL> select * from A;
        ID
        ----------
         2
         1
         3
         4

            如上述示例中所表示的,as of timestamp 的确非常易用,但是在某些情况下,我们建议使用as of scn 的方式执行flashback query,比如需要对多个相互有主外键约束的表进行恢复时,如果使用as of timestamp 的方式,可能会由于时间点不统一的缘故造成数据选择或插入失败,通过scn 方式则能够确保记录的约束一致性。

2.4.4.1.3. As of scn 示例


查看SCN:
SQL>SELECT dbms_flashback.get_system_change_number FROM dual;
SQL>SELECT CURRENT_SCN FROM V$DATABASE;

SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
1095782

删除数据:
SQL> delete from A;
已删除4行。
SQL> commit;
提交完成。

查看删除之前的状态:
SQL> select * from A as of scn 1095782;
        ID
     ----------
         2
         1
         3
         4

用Flashback Query恢复之前的数据:
SQL> insert into A select * from A as of scn 1095782;
已创建4行。
SQL> commit;
提交完成。
SQL> select * from A;
        ID
        ----------
         2
         1
         3
         4
回复 支持 反对

使用道具 举报

15#
 楼主| 发表于 2013-1-22 10:07:23 | 只看该作者
2.4.4.1.4  SCN 与 timestamp 关系

            Oracle 在内部都是使用scn,即使你指定的是as of timestamp,oracle 也会将其转换成scn,系统时间标记与scn 之间存在一张表,即SYS 下的SMON_SCN_TIME

SQL> desc sys.smon_scn_time
名称                       是否为空? 类型
----------------------------------------- --------    --------------------------
THREAD                               NUMBER
TIME_MP                              NUMBER
TIME_DP                              DATE
SCN_WRP                             NUMBER
SCN_BAS                              NUMBER
NUM_MAPPINGS                       NUMBER
TIM_SCN_MAP                         RAW(1200)
SCN                                   NUMBER
ORIG_THREAD                         NUMBER

            每隔5 分钟,系统产生一次系统时间标记与scn 的匹配并存入sys.smon_scn_time 表,该表中记录了最近1440个系统时间标记与scn 的匹配记录,由于该表只维护了最近的1440 条记录,因此如果使用as of timestamp 的方式则只能flashback 最近5 天内的数据(假设系统是在持续不断运行并无中断或关机重启之类操作的话)。

            注意理解系统时间标记与scn 的每5 分钟匹配一次这句话,举个例子,比如scn:339988,339989 分别匹配08-05-3013:52:00 和2008-13:57:00,则当你通过as of timestamp 查询08-05-30 13:52:00 或08-05-30 13:56:59 这段时间点内的时间时,oracle 都会将其匹配为scn:339988 到undo 表空间中查找,也就说在这个时间内,不管你指定的时间点是什么,查询返回的都将是08-05-30 13:52:00 这个时刻的数据。

查看SCN 和 timestamp 之间的对应关系:
SQL>select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;

2.4.4.1.5  Flashback Query 函数,存储过程,包,触发器等对象

            Flashback Drop 可以闪回与表相关联的对象, 如果是其他的对象,比如function,procedure,trigger等。 这时候,就需要使用到ALL_SOURCE 表来进行Flashback Query。

先看联机文档对该表的说明:
ALL_SOURCE describes the text source of the stored objects accessible to the current user.

Related Views
DBA_SOURCE describes the text source of all stored objects in the database.
USER_SOURCE describes the text source of the stored objects owned by the current user. This view does not display the OWNER column.

Column
Datatype
NULL
Description
OWNER
VARCHAR2(30)
NOT NULL
Owner of the object
NAME
VARCHAR2(30)
NOT NULL
Name of the object
TYPE
VARCHAR2(12)

Type of object: FUNCTION, JAVA SOURCE, PACKAGE, PACKAGE BODY, PROCEDURE, TRIGGER, TYPE, TYPE BODY
LINE
NUMBER
NOT NULL
Line number of this line of source
TEXT
VARCHAR2(4000)

Text source of the stored object


如果我们误删除了某些对象,如procedure,就可以使用all_source 表进行恢复。

SQL> desc dba_source
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
OWNER                                              VARCHAR2(30)
NAME                                               VARCHAR2(30)
TYPE                                               VARCHAR2(12)
LINE                                               NUMBER
TEXT                                               VARCHAR2(4000)

查看dba_source 的所有type
SQL> select type from dba_source group by type;

TYPE
------------
PROCEDURE
PACKAGE
PACKAGE BODY
TYPE BODY
TRIGGER
FUNCTION
TYPE

7 rows selected.

基于timestamp恢复的语句
SQL>SELECT text
    FROM dba_source
         AS OF TIMESTAMP TO_TIMESTAMP ('XXXXX', 'YYYY-MM-DD HH24:MI:SS')
   WHERE owner = 'XXXX' AND name = '你删除的对象名'
ORDER BY line;


示例:

创建函数:
SQL> CREATE OR REPLACE function getdate return date
as
v_date date;
begin
   select  sysdate into v_date from dual;
   return v_date;
end;
/
Function created.

查询函数:
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.

SQL> select getdate() from dual;
GETDATE()
-------------------
2011-04-07 21:02:09

查询dba_source 表:
SQL> select text from dba_source where name='GETDATE' order by line;

TEXT
--------------------------------------------------------------------------------
function getdate return date
as
  v_date date;
begin
   select  sysdate into v_date from dual;
   return v_date;
end;

7 rows selected.

drop 函数,在查询,记录不存在
SQL> drop function getdate;
Function dropped.

SQL> select text from dba_source where name='GETDATE' order by line;
no rows selected

使用我们的Flashback Query 查询:
SQL> select text from dba_source as of timestamp to_timestamp('2011-04-07 21:02:09','yyyy-mm-dd hh24:mi:ss') where name='GETDATE' order by line;

TEXT
--------------------------------------------------------------------------------
function getdate return date
as
  v_date date;
begin
   select  sysdate into v_date from dual;
   return v_date;
end;

7 rows selected.

            这时候,又查看到了函数的代码,只需要把这些代码重新执行一下就ok了。 其他对象和这个类似。 这里就不演示了。

2.4.4.2  Flashback version Query

            相对于Flashback Query 只能看到某一点的对象状态, Oracle 10g引入的Flashback Version Query可以看到过去某个时间段内,记录是如何发生变化的。 根据这个历史,DBA就可以快速的判断数据是在什么时点发生了错误,进而恢复到之前的状态。

            先看一个伪列 ORA_ROWSCN.  所谓的伪列,就是假的,不存在的数据列,用户创建表时虽然没有指定,但是Oracle为了维护而添加的一些内部字段,这些字段可以像普通文件那样的使用。

            最熟悉的伪列就是 ROWID, 它相当于一个指针,指向记录在磁盘上的位置。ORA_ROWSCN 是Oracle 10g 新增的,暂且把它看作是记录最后一次被修改时的SCN。 Flashback Version Query 就是通过这个伪列来跟踪出记录的变化历史。

举个例子:
SQL> select * from A;
        ID
        ----------
         2
         1
         3
         4

SQL> insert into A values(5);
已创建 1 行。

SQL> select * from A;
        ID
        ----------
         2
         1
         3
         4
         5
SQL> commit;
提交完成。
SQL> select ora_rowscn, id from A;
ORA_ROWSCN       ID
----------             ----------
   1098443          2
   1098443          1
   1098443          3
   1098443          4
   1098443          5

获取更多的历史信息
SQL>Select versions_xid,versions_startscn,versions_endscn,   DECODE(versions_operation,'I','Insert','U','Update','D','Delete', 'Original') "Operation", id from A versions between scn minvalue and maxvalue;

或者
SQL>select xid,commit_scn,commit_timestamp,operation,undo_sql from flashback_transaction_query q where q.xid in(select versions_xid from B versions between scn 413946 and 413959);

VERSIONS_XID VERSIONS_STARTSCN VERSIONS_ENDSCN Operatio    ID
---------------- ----------------- --------------- -------- ----------
05001A0054020000           1099482               Update            3

05001A0054020000           1099482               Delete            3

05001A0054020000           1099482               Delete            2

05001A0054020000           1099482               Delete            1

0400150005020000           1098443                Insert             5
回复 支持 反对

使用道具 举报

16#
 楼主| 发表于 2013-1-22 10:07:53 | 只看该作者
下面我们来讲下伪列, Flashback Version Query 技术其实有很多伪列,但是ORA_ROWSCN是最重要。它记录的是最后一次被修改时的SCN, 注意是被提交的修改。如果没有提交,这个伪列不会发生变化。

            ORA_ROWSCN 缺省是数据块级别的,也就是一个数据块内的所有记录都是一个ORA_ROWSCN,数据块内任意一条记录被修改,这个数据库块内的所有记录的ORA_ROWSCN都会同时改变。上例的查询结果以证明。

            不过我们可以在建表时使用关键字 rowdependencies, 可以改变这种缺省行为,使用这个关键字后,每条记录都有自己的ORA_ROWSCN。

举例:
SQL> create table B (id number(2)) rowdependencies;
表已创建。
SQL> insert into B values(1);
已创建 1 行。
SQL> insert into B values(2);
已创建 1 行
SQL> insert into B values(3);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select ora_rowscn, id from B;
ORA_ROWSCN         ID
---------- ----------
   1100560          1
   1100560          2
   1100560          3

            此处SCN一样,一定很奇怪,这正好说明是最后一次被修改时的SCN,如果没有提交,是不会变的,我们重做一下就清楚了。

SQL> analyze table B compute statistics;
表已分析。
SQL> select ora_rowscn, id from B;
ORA_ROWSCN         ID
---------- ----------
   1100560          1
   1100560          2
   1100560          3

SQL> delete from B;
已删除4行。
SQL> select ora_rowscn, id from B;
未选定行
SQL> insert into B values(1);
已创建 1 行。
SQL> commit;
提交完成。
SQL> insert into B values(2);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select ora_rowscn, id from B;
ORA_ROWSCN         ID
---------- ----------
   1100723          1
   1100729          2

2.4.4.3  Flashback Transaction Query

            Flashback Transaction Query也是使用UNDO信息来实现。利用这个功能可以查看某个事务执行的所有变化,它需要访问flashback_transaction_query 视图,这个视图的XID列代表事务ID,利用这个ID可以区分特定事务发生的所有数据变化。

示例:
SQL> insert into B values(3);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from B;
        ID
       ----------
         1
         2
         3

查看视图,每个事务都对应相同的XID
SQL>Select xid,operation,commit_scn,undo_sql from flashback_transaction_query where xid in (Select versions_xid from B versions between scn minvalue and maxvalue);

或者
SQL>select xid,commit_scn,commit_timestamp,operation,undo_sql from flashback_transaction_query q where q.xid in(select versions_xid from B versions between scn 413946 and 413959);

XID              OPERATION         COMMIT_SCN  UNDO_SQL
-----------------------------------------------------------------------------------------------------


03001C006A020000 DELETE                              1100723
insert into "SYS"."B"("ID") values ('4');

03001C006A020000 DELETE                              1100723
insert into "SYS"."B"("ID") values ('3');

03001C006A020000 DELETE                              1100723
insert into "SYS"."B"("ID") values ('2');
回复 支持 反对

使用道具 举报

17#
 楼主| 发表于 2013-1-22 10:08:20 | 只看该作者
2.4.5 Flashback Table


注意SYS用户不支持闪回,这点前面已经说明过。

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

注意:如果想要对表进行flashback,必须允许表的row movement.
SQL>Alter table table_name row movement;

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

例如:
SQL> select row_movement from user_tables where table_name='C';
ROW_MOVE
--------
ENABLED

要启用或禁止某表row movement,可以通过下列语句:

--启用
SQL> ALTER TABLE table_name ENABLE ROW MOVEMENT;
表已更改。
--禁止
SQL> ALTER TABLE table_name DISABLE ROW MOVEMENT;
表已更改。

举例:
SQL> create table C (id number(2));
表已创建。
SQL> insert into C values(1);
已创建 1 行。
SQL> insert into C values(2);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from c;
        ID
----------
         1
         2

SQL> alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss";
会话已更改。
SQL> select sysdate from dual;
SYSDATE
-------------------
2009-10-15 21:17:47
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
  1103864

删除数据并恢复
SQL> delete from C;
已删除2行。
SQL> commit;
提交完成。
SQL> alter table c enable row movement;
表已更改。
SQL> flashback table c to scn 1103864;
闪回完成。

或者
SQL> flashback table c to timestamp to_timestamp('2009-10-15 21:17:47','yyyy-mm-dd hh24:mi:ss');

SQL> select * from c;
        ID
----------
         1
         2
          
            Flashback table 命令支持同时操作多个表,表名中间以逗号分隔即可,如果你执行一条flashback table命令时同时指定了多个表,要记住单个flashback table 是在同一个事务中,因此这些表的恢复操作要么都成功,要么都失败。

如:
flashback table a,b ,c to scn 1103864;


一些注意事项:
            (1)基于undo 的表恢复,需要注意DDL 操作的影响。修改并提交过数据之后,对表做过DDL 操作,包括:drop/modify 列, move 表, drop 分区(如果有的话), truncate table/partition,这些操作会另undo 表空间中的撤销数据失效,对于执行过这些操作的表应用flashback query 会触发ORA-01466 错误。
            另外一些表结构修改语句虽然并不会影响到undo 表空间中的撤销记录,但有可能因表结构修改导致undo 中重做记录无法应用的情况,比如对于增加了约束,而flashback query 查询出的undo 记录已经不符合新建的约束条件,这个时候直接恢复显然不可能成功,你要么暂时disable 约束,要么通过适当逻辑,对要恢复的数据进行处理之后,再执行恢复。

            (2)基于undo 的表恢复,flashback table 实际上做的也是dml 操作(会在被操作的表上加dml 锁),因此还需要注意triggers 对其的影响,默认情况下,flashback table to scn/timestamp 在执行时会自动disable 掉与其操作表相差的triggers,如果你希望在此期间trigger 能够继续发挥做用,可以在flashback table 后附加 ENABLE TRIGGERS 子句。


2.4.6 Oracle Flashback Data Archive

            在Oracle 11g里又出了一个新特性:Oracle Flashback Data Archive.  在11g的官方文档里搜到了相关内容说明,参考:
            Using Oracle Flashback Technology
                        --Using Flashback Data Archive (Oracle Total Recall)
            http://download.oracle.com/docs/cd/E11882_01/appdev.112/e17125/adfns_flashback.htm#BJFIEJGG
回复 支持 反对

使用道具 举报

18#
 楼主| 发表于 2013-1-22 10:08:52 | 只看该作者
2.4.6.1  Flashback Data Archive 说明


官网的定义如下:
            A Flashback Data Archive provides the ability to track and store transactional changes to a table over its lifetime. A Flashback Data Archive is useful for compliance with record stage policies and audit reports.
            --Flashback Data Archive 在它的有效期内将保存事务改变的信息。
            A Flashback Data Archive consists of one or more tablespaces or parts thereof. You can have multiple Flashback Data Archives. If you are logged on as SYSDBA, you can specify a default Flashback Data Archive for the system. A Flashback Data Archive is configured with retention time. Data archived in the Flashback Data Archive is retained for the retention time.
            -- FDA 包含一个或者多个表空间,我们可以创建多个FDA。 当以sysdba 登陆时,可以指定default FDA。
            By default, flashback archiving is off for any table. You can enable flashback archiving for a table if all of these conditions are true:
            -- 默认情况下,FDA 是关闭的,当具备一下条件时,我们可以启用FDA。

(1).  You have the FLASHBACK ARCHIVE object privilege on the Flashback Data Archive to use for that table.
(2).  The table is neither nested, clustered, temporary, remote, or external.
(3).  The table contains neither LONG nor nested columns.

            After flashback archiving is enabled for a table, you can disable it only if you either have the FLASHBACK ARCHIVE ADMINISTER system privilege or you are logged on as SYSDBA.
            --当FDA 启动以后,只有具有FLASHBACK ARCHIVE ADMINISTER 权限的用户或者用SYSDBA登陆的用户才可以禁用FDA。

            When choosing a Flashback Data Archive for a specific table, consider the data retention requirements for the table and the retention times of the Flashback Data Archives on which you have the FLASHBACK ARCHIVE object privilege.

给用户赋:
SQL> create user dvd identified by dvd default tablespace users temporary tablespace temp;
User created.

SQL> grant resource,connect to dvd;
Grant succeeded.

SQL> grant flashback archive administer to dvd;
Grant succeeded.

SQL> select * from dba_sys_privs where grantee='DVD';

GRANTEE        PRIVILEGE                            ADM
----------------------- ---------------------------------------- ---
DVD            FLASHBACK ARCHIVE ADMINISTER       NO
DVD            UNLIMITED TABLESPACE                NO


          在Oracle 10g中的lashback 包括: flashback version query、flashback transaction query、flashback database、flashback table和flashback drop等特性。
            在这些闪回技术当中,除了Flashback Database(依赖于闪回日志)之外,其他的闪回技术都是依赖于Undo撤销数据,都与数据库初始化参数UNDO_RETENTION密切相关。
            它们是从撤销数据中读取信息来构造旧数据的。这样就有一个限制,就是undo中的信息不能被覆盖。而undo段是循环使用的,只要事务提交,之前的undo信息就可能被覆盖,虽然可以通过 undo_retention等参数来延长undo的存活期,但这个参数会影响所有的事务,设置过大,可能导致undo tablespace快速膨胀。

            Oracle 11g中flashback增加了:Flashback Data Archive 特性。该技术与之前的Flashback的实现机制不同,通过将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和undo区别开来,这样就可以为闪回归档区单独设置存储策略,使之可以闪回到指定时间之前的旧数据而不影响undo策略。并且可以根据需要指定哪些数据库对象需要保存历史变化数据,而不是将数据库中所有对象的变化数据都保存下来,这样可以极大地减少空间需求。
            Flashback Data Archive并不是记录数据库的所有变化,而只是记录了指定表的数据变化。所以,Flashback Data Archive是针对对象的保护,是Flashback Database的有力补充。

            通过Flashback Data Archive,可以查询指定对象的任何时间点(只要满足保护策略)的数据,而且不需要用到undo,这在有审计需要的环境,或者是安全性特别重要的高可用数据库中,是一个非常好的特性。缺点就是如果该表变化很频繁,对空间的要求可能很高。

闪回数据归档区
            闪回数据归档区是闪回数据归档的历史数据存储区域,在一个系统中,可以有一个默认的闪回数据归档区,也可以创建其他许多的闪回数据归档区域。
            每一个闪回数据归档区都可以有一个唯一的名称。同时,每一个闪回数据归档区都对应了一定的数据保留策略。
            例如可以配置归档区FLASHBACK_DATA_ARCHIVE_1中的数据保留期为1年,而归档区FLASHBACK_DATA_ARCHIVE_2的数据保留期为2天或者更短。  以后如果将表放到对应的闪回数据归档区,则就按照该归档区的保留策略来保存历史数据。
            闪回数据归档区是一个逻辑概念,是从一个或者多个表空间中拿出一定的空间,来保存表的修改历史,这样就摆脱了对Undo撤销数据的依赖,不利用undo就可以闪回到归档策略内的任何一个时间点上。

Flashback archive相关数据字典
*_FLASHBACK_ARCHIVE
Displays information about Flashback Data Archive files.
*_FLASHBACK_ARCHIVE_TS
Displays tablespaces of Flashback Data Archive files.
*_FLASHBACK_ARCHIVE_TABLES
Displays information about tables that are enabled for Data Flashback Archive files.

* 代表DBA 或者User。

Flashback archive的后台进程
            Oracle11g为Flashback data archive特性专门引入了一个新的后台进程FBDA,用于将追踪表(traced table,也就是将指定使用flashback data archive的table)的历史变化数据转存到闪回归档区。

SQL> select name,description from v$bgprocess where name='FBDA';
NAME  DESCRIPTION
----- -----------------------------------------------------------
FBDA  Flashback Data Archiver Process



Flashback archive 的限制条件
            (1)Flashback data archive只能在ASSM的tablespace上创建
            (2)Flashback data archive要求必须使用自动undo管理,
                        即 undo_management 参数为auto

2.4.6.2  Flashback Data Archive 的相关操作

2.4.6.2.1 Creating a Flashback Data Archive

            Create a Flashback Data Archive with the CREATE FLASHBACK ARCHIVE statement, specifying:
            (1)Name of the Flashback Data Archive
(2)Name of the first tablespace of the Flashback Data Archive
(3)(Optional) Maximum amount of space that the Flashback Data Archive can use in the first tablespace。The default is unlimited. Unless your space quota on the first tablespace is also unlimited, you must specify this value; otherwise, error ORA-55621 occurs.
(4)Retention time (number of days that Flashback Data Archive data for the table is guaranteed to be stored)

--  创建FDA 时,可以指定以上4个参数,没有没有执行Flashback Archive 的配额,默认为 unlimited。 这里的配额,只的是用户对表空间的配额。

            If you are logged on as SYSDBA, you can also specify that this is the default Flashback Data Archive for the system. If you omit this option, you can still make this Flashback Data Archive the default later .
            -- 如果以SYSDBA 登陆,还可以指定default Flashback Data Archive。 如果没有指定,也可以通过alter flashback archive 命令来指定。

示例:

(1). 先创建几个测试的表空间

SQL> create tablespace FDA1 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA01.dbf' size 100M;
Tablespace created.

SQL> create tablespace FDA2 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA02.dbf' size 100M;
Tablespace created.

SQL> create tablespace FDA3 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA03.dbf' size 100M;
Tablespace created.

SQL> create tablespace FDA4 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA04.dbf' size 100M;
Tablespace created.

(2). 创建一个默认的Flashback Archive, 配额为10M,数据保留期为1年

SQL> create flashback archive default fla1 tablespace fda1 quota 10M retention 1 year;

默认的Flashback Archive 只能有一个:
SQL> create flashback archive default fla3 tablespace fda1 quota 10M retention 1 year;
create flashback archive default fla3 tablespace fda1 quota 10M retention 1 year
                                                 *
ERROR at line 1:
ORA-55609: Attempt to create duplicate default Flashback Archive

这里报错了,我们可以是使用alter flashback 来修改默认的Flashback Archive.

(3)  创建一个Flashback Archive fla2,使用默认配额unlimited。 retention 为2 年。

SQL> create flashback archive fla2 tablespace fda2 retention 2 year;
Flashback archive created.

            根据官网的说法,这种情况下,用户对该表空间的配额也必须为ulimited。 否则就会报错ORA-55621。

测试一下:

SQL> conn / as sysdba;
Connected.

SQL> revoke unlimited tablespace from dvd;
Revoke succeeded.

SQL> alter user dvd quota 10m on fda4;
User altered.

SQL> conn dvd/dvd;
Connected.

SQL> create flashback archive fla5 tablespace fda4 retention 1 day;
create flashback archive fla5 tablespace fda4 retention 1 day
                                         *
ERROR at line 1:
ORA-55621: User quota on tablespace "FDA4" is not enough for Flashback Archive

报错。

修改用户的配合,在创建,成功:

SQL> conn / as sysdba;
Connected.

SQL> grant unlimited tablespace to dvd;
Grant succeeded.

SQL> conn dvd/dvd;
Connected.

SQL> create flashback archive fla5 tablespace fda4 retention 1 day;
Flashback archive created.

2.4.6.2.2  Altering a Flashback Data Archive

With the ALTER FLASHBACK ARCHIVE statement, you can:
-- 使用alter flashback archive 可以修改如下内容:
            (1)Change the retention time of a Flashback Data Archive
            (2)Purge some or all of its data
            (3)Add, modify, and remove tablespaces

Note:
            Removing all tablespaces of a Flashback Data Archive causes an error.
            If you are logged on as SYSDBA, you can also use the ALTER FLASHBACK ARCHIVE statement to make a specific file the default Flashback Data Archive for the system.
            -- 不能移除Flashback Data Archive里的所有表空间。 否则报错。 如果用sysdba 登陆,可以修改默认的Flashback archive。
回复 支持 反对

使用道具 举报

19#
 楼主| 发表于 2013-1-22 10:09:20 | 只看该作者
示例:
2.2.1  将Flashback Data Archive 修改为default FA

先用我们具有flashback archive administer 权限的用户试试:
SQL> conn dvd/dvd;
Connected.
SQL> alter flashback archive fla1 set default;
alter flashback archive fla1 set default
*
ERROR at line 1:
ORA-55611: No privilege to manage default Flashback Archive

报错,没有权限,用sysdba 测试成功:
SQL> conn / as sysdba;
Connected.
SQL> alter flashback archive fla1 set default;

Flashback archive altered.

注意一点,只能有一个默认的Flashback archive.

SQL> select flashback_archive_name name, status  from dba_flashback_archive;
NAME       STATUS
---------- -------
FLA1       DEFAULT
FLA2

当前默认的Flashback Archive 是FLA1,我们将默认改成FLA2,在查看:
SQL> alter flashback archive fla2 set default;
Flashback archive altered.

SQL>  select flashback_archive_name name, status  from dba_flashback_archive;
NAME       STATUS
---------- -------
FLA1
FLA2       DEFAULT

2.2.2  为已经存在的Flashback Archive 添加表空间,并指定配额

SQL> alter flashback archive fla1 add tablespace fda3 quota 20M;
Flashback archive altered.

2.2.3 为已经存在的Flashback Archive 添加表空间,不指定配额,即需要多少用多少空间

SQL>  alter flashback archive fla1 add tablespace fda4;
Flashback archive altered.

2.2.4  修改已经存在的Flashback Archive的配额
SQL> alter flashback archive fla1 modify tablespace fda1 quota 20m;
Flashback archive altered.

2.2.5  修改配额不受限制
SQL> alter flashback archive fla1 modify tablespace fda1;
Flashback archive altered.

2.2.6 修改Flashback Archive 的retention time
SQL> alter flashback archive fla1 modify retention 2 year;
Flashback archive altered.

SQL> alter flashback archive fla1 modify retention 1 month;
Flashback archive altered.

SQL> alter flashback archive fla1 modify retention 2 month;
Flashback archive altered.

SQL> alter flashback archive fla1 modify retention 2 day;
Flashback archive altered.

SQL> alter flashback archive fla1 modify retention 1 day;
Flashback archive altered.

2.2.7  将表空间从Flashback Archive中移除

SQL> alter flashback archive fla1 remove tablespace fda4;
Flashback archive altered.

-- 注意,这里移除的仅仅是Flashback Archive中的信息,表空间不会被删除。

2.2.8  清空Flashback Archive中的所有历史记录

SQL> alter flashback archive fla1 purge all;
Flashback archive altered.

2.2.9 清空Flashback Archive 中超过1天的历史数据
SQL> alter flashback archive fla1 purge before timestamp (systimestamp - interval '1' day);
Flashback archive altered.

2.2.10  清空Flashback Archive 中指定SCN 之前的所有历史数据
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1315755078

SQL> alter flashback archive fla1 purge before scn  1315755078;
Flashback archive altered.

我这里只是演示一个SCN。 具体要结合自己的情况。

2.4.6.2.3  Dropping a Flashback Data Archive

            Drop a Flashback Data Archive with the DROP FLASHBACK ARCHIVE statement. Dropping a Flashback Data Archive deletes its historical data, but does not drop its tablespaces.
--  删除Flashback Archive 不会删除相应的表空间

示例:
SQL> DROP FLASHBACK ARCHIVE fla2;
Flashback archive dropped.

SQL>  select flashback_archive_name name, status  from dba_flashback_archive;
NAME       STATUS
---------- -------
FLA1

2.4.6.2.4  Specifying the Default Flashback Data Archive

            By default, the system has no default Flashback Data Archive. If you are logged on as SYSDBA, you can specify default Flashback Data Archive in either of these ways:
            默认情况下,没有default Flashback Data Archive. 当以sysdba 登陆之后,就可以指定它。

2.4.1 修改已经存在的Flashback Archive 为default
SQL> alter flashback archive fla1 set default;
Flashback archive altered.

SQL> alter flashback archive fla10 set default;
alter flashback archive fla10 set default
*
ERROR at line 1:
ORA-55605: Incorrect Flashback Archive is specified

如果指定的Flashback 不存在,就报错。

2.4.2 在创建Flashback Data Archive 时,指定default
SQL>create flashback archive default fla2 tablespace tbs1 quota 10m retention 1 year;

            The default Flashback Data Archive for the system is the default Flashback Data Archive for every user who does not have his or her own default Flashback Data Archive.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-11-24 20:39 , Processed in 0.106221 second(s), 19 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表