`
liuzhaomin
  • 浏览: 204333 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论
阅读更多

9i的闪回查询特性:

闪回功能依赖的于回滚段中存储的数据前镜像 ,在9前版本中,通常只要事物提交后,前镜像数据就可以被覆盖,

空间可以重用;9中引入了自动回滚段管理,可以通过调整UNDO_RETENTION参数来设置数据库UNDO信息的保留时间,

只要前镜像没有被覆盖,那么闪回就是可能的,但要注意,UNDO信息的保留还同UNDO表空间的空间有关,如空间紧张,

为了满足事物需要,非活动的前镜像信息是可以被覆盖的

 

语法:as of scn(timestamp) expr

一,测试:

SQL> create table solo as select * from dba_users;

 

表已创建。

 

SQL> select count(*)from solo;

 

  COUNT(*)

----------

        21

 

SQL> select systimestamp from dual;

 

SYSTIMESTAMP

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

26-7月 -08 10.50.46.060000 上午 +08:00

 

SQL> delete from solo where  rownum<3;

 

已删除2行。

 

SQL> commit;

 

提交完成。

 

SQL> select count(*)from solo;

 

  COUNT(*)

----------

        19

SQL>  select count(*) from solo as of timestamp(systimestamp -interval '480' second);

 

  COUNT(*)

----------

        21

 

SQL> col scn for 9999999999999999;

SQL> select dbms_flashback.get_system_change_number scn from dual;

 

              SCN

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

           604268

SQL> select count(*)from solo as of scn 604000;

 

  COUNT(*)

----------

        21

 

案例:

某日某人误删除了部分重要数据,并且已经提交,需要恢复.由于是9i,可以尝试使用flashback query闪回数据

首先确认数据库的scn变化,通过v$archived_log视图查询:

select NAME,FIRST_CHANGE#,NEXT_CHANGE#, FIRST_TIME from v$archived_log;

略.....

 

SQL> select dbms_flashback.get_system_change_number scn from dual;

 

              SCN

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

           605366

 

SQL> select count(*)from solo;

 

  COUNT(*)

----------

        19

SQL> create table solo_recov as select * from solo where 1=0;

 

表已创建。

 

尝试多个scn,获取最佳值

SQL> select count(*)from solo as of scn 604000;

 

  COUNT(*)

----------

        21

SQL> insert into solo_recov select  * from solo as of scn 604000;

 

已创建21行。

 

SQL> commit;

 

提交完成。

 

SQL> select count(*)from solo_recov;

 

  COUNT(*)

----------

        21

SQL> drop table solo;

 

表已删除。

SQL> alter table solo_recov rename to  solo;

 

表已更改。

 

二,SMON_SCN_TIME与闪回查询

在9i中,SMON_SCN_TIME是oracle数据库的系统表,每5分钟更新一次主张表,记录一个时间戳(timestamp)和当前的SCN,这个表供保存1440条记录,

也就是5天的信息,通过这个表,数据库可以对5天之内的SCN和时间进行粗略的对应和转换

SMON_SCN_TIME是数据库的一个内部表,在不同版本都可能变更这个表的内容和作用

字段项:

TIME_MP,代表最新的scn对应的时间,在9中,此时间取自系统的内核时间

TIME_DP,则代表TIME_MP转换后的系统时间,这个时间是用户可读的

SCN_WRP,代表SCN的高位

SCN_BAS,代表SCN的低位

 

 

在10g中,SMON_SCN_TIME最多保存144000条记录,平均每3秒一次的数据更新

10前通过SMON来获取和记录SCN信息的,10开始,LGWR首先会在SGA中记录SCN与时间的映射关系(由于LGWR至少每3秒就会被激活1次,

所以现在SMON_SCN_TIME能够支持大于3秒的闪回)

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

SQL> select sysdate from dual;

 

SYSDATE

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

2008-07-26 12:10:12

SQL> create table solo_li (c1 number);

 

表已创建。

 

SQL> insert into solo_li values(1);

 

已创建 1 行。

 

SQL> commit;

 

SQL> select dbms_flashback.get_system_change_number scn from dual;

 

 

SQL> select  * from solo_li as of scn 1249154;

 

从中取出当前的最大的一条记录:

SQL>  select * from (select  * from smon_scn_time order by time_mp desc)

  2  where rownum<2;

 

    THREAD    TIME_MP TIME_DP                SCN_WRP    SCN_BAS NUM_MAPPINGS

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

TIM_SCN_MAP

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

              SCN ORIG_THREAD

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

         0  661088723 2008-07-26 11:45:23          0     607154           86

D7696727E243090000004900DA696727E343090000007634E0696727ED43090000009107E3696727

EE43090000000000E6696727EF4309000000C99FE9696727F043090000000FD8EC696727F1430900

000060C7F2696727F44309000000CDA5F5696727F543090000003158F8696727F6430900000029D0

FB696727F743090

           607154           0

 

通过SCN_WRP=0 和SCN_BAS=607154 可以计算出这两者代表的SCN

SCN=0*65536*65536 + 607154 =607154 

此记录和获得SCN一致

 

三,10g中SCN与时间的映射与转换

提供了2个新的函数对于SCN和时间进行转换,scn_to_timestamp 和Timestamp_to_scn,在10g前一般通过logminer分析日志获得

用法:

SQL> select dbms_flashback.get_system_change_number scn from dual;

 

            SCN

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

         609283

 

SQL> select scn_to_timestamp(609283) scn from dual;

 

SCN

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

26-7月 -08 12.24.33.000000000 下午

 

SQL> select timestamp_to_scn(scn_to_timestamp(609283)) scn from dual;

 

            SCN

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

         609268

 

 

注意:这2个函数的转换,正是依赖于smon_scn_time表,能够转换的最小SCN也就是这个表的最小记录

1,SQL> select  scn_wrp*4294967296 +scn_bas scn from smon_scn_time

  2  where time_mp=(select min(time_mp) from smon_scn_time);

 

            SCN

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

              4

SQL> select scn_to_timestamp(4) from dual;

 

SCN_TO_TIMESTAMP(4)

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

17-4月 -07 03.34.19.000000000 上午

 

即使比这个SCN小1的SCN也不能在转换,因为表smon_scn_time没有相应的映射记录

SQL> select scn_to_timestamp(3) from dual;

select scn_to_timestamp(3) from dual

       *

第 1 行出现错误:

ORA-08181: 指定的编号不是有效的系统更改号

ORA-06512: 在 "SYS.SCN_TO_TIMESTAMP", line 1

 

2,在看时间戳的转换,首先获得表中最小的时间戳

SQL> select THREAD,TIME_MP,TIME_DP,SCN_WRP,SCN_BAS,SCN_WRP*65536*65536+SCN_BAS scn

  2  from  smon_scn_time

  3  where time_mp=(select min(time_mp) from smon_scn_time);

 

    THREAD    TIME_MP TIME_DP                SCN_WRP    SCN_BAS             SCN

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

         0  620105659 2007-04-17 03:34:19          0          4               4

SQL>  select timestamp_to_scn(to_timestamp('2007-04-17 03:34:19','yyyy=mm-dd hh24:mi:ss'))

  2  from dual;

 

TIMESTAMP_TO_SCN(TO_TIMESTAMP('2007-04-1703:34:19','YYYY=MM-DDHH24:MI:SS'))

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

                                                                          4

 

即使在小1秒,也是无法转换的

SQL> select timestamp_to_scn(to_timestamp('2007-04-17 03:34:18','yyyy=mm-dd hh24:mi:ss'))

  2   from dual;

select timestamp_to_scn(to_timestamp('2007-04-17 03:34:18','yyyy=mm-dd hh24:mi:ss'))

       *

第 1 行出现错误:

ORA-08180: 未找到基于指定时间的快照

ORA-06512: 在 "SYS.TIMESTAMP_TO_SCN", line 1

 

四,10g闪回特性

1,数据库级闪回

启用闪回功能后,数据库会将发生变化的数据块的前镜像写入闪回日志文件中,在进行数据库闪回时,这些数据块可以被直接复制回来以满足

数据库的恢复需求,同时redo log可以被应用以辅助数据恢复到更精确的时间点,从而极大地缩短了恢复时间

闪回数据库的日志文件不是由传统的lgwr进程写入,而是由一个称作rvwr的新过程写入

要使用这个特性,数据库必须采用Archivelog模式,而且必须配置为支持flashback database命令

闪回数据库的特性缺省是关闭的,启用闪回数据库特性需要在mount状态下进行:

SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup mount

ORACLE 例程已经启动。

 

Total System Global Area  612368384 bytes

Fixed Size                  1292036 bytes

Variable Size             209717500 bytes

Database Buffers          394264576 bytes

Redo Buffers                7094272 bytes

数据库装载完毕。

SQL> alter database archivelog;

 

SQL> alter database flashback on;

 

数据库已更改。

 

SQL> alter database open;

 

数据库已更改。

SQL> select dbid,name,flashback_on,current_scn from v$database;

 

      DBID NAME      FLASHBACK_ON       CURRENT_SCN

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

1188804513 ORCL      YES                     612351

 

初始化参数b_flashback_retention_target用于定义一个时间的上限,设置数据库能够闪回的最大时间上限,单位分钟,

这个参数只是一个期望值,确切地闪回时间取决于闪回区保留的闪回数据。

SQL> show parameter db_flashback_retention_target

 

NAME                                 TYPE        VALUE

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

db_flashback_retention_target        integer     1440

 

测试:

SQL>  select sysdate from dual;

 

SYSDATE

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

2008-07-26 13:13:48

 

SQL> select count(*) from solo;

 

  COUNT(*)

----------

        19

 

SQL> truncate table solo; -----truncate的数据是不能使用闪回查询恢复的,此时可以通过闪回数据库进行恢复

 

表被截断。

 

SQL> select sysdate from dual;

 

SYSDATE

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

2008-07-26 13:14:28

 

SQL> select to_char(OLDEST_FLASHBACK_TIME,'yyyy-mm-dd hh24:mi:ss')

  2  from v$flashback_database_log;        ------查询可以闪回的最早时间点

 

SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup mount;   -----闪回需要在mount下进行

 

 

SQL> flashback database to timestamp

  2  to_timestamp('2008-07-26 13:13:48','yyyy-mm-dd hh24:mi:ss');

 

闪回完成。

SQL> alter database open resetlogs;

数据库已更改。

SQL> select count(*) from solo;

 

  COUNT(*)

----------

        19

 

一旦Resetlogs之后,就不能再flashback至resetlogs之前的时间点

 

五,flashback drop 功能

在执行drop操作时,先在oracle不是真正删除它,而是将该对象自动放入回收站recyclebin,对于一个对象的删除,其实仅仅就是进行了类似

重命名的操作,所谓回收站,是一个虚拟的容器,用于存放所有被删除的对象。在回收站中,被删除的对象将占有创建时同样的空间,甚至可以对已经删除的表查询(非system tablespace),如果该表上有索引或者触发器等也一并放到回收站,当闪回表后,索引和触发器等也能闪回来。

 

测试:

SQL> create table test as select  * from emp;

 

表已创建。

SQL> drop table  test;

 

表已删除。

 

SQL> show recyclebin

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

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

EMP              BIN$ep4QZw7GSBqHS6/3MS8MYg==$0 TABLE        2008-07-27:22:30:13

EMP              BIN$nb6F7NUNRoeVvRWifgVvoQ==$0 TABLE        2008-07-27:22:27:54

TEST             BIN$6AHHkcjFRWq/n5fn8T134A==$0 TABLE        2008-07-28:09:53:47

 

sys 查询回收站信息:(可以看到表上的索引信息)

SELECT owner, original_name, object_name, 

       type, ts_name, droptime, related, space

FROM dba_recyclebin

WHERE can_undrop = 'YES';

 

用户查询回收站信息:

SELECT original_name, object_name, 

       type, ts_name, droptime, related, space

FROM user_recyclebin

WHERE can_undrop = 'YES';

 

SQL> flashback table test to before drop;

 

闪回完成。

 

如果这里闪回前有同名表产生,在闪回时,会抱错原始名称已被现有对象使用

SQL> create table emp as select  * from dept;

 

表已创建。

 

SQL> flashback table emp to before drop;

flashback table emp to before drop

*

第 1 行出现错误:

ORA-38312: 原始名称已被现有对象使用

 

 

SQL> flashback table emp to before drop rename to a;

 

闪回完成。

 

 

 

SQL> desc test;

 名称                                      是否为空? 类型

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

 EMPNO                                              NUMBER(4)

 ENAME                                              VARCHAR2(10)

 JOB                                                VARCHAR2(9)

 MGR                                                NUMBER(4)

 HIREDATE                                           DATE

 SAL                                                NUMBER(7,2)

 COMM                                               NUMBER(7,2)

 DEPTNO                                             NUMBER(2)

SQL> drop table test purge;---彻底删除表,不需要放在数据库回收站内

 

表已删除。

 

SQL> show recyclebin

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

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

EMP              BIN$ep4QZw7GSBqHS6/3MS8MYg==$0 TABLE        2008-07-27:22:30:13

EMP              BIN$nb6F7NUNRoeVvRWifgVvoQ==$0 TABLE        2008-07-27:22:27:54

 

要释放空间,您需要使用以下命令清空回收站

PURGE RECYCLEBIN; 

 

清除表空间 USERS 的回收站中的所有对象。

可以执行:  

PURGE TABLESPACE USERS

限定只清除特定的用户:  

PURGE TABLESPACE USERS USER SCOTT;

DBA 可以使用以下命令清除任何表空间中的所有对象  

PURGE DBA_RECYCLEBIN;

 

<回收站>

所谓的回收站,是一个虚拟的容器,用于存放所有被删除的对象。在回收站中,被删除的对象将占用创建时的同样的空间,

你甚至还可以对已经删除的表查询,也可以利用flashback功能来恢复它, 这个就是flashback drop功能。实际上,oracle的回收站从原理上来说就是一个数据字典表

 

这个功能虽然可以极大的简化误drop导致的恢复操作(不支持sys的操作,但是其他dba的drop操作还是会放到回收站里) 

但是长时间的积累可能会导致大量的空间占用(虽然Oracle具有自己的清理机制),

很多时候我们需要手工介入去清理回收站。

注意:普通用户删除了表,dba在dba_recyclebin 会看到该表以及索引(所以当用户闪回表后,索引信息也将恢复)

sys用户删除了普通用户的表(非system表空间的表),也会放在属主的回收站里)

 

 

大量累计的空间占用

SQL> col owner for a12

SQL> select owner,object_name,CREATETIME,DROPTIME from dba_recyclebin  

 order by droptime;

 

不同用户在回收站的对象

SQL> select owner,count(*) from dba_recyclebin group by owner;    

 

我们可以指定删除某些特定对象

SQL> purge table common.T_SERVICE_CODE_INFO;

 

指定清除某个表空间的所有回收站对象

SQL> purge tablespace common; 

 

5.以SYSDBA身份可以清除所有回收站对象

 

SQL> purge dba_recyclebin;

 

在Oracle10gR2中,recyclebin变成了一个常规参数,可以在session/system级动态修改:

SQL> show parameter recyclebin

 

NAME                                 TYPE        VALUE

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

recyclebin                           string      on

SQL> alter session set recyclebin=off;

 

会话已更改。

 

SQL> show parameter recyclebin

 

NAME                                 TYPE        VALUE

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

recyclebin                           string      OFF

 

SQL> alter system set recyclebin= on;

系统已更改。

SQL> alter system set recyclebin= off;

系统已更改。

 

 

eg:

SQL> conn scott/tiger

已连接。

SQL> show parameter recyclebin

 

NAME                                 TYPE        VALUE

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

recyclebin                           string      ON

SQL> alter session set recyclebin=off;

 

会话已更改。

 

SQL> show recyclebin

SQL> drop table solo_li;

 

表已删除。

 

SQL> show recyclebin

SQL> alter session set  recyclebin=on;

 

会话已更改。

 

SQL> show recyclebin

SQL> drop table bonus ;

 

表已删除。

 

SQL> show recyclebin

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

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

 

BONUS            BIN$yx1RUGjfTeCkAVgxGGwu/g==$0 TABLE        2009-07-09:12:50:33

 

10g 新特性 Recyclebin 空间的自动清理

 

放入Recyclebin中的表并不是永久存在的,当表空间被回收站数据完全占满,以至于必须扩展数据文件来容纳更多数据时,对象以先进先出的方式从回收站中自动清除。在删除表之前,相关对象(如索引)被删除。

    (注意: 如果表空间 autoextent,会先自动清除,再扩展。)

 

    同样,空间压力可能由特定表空间定义的用户限额而引起。表空间可能有足够的空余空间,但用户可能将其在该表空间中所分配的部分用完了。在这种情况下,Oracle 自动清除该表空间中属于该用户的对象。

 

创建一个表空间和一个用户。

SQL> create tablespace testts datafile '' size 1M;

SQL> create user test identified by test default tablespace testts temporary tablespace temp;

SQL> grant connect  to test;

SQL> grant resource to test;

SQL> grant dba to test;

在表空间中创建表:

      SQL> conn test/test

      SQL> create table sysobj as select * from dba_tables;

 

      SQL> select bytes from dba_segments where segment_name='SYSOBJ';

 

          BYTES

       ----------

         458752

 

      SQL> create table sysobj2 as select * from dba_tables;

 

      SQL> create table sysobj3 as select * from dba_tables;

      create table sysobj3 as select * from dba_tables

                                      *

      第 1 行出现错误:

      ORA-01652: 无法通过 8 (在表空间 TESTTS 中) 扩展 temp 段

因为这里空间只有1M,这时空间不够了,我们先删除一个表。

 

      SQL> drop table sysobj2;

 SQL> select * from recyclebin;

 

      OBJECT_NAME                    ORIGINAL_NAME                    OPERATION

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

TYPE                      TS_NAME                        CREATETIME

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

DROPTIME               DROPSCN PARTITION_NAME                   CAN CAN

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

   RELATED BASE_OBJECT PURGE_OBJECT      SPACE

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

BIN$PJ6U2b0JRVWgmdmQ7+5vXg==$0 SYSOBJ2                          DROP

TABLE                     TESTTS                         2008-07-13:23:43:50

2008-07-13:23:44:46     753663                                  YES YES

     52838       52838        52838         56

 

再来创建表:

 SQL> create table sysobj3 as select * from dba_tables;

 

 

    SQL> select * from tab;

 

     TNAME                          TABTYPE  CLUSTERID

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

     SYSOBJ                         TABLE

     SYSOBJ3                        TABLE

 

这时我们可以看到,recyclebin中的表不见了,空间回收了!

SQL> select * from recyclebin;

未选定行

 

 

 

六,flashback version query

SQL> create table solo_jh as select username from dba_users;

 

表已创建。

 

SQL> select  * from solo_jh;

 

USERNAME

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

MGMT_VIEW

SYS

SYSTEM

......

 

已选择21行。

SQL> delete from solo_jh where username='SCOTT';

 

已删除 1 行。

 

SQL> commit;

 

提交完成。

 

SQL> delete from solo_jh where username='XDB';

 

已删除 1 行。

 

SQL> commit;

 

提交完成。

 

SQL> delete from solo_jh where username='MDDATA';

 

已删除 1 行。

 

SQL> commit;

 

提交完成。

SQL> select  * from solo_jh;

 

USERNAME

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

MGMT_VIEW

SYS

SYSTEM

DBSNMP

SYSMAN

......

 

已选择18行。

 

SQL> commit;

 

提交完成。

SQL> insert into solo_jh values('lijiaohua');

 

已创建 1 行。

 

SQL> commit;

 

提交完成。

对于这种复杂密集数据操作,通过简单的闪回查询时很难恢复到正确的数据版本的

可以通过闪回版本察看不同事物引起的数据库变更 或者flashback_transaction_query试图

 

已选择25行。

 

七,通过flashback transaction query进行事务撤销

基于上面提到的flashback version query的恢复,就是flashback transaction query

测试:

从上节查询得到的XID,来尝试恢复XID=*******的事务,通过undo语句可以撤销事务

SQL> select undo_sql from flashback_transaction_query

  2  where TABLE_NAME='SOLO_JH';

 

UNDO_SQL

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

 

insert into "SYS"."SOLO_JH"("USERNAME") values ('SCOTT');

delete from "SYS"."SOLO_JH" where ROWID = 'AAAMm5AABAAAO7iAAX';

insert into "SYS"."SOLO_JH"("USERNAME") values ('XDB');

 

SQL> delete from "SYS"."SOLO_JH" where ROWID = 'AAAMo2AABAAAOwSAAV';

 

已删除 1 行。

 

 

SQL> select undo_sql from flashback_transaction_query

  2  where xid='0A0012003F010000';

UNDO_SQL

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

insert into "SYS"."SOLO_JH"("USERNAME") values ('SCOTT');-----此处就是Delete操作的反操作语句,运行之撤销事务

 

SQL> insert into "SYS"."SOLO_JH"("USERNAME") values ('SCOTT');

 

已创建 1 行。

 

八,闪回表(非sys 用户) 

闪回表准许将数据恢复到过去的某个时间点,而不必像以前一样采用基于时间点的恢复

10g的flashback table 有如下特性:

在线操作 

恢复到指定时间点或者SCN的任何数据

自动恢复相关属性,如索引,触发器

满足分布式的一致性

满足数据一致性,所有相关对象将自动一致

语法:

alter table table_name enable row movement;

flashback table table_name to timestamp|scn <timestamp|scn>;

------如果需要flashback一个数据表,需要具有flashback any table的系统权限或者是该表的flashback对象权限

同时还需要拥有该表的select,insert,delete,alter 权限,由于flashback table技术使用dml操作去恢复数据,

不能保证rowid不变,所以闪回之前还需要启动表的row movement特性

同时不能将表恢复到改变表结构的DDL操作之前(----这里注意闪回时用到临时表空间) 

grant flashback any table to scott(授予某用户权限)

 

(sys 可以闪回其他用户的对象;对象属主可以闪回该拥有的对象;

select dbms_flashback.get_system_change_number scn from dual;---dba可以查询的内容)

 

测试:

SQL> conn scott/scott

已连接。

SQL> drop table solo_li;

 

表已删除。

 

SQL> create table solo_li as select username from dba_users;

 

表已创建。

 

SQL> select dbms_flashback.get_system_change_number scn from dual;(dba查询) 

 

            SCN

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

         621351

 

SQL> delete from solo_li where username='SCOTT';

 

已删除 1 行。

 

SQL>  alter table solo_li  enable row movement;

 

表已更改。

 

SQL> flashback table solo_li  to scn 621351;

 

闪回完成。

 

SQL> select count(*) from solo_li;

 

  COUNT(*)

----------

        21

 

<闪回区的空间监控>

SQL> select * from V$FLASH_RECOVERY_AREA_USAGE;

用以监控闪回区空间的耗用情况

每次RMAN在闪回区(flash recovery area)创建文件时,会同时更新可删除文件列表。当闪回区存在空间压力时,

Oracle会自动从闪回区中删除废弃文件,当没有更多空间可以释放时,Oracle会给出空间压力警报。

当空间使用达到100%,数据库将会因为无法归档等原因挂起。

 

闪回区的大小由:db_recovery_file_dest_size 参数指定。

路径由: db_recovery_file_dest 参赛指定。

 

SQL> show parameter db_recovery

NAME                                 TYPE                 VALUE

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

db_recovery_file_dest                string               C:\oracle\product\10.2.0\flash

                                                          _recovery_area

db_recovery_file_dest_size           big integer          2G

 

SQL> alter system set  db_recovery_file_dest_size=1500m;

 

系统已更改。

SQL> show parameter db_recovery

 

NAME                                 TYPE

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

VALUE

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

db_recovery_file_dest                string

D:\oracle\product\10.2.0\flash

_recovery_area

db_recovery_file_dest_size           big integer

1500M

 

当然如果我们想要了解具体是哪些文件,这就需要借助另外一个视图:V$ASM_FILE。

这个视图需要从ASM实例来进行查询:

SQL> select file_number,block_size,blocks,bytes,type from v$asm_file;

从这里我们可以很容易的看到不同文件所使用的不同BLOCK_SIZE,Oracle通过不同的块大小来优化存储及访问。

 

<闪回日志的删除>

 1.- First of all we need to check if there is any guaranteed restore point defined:

 

select name,scn,time,database_incarnation#,guarantee_flashback_database,storage_size from v$restore_point;

 

 

 2.- Remove all the restore points

 

     Drop restore point <name>;

 

 3.- Check how much space is used before turning off Flashback 

 

    select * from v$flash_recovery_area_usage;

 

 4.- ALTER DATABASE FLASHBACK OFF;

 

 

 5.-  Now you can delete the Flashback logs manually

 

 

 6.- ALTER DATABASE FLASHBACK ON

 7.- Check that there are no flashback logs before turning back on

 

       select * from v$flash_recovery_area_usage;

 

 

 

 

闪回日志丢失,导致数据库无法打开:

SQL> shutdown immediate

cd $ORACLE_BASE/flash_recovry_area/solo/flashback/

rm  *

 

 

SQL> startup

ORACLE 例程已经启动。

 

Total System Global Area  289406976 bytes

Fixed Size                  1248576 bytes

Variable Size             142607040 bytes

Database Buffers          138412032 bytes

Redo Buffers                7139328 bytes

数据库装载完毕。

ORA-38760: 此数据库实例无法启用闪回数据库

 

The alert log would have error as shown below:

Sun Apr 04 20:09:44 2010

Errors in file c:\admin\solo\bdump\solo_rvwr_2256.trc:

ORA-38701: Flashback database log 1 seq 1 thread 1: "C:\FLASH_RECOVERY_AREA\SOLO\FLASHBACK\O1_MF_5VJZSPQX_.FLB"

ORA-27041: unable to open file

OSD-04002: 无法打开文件

O/S-Error: (OS 2) 系统找不到指定的文件。

 

 

SQL> alter database flashback off;

 

数据库已更改。

 

 

Sun Apr 04 20:12:30 2010

Errors in file c:\admin\solo\udump\solo_ora_1480.trc:

 

Control autobackup written to DISK device

handle 'C:\FLASH_RECOVERY_AREA\SOLO\AUTOBACKUP\2010_04_04\O1_MF_S_715463523_5VK0KD3X_.BKP'

Completed: alter database flashback off

 

 

SQL> alter database flashback on;

 

数据库已更改。

 

SQL> alter database open;

 

数据库已更改。

 

<闪回丢失的方案>

1.select flashback_on from v$database;base;

 

FLASHBACK_ON

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

YES

 

 

SQL> show parameter flash

 

NAME                                 TYPE        VALUE

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

db_flashback_retention_target        integer     1440

SQL> create user fl identified by fl ;

 

User created.

 

SQL> grant connect,resource to fl;

 

Grant succeeded.

 

SQL> conn fl/fl

Connected.

SQL> create table  fl_test(a int);

 

Table created.

 

SQL> desc fl_test

 Name                                      Null?    Type

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

 A                                                  NUMBER(38)

 

SQL> insert into fl_test values(100);

 

1 row created.

 

SQL> commit;

 

Commit complete.

 

 

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

 

Session altered.

 

SQL> select sysdate from dual;

 

SYSDATE

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

2010-06-25 16:22:36

 

2.SQL> conn sys as sysdba

Enter password: ******

Connected.

SQL> drop user fl cascade;

 

User dropped.

 

SQL> conn fl/fl

ERROR:

ORA-01017: invalid username/password; logon denied

 

 

Warning: You are no longer connected to ORACLE.

SQL> conn sys as sysdba

Enter password: ******

Connected.

SQL> desc fl.fl_test

ERROR:

ORA-04043: object fl.fl_test does not exist

 

 

3.SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

 

Total System Global Area  603979776 bytes

Fixed Size                  1268872 bytes

Variable Size             335545208 bytes

Database Buffers          260046848 bytes

Redo Buffers                7118848 bytes

Database mounted.

SQL> flashback database to timestamp to_date('2010-06-25 16:22:36','yyyy-mm-dd hh24:mi:ss');

 

Flashback complete.

 

SQL> alter database open read only;

 

Database altered.

 

SQL> desc fl.fl_test

 Name                                      Null?    Type

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

 A                                                  NUMBER(38)

 

 

SQL> select count(*) from scott.emp;

 

  COUNT(*)

----------

        14

 

SQL> ho exp fl/fl file=/u01/app/oracle/bak/fl.dmp owner=fl

 

Export: Release 10.2.0.4.0 - Production on Fri Jun 25 16:33:23 2010

 

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

 

 

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Real Application Testing options

Export done in US7ASCII character set and AL16UTF16 NCHAR character set

server uses WE8ISO8859P1 character set (possible charset conversion)

. exporting pre-schema procedural objects and actions

. exporting foreign function library names for user FL 

. exporting PUBLIC type synonyms

. exporting private type synonyms

. exporting object type definitions for user FL 

About to export FL's objects ...

. exporting database links

. exporting sequence numbers

. exporting cluster definitions

. about to export FL's tables via Conventional Path ...

. . exporting table                        FL_TEST          1 rows exported

. exporting synonyms

. exporting views

. exporting stored procedures

. exporting operators

. exporting referential integrity constraints

. exporting triggers

. exporting indextypes

. exporting bitmap, functional and extensible indexes

. exporting posttables actions

. exporting materialized views

. exporting snapshot logs

. exporting job queues

. exporting refresh groups and children

. exporting dimensions

. exporting post-schema procedural objects and actions

. exporting statistics

Export terminated successfully without warnings.

 

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

 

Total System Global Area  603979776 bytes

Fixed Size                  1268872 bytes

Variable Size             335545208 bytes

Database Buffers          260046848 bytes

Redo Buffers                7118848 bytes

Database mounted.

 

SQL> recover database;

Media recovery complete.

 

SQL> alter database open;

 

Database altered.

 

SQL> desc fl.fl_test

ERROR:

ORA-04043: object fl.fl_test does not exist

 

 

SQL> select count(*) from scott.emp;

 

  COUNT(*)

----------

         6

 

SQL> exit

Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Real Application Testing options

[oracle@emrep 2010_06_25]$ sqlplus  / as sysdba

 

SQL*Plus: Release 10.2.0.4.0 - Production on Fri Jun 25 16:36:49 2010

 

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

 

 

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Real Application Testing options

 

SQL> create user fl identified by fl ;    

 

User created.

 

SQL> grant connect,resource to fl;

 

Grant succeeded.

 

SQL> exit

Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Real Application Testing options

[oracle@emrep 2010_06_25]$ imp file=/u01/app/oracle/bak/fl.dmp full=y

 

Import: Release 10.2.0.4.0 - Production on Fri Jun 25 16:37:53 2010

 

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

 

Username: fl

Password: 

 

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Real Application Testing options

 

Export file created by EXPORT:V10.02.01 via conventional path

import done in US7ASCII character set and AL16UTF16 NCHAR character set

import server uses WE8ISO8859P1 character set (possible charset conversion)

. importing FL's objects into FL

. . importing table                      "FL_TEST"          1 rows imported

Import terminated successfully without warnings.

[oracle@emrep 2010_06_25]$ sqlplus  / as sysdba

 

SQL*Plus: Release 10.2.0.4.0 - Production on Fri Jun 25 16:38:01 2010

 

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

 

 

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Real Application Testing options

 

SQL> conn fl/fl

Connected.

SQL> select * from fl_test;

 

         A

----------

       100

 

 

<常见错误>

Symptoms

there are problems with flashback database, however, unable to turn off flashback database so that

the database can be opened:

SQL> alter database flashback off;

 

Database altered.

 

SQL> alter database open;

alter database open

*

ERROR at line 1:

ORA-38760: This database instance failed to turn on flashback database

.

 

Cause

there is a restore point in the database

 

checked v$restore_point

.

 

Solution

check whether restore points exist:

SQL> select flashback_on from v$database;

SQL> select name from v$restore_point;

 

If so, drop them:

SQL> drop restore point <name>;

SQL> alter database flashback off;

SQL> select flashback_on from v$database;

SQL> alter database open;


分享到:
评论

相关推荐

    MySQL Flashback闪回功能详解.docx

    MySQL Flashback 闪回功能详解 MySQL Flashback 是 MySQL 中的一种闪回功能,用于快速恢复由于误操作丢失的数据。在 DBA 误操作时,可以把数据库恢复到以前某个时间点(或者说某个 binlog 的某个 pos)。Flashback ...

    oracle中关于flashback闪回的介绍

    #### 二、Flashback闪回的基础概念 ##### 1. 什么是闪回? - **定义**:闪回技术是Oracle提供的一种用于恢复数据的技术,它可以在不需要备份的情况下恢复到某个特定的时间点或者系统更改号(SCN)的状态。 - **应用...

    Oracle RAC环境下开启FLASHBACK闪回功能.pdf

    在Oracle RAC(Real Application Clusters)环境下启用Flashback闪回功能是一项高级的数据库管理技术,它能够帮助数据库管理员在不丢失数据的情况下恢复到过去某一时间点的状态,这对于数据安全和灾难恢复至关重要。...

    flashback闪回技术

    ### Flashback闪回技术 #### 一、概述 Flashback技术是Oracle数据库中一项重要的数据恢复工具,它基于Undo Segment中的内容实现,并受到UNDO_RETENTION参数的影响。要使用这项特性,用户必须启用自动撤销管理表...

    Oracle_FlashBack闪回技术

    ### Oracle FlashBack 闪回技术详解 #### 一、引言 在Oracle数据库管理中,闪回技术(FlashBack)是一项极为重要的功能,它能够帮助数据库管理员恢复误操作或者数据丢失的情况,为数据的安全性和可靠性提供了强有力...

    用oracle10g的flashback闪回功能快速恢复oracle中被删除的表

    ### 使用Oracle 10g的Flashback闪回功能快速恢复被删除的表 #### Oracle 10g Flashback 特性概述 Oracle Database 10g 引入了一项非常强大的特性——Flashback,该特性使得数据库管理员(DBA)能够轻松地恢复误删除...

    oracle flashback闪回技术

    Oracle Flashback技术是数据库管理系统中的一种高级特性,它允许用户恢复到数据库的某个历史状态,无需进行复杂的备份和恢复操作。这项技术主要基于事务日志和快照来实现,为数据库管理员提供了极大的便利,尤其在...

    MySQL Flashback 闪回功能详解-附件资源

    MySQL Flashback 闪回功能详解-附件资源

    第16章Oracle闪回(Flashback)技术.pptx

    "Oracle 闪回(Flashback)技术" Oracle 闪回(Flashback)技术是 Oracle 数据库提供的一系列人为错误更正技术,用于快速恢复逻辑误操作。闪回技术从 Oracle 9i 版本开始,逐步发展到 Oracle 11g 版本,成为数据库...

    oracle flashback特性(闪回语句,闪回表,闪回数据库).doc

    Flashback Query 是 Oracle Flashback 特性中最基本的部分,它允许用户通过闪回查询来查看过去的数据状态。Flashback Query 通过使用多版本读一致性的 undo 表空间来读取操作前的记录数据。Flashback Query 有多种...

    oracle 闪回 flashback

    Oracle 闪回(Flashback)技术是Oracle数据库提供的一种强大工具,主要用于数据恢复和时间点一致性查询。这一技术的核心在于Undo Segment,它记录了数据库中事务的撤销信息。Oracle 10g引入了多种闪回功能,包括...

    Oracle 闪回特性 FLASHBACK &amp; RECYCLEBIN

    Oracle 闪回特性 FLASHBACK & RECYCLEBIN Flashback 系列是 Oracle 数据库中的一组功能强大且实用的闪回机制,旨在帮助数据库管理员和开发者快速恢复数据库中的各种对象,包括表、数据、事务等。Flashback 系列的...

    Oracle闪回(Flashback)技术.pptx

    "Oracle闪回(Flashback)技术" Oracle闪回(Flashback)技术是Oracle数据库提供的一系列人为错误更正技术,旨在使数据库从任何逻辑误操作中迅速恢复。该技术从Oracle 9i版本的闪回查询开始,在Oracle 10g版本中...

    Oracle Flashback技术

    2. Flashback Table(闪回表):当需要将整个表恢复到之前的状态时,可以使用闪回表。通过`ALTER TABLE ... FLASHBACK TO TIMESTAMP`或`ALTER TABLE ... FLASHBACK TO SCN`命令,可以快速恢复表到指定的时间戳或系统...

Global site tag (gtag.js) - Google Analytics