当前位置:文档之家› 用Oracle闪回功能恢复偶然丢失的数据

用Oracle闪回功能恢复偶然丢失的数据

在这一节我们来讲一下ORACLE 10G的数据库闪回技术.FLASHBACK的原理和通过应用重做日志来恢复数据的原理不一样,闪回数据库是通过应用数据库所保留的闪回日志(flashback log)来将数据库回滚到某一个时间点(这和恢复数据库时应用重做日志正好相反,应用闪回日志是回滚,而应用重做日志是前滚rolling forward),从而纠正由于用户错误所导致的数据丢失.


Flashback Database是Oracle10g的新增功能,在启动Flashback Database之后,它定期将已发生变化的块写入闪回日志的日志文件中。这些日志不是由传统的Log Writer (LGWR) 进程写入,而是由一种称作Recovery Writer (RVWR)的新进程写入。这是Oracle10g的新增进程。与常规的重做日志(redo logs)不同,回闪日志既不需要由DBA创建,也不需要由他们维护;它们由Oracle Managed Files(OMF)自动在闪回恢复区域所指定的目录中创建。这些文件不会归档,所以,如果在该目录发生介质故障后就不可能再进行闪回数据库的操作。


1. 首先我们来检查一下数据库是否启动了flashback database的功能:


sql>conn sys/joshua@ora32 as sysdba;

select row_movement from user_tables where table_name='JSS_TB1';

SQL> FLASHBACK TABLE RECYCLETEST TO SCN 2202666520;

SQL> flashback table “BIN$khjCqP4fRqeOrE/Eg/XUWQ==$0” to before drop rename to test2;


sql> SELECT t.FLASHBACK_ON FROM v$database t;


FLASHBACK_ON


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


NO


如果返回值是”NO”,就表示你的ORACLE10G数据库还未启用flashback database功能.
2.启用闪回数据库特性


sql>conn sys/joshua@ora32 as sysdba;


SQL> shutdown immediate;


Database closed.


Database dismounted.


ORACLE instance shut down.















Oracle 10g学习之闪回数据库时间:2010-04-08 08:59来源:互联网 作者: 目标 闪回数据库 去定为每种恢复情形使用哪种闪回技术 配置和使用闪回数据库 监视闪回数据库 使用EM管理闪回数据库 管理(维护)Flash Recovery Area 闪回技术概
-
目标

闪回数据库

去定为每种恢复情形使用哪种闪回技术 linux

配置和使用闪回数据库 mysql

监视闪回数据库 mysql

使用EM管理闪回数据库

oracle

管理(维护)Flash Recovery Area linux

闪回技术概述

unix

9i中首次引入闪回技术,第一个出现的是闪回查询(flackback query)。 ssh

10g里有了显著的扩展:

unix

闪回数据库(Flashback Database)

ssh

闪回删除(Flashbackup Drop)

linux


闪回版本查询(Flashback Versions Query) linux

闪回事务查询(Flashback Transaction Query)

mysql

闪回表(FlashbackTable) unix

所有的

闪回技术,除了闪回数据库,都是基于撤销数据(undodata)。

oracle


闪回数据库技术可以替代不完全恢复,优势在于闪回数据库更快效率更高,它是基于闪回日志的。

oracle


闪回删除、闪回版本查询、闪回事务和闪回表最佳用法是恢复单独的对象或者对象中的行。 linux

闪回删除------------虚拟回收站,允许被删除的对象重建

linux


闪回版本查询、闪回事务查询--------------识别和确定需要恢复到先前状态的数据行 unix

闪回表---------------从错误中恢复单独的表或表组

ssh

闪回数据库最适用于从某些种类的失误中恢复,如截短大表、不完整的批任务或删除了用户。

mysql


闪回数据库概述 mysql

闪回数据库能使整个数据库闪回到特定的时间点。 mysql

闪回数据库恢复比传统恢复操作更快的原因是:恢复不再受数据库大小的影响。

oracle

闪回数据库恢复时间正比于恢复过程汇总需要备份的变化的数量,而不是数据文件和归档日志大小。 unix

闪回数据库恢复的结构:恢复写入器(PVWR)后台进程和闪回数据库日志组成。

ssh

PVWR在闪回控制区写入闪回数据库日志。

ssh

闪回恢复区。 mysql



闪回数据库的局限:

unix


1.不能解决介质故障,介质故障仍然需要重建数据文件和恢复归档日志。

mysql

2.缩小数据文件到较小的尺寸,也被称为截短数据文件,闪回数据库不能撤销。 linux

3.如果控制文件被重建,不能使用闪回数据库

mysql


4.不能完成删除一个表空间并用resetlogs恢复。 unix

5.不能将数据库闪回到一个SCN值(如果该SCN早于闪回日志中最早的可用的SCN) oracle

使用Recovery Manager管理闪回恢复区 oracle

闪回恢复区专门用于将所有恢复文件集中存储于磁盘上的某个区域。

mysql

