在这一节我们来讲一下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;闪回文件大小