闪回恢复区对恢复过程提供两个主要好处: unix

所有恢复文件集中存储在一个区域 ssh

它提供更快的备份和重建方法,因为信息被写入磁盘而不是磁带

mysql

闪回恢复区通过初始化数据库参数而建立,同时也在参数中定义恢复区大小和位置。 linux

BDA_OUTSTANDING_ALERTS视图可查看闪回恢复区状态信息。

unix


恢复区使用率达到90%和95%时,10g数据库将向警告日志发送警告信息。90%时10g将自动把已废弃的 文件从闪回恢复区删除。

mysql


配置闪回恢复区

ssh

只需在数据库增加一对数据库参数:db_recovery_file_dest_size db_recovery_file_dest

unix

例子: oracle

1.SQL>alte

rsystemsetdb_recovery_file_dest_size=10mscope=both
2.SQL>altersystemsetdb_recovery_file_dest='d:oracleflash_recovery_areatest';

linux


修改用alter system

unix


停用闪回恢复区:alter system set db_recovery_file_dest=' ';

ssh


使用闪回恢复区

unix


闪回恢复区是一个集中的恢复区域。

linux

这些文件和数据文件及控制文件有关系。这就减少了手工清除不需要的归档日志。

mysql


V$recovery_file_dest检查消耗的空间和其他关于闪回恢复区的统计信息。 unix



闪回恢复区可以包括数据文件、控制文件、联机重做日志、各种各样的RMAN文件和闪回日志。用户可以在建立重做日志、控制文件、和归档日志文件时将他们存储在闪回恢复区。 unix

影响联机重做日志的参数:

oracle


DB_CREATE_ONLINE_LOG_DEST_n
DB_RECOVERY_FILE_DEST
DB_CREATE_FILE_DEST

mysql

闪回去建立的重做日志默认大小为100M。

ssh

影响控制文件的一些参数: oracle

CONTROL_FILES
DB_CREATE_ONLINE_LOG_DEST_n
DB_RECOVERY_FILE_DEST
DB_CREATE_FILE_DEST

mysql


影响归档日志的一些参数: unix

LOG_ARCHIVE_DEST_n
LOG_ARCHIVE_DEST
LOG_ARCHIVE_DUPLEX_DEST

oracle

备份闪回恢复区 linux

复制闪回恢复区: mysql

BACKUP RECOVERY AREA 备份整个恢复区

oracle

BACKUP RECOVERY FILES 只备份恢复区中的文件 unix

命令必须与磁带设备和媒介管理器一起使用,而且媒介管理器要被设置为使用RMAN。 ssh

配置闪回恢复区

ssh


数据库必须处于归档状态,必须配置闪回恢复区。 ssh

1.库起到mount状态

linux


2.设置DB_FLASHBACK_RETENTION_TARGET闪回数据的最大保留时间,单位为分钟。Alter DB_FLASHBACK_RETENTION_TARGET=4320; 其值为3天。

oracle


3.启动闪回能力 :alter database flashback on;

unix

4.Alter database open;

oracle

在RMAN中使用闪回数据库 oracle

如过配置好闪回数据库后,只需在mount模式下启动数据库就做好准备完成闪回数据库恢复了。

oracle

可以从v$FLASHBACK_DATABASE_LOG视图中获得OLDEST_FLASHBACK_SCN或者OLDEST_FLASHBACK_TIME。 linux

查出来的SCN或者TIME用于数据库闪回的子句 oracle

oracle

:flashbackdatabasetoscn=689316;
:flashbackdatabasetotime='04-9月-200811:05:00';

unix


例子:闪回数据库恢复到指定SCN linux

1.查出SCN号

linux


Selectoldest_flashback_scnfromv$flashback_database_log;

oracle

2.启动数据库到mount状态

mysql

3.从RMAN发出闪

回数据库恢复命令

linux


Connecttarget
Flashbackdatabasetoscn=……; oracle

4.alter database open resetlogs;

ssh

监视闪回数据库 ssh

动态视图:

linux

V$DATABASE 显示闪回数据库是启动还是关闭

mysql

Selectflashback_onfromv$database;

mysql

V$FLASHBACK_DATABASE_LOG 10g的新特性,查看所需的空间数量

linux


Select
oldest_flashback_scn,
oldest_flashback_time,
retention_target,

unix

Flashback_size, -------闪回数据的大小

ssh


estimated_flashback_size -------估计数据的大小

unix


Fromv$flashback_database_log; ssh

V$FLASHBACK_DATABASE_STAT 显示闪回数据库日志的使用情况

linux


Select*fromv$flashback_database_stat;

ssh

在EM使用闪回数据库 ssh



SQL> startup mount;


ORACLE instance started.





Total System Global Area 612368384 bytes


Fixed Size 1250428 bytes


Variable Size 100666244 bytes


Database Buffers 503316480 bytes


Redo Buffers 7135232 bytes


Database mounted.


SQL> alter database archivelog;





Database altered.





SQL> alter database flashback on;





Database altered.





SQL> alter database open;





Database altered.


好,这就启用了数据库的FLASHBACK DATABASE功能,我们来看闪回日志文件存放的目标路径:


SQL> SHOW parameter db_recovery_file_dest





NAME TYPE VALUE


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





db_recovery_file_dest string D:/flash_recovery_area





db_recovery_file_dest_size big integer 2147483648


SQL>



3.闪回日志
Oracle会在闪回区存放日志,我们转到参数: db_recovery_file_dest,这个就是闪回区,闪回日志即存放于此目录:


D:\>cd D:\flash_recovery_area\ORA32\FLASHBACK


D:\flash_recovery_area\ORA32\FLASHBACK>dir


05/07/2007 02:51 PM 8,200,192 O1_MF_33XM3HHN_.FLB


1 File(s) 8,200,192 bytes


我们再来看看V$FLASHBACK_DATABASE_LOG这个视图:


SQL> SELECT OLDEST_FLASHBACK_SCN, OLDEST_FLASHBACK_TIME FROM V$FLASHBACK_DATABASE_LOG;


OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TIME


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


75565426 2007-5-7 14:51:27


4.模拟用户错误


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





Session altered.


SQL> archive log list;


Database log mode Archive Mode


Automatic archival Enabled


Archive destination USE_DB_RECOVERY_FILE_DEST


Oldest onl

ine log sequence 3708


Next log sequence to archive 3710


Current log sequence 3710


我们先来查看一下数据库当前的时间:


SQL> select sysdate from dual;





SYSDATE


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


2007-05-07 15:11:10





我们再来创建一个测试表:


SQL> create table test(c varchar2(10));





Table created.





SQL> insert into test values('a');





1 row created.





SQL> commit;





Commit complete.





我们再来查看一下数据库的时间:


SQL> select sysdate from dual;





SYSDATE


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


2007-05-07 15:13:43


接下来我们把这个表给删除掉:


SQL> drop table test;





Table dropped.


我们再来记录一下数据库的时间:


SQL> select sysdate from dual;





SYSDATE


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


2007-05-07 15:15:30


5.进行数据库闪回操作


当我们删除表后,查询此表会报对象不存在的错误:


SQL> select * from test;


select * from test


*


ERROR at line 1:


ORA-00942: table or view does not exist


我们马上通过FLASHBACK DATABASE来闪回数据库到表被删除之前的时间点:


(1)先关闭数据库:


SQL> shutdown immediate;


Database closed.


Database dismounted.


ORACLE instance shut down.


(2)将数据库启动到MOUNT阶段(flashback database命令只有在数据库启动到mount阶段,并且数据库不打开时才有效):


SQL> startup mount;


ORACLE instance started.





Total System Global Area 612368384 bytes


Fixed Size 1250428 bytes


Variable Size 104860548 bytes


Database Buffers 499122176 bytes


Redo Buffers 7135232 bytes


Database mounted.


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





Session altered.





sql>select * from V$FLASHBACK_DATABASE_LOG;


OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TIME RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE


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


75565426 2007-5-7 14:51:27 1440 8192000 434380800


(3)将整个数据库闪回到表TEST被删除之前的时间点:


SQL> flashback database to TIMESTAMP to_timestamp ('2007-05-07 15:13:43','yyyy-mm-dd hh24:mi:ss');





Flashback complete.


(4)以只读方式打开数据库,以验证数据库是否真的被闪回到表TEST被删除之前的时间点:


SQL> alter database open read only;





Database altered.





SQL> select * from test;





C


----------


a


ok,已能从TEST表中查询出记录,证明数据库确实被闪回到表TEST被删除之前的时间点: 2007-05-07 15:13:43


注意,flashback database之后,只能以resetlogs方式打开数据

库:


SQL> shutdown immediate;


Database dismounted.


ORACLE instance shut down.


SQL> startup;


ORACLE instance started.


Total System Global Area 612368384 bytes


Fixed Size 1250428 bytes


Variable Size 104860548 bytes


Database Buffers 499122176 bytes


Redo Buffers 7135232 bytes


Database mounted.


ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


SQL> alter database open resetlogs;





Database altered.





SQL> select * from test;





C


----------


a




当然了,当我们以resetlogs打开数据库之后,将不能够再flashback至resetlogs之前的时间点。


怎么样,oracle 10g的flashback database功能是否很简单实用?

SQL> alter database open resetlogs;

数据库已更改。

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

COUNT(*)
----------
14




方法三:归档模式下,用rman的备份基于时间的不完全恢复。
首先进行rman的全备份
C:\>rman target/

恢复管理器: Release 10.2.0.1.0 - Production on 星期一 6月 9 10:27:50 2008

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

连接到目标数据库: ORCL (DBID=1184709774)

RMAN> backup database tag='full' plus archivelog;



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

闪回完成

SQL> alter system set DB_RECOVERY_FILE_DEST_SIZE=20g;闪回文件大小



相关主题
文本预览
相关文档 最新文档