Oracle 10g中闪回数据库技术详解
一、何时使用闪回技术
当 Oracle 数据库中发生了逻辑损坏时,如果您需要快速容易地恢复数据,就必须使用闪回技术。与发生人为错误的情况一样,很难标识受错误事务处理影响的对象和行。使用闪回技术时,可诊断出错误是如何引入到数据库中的,然后可修复损坏的数据。您可以查看导致特定行修改的事务处理,查看某个时间段内指定行的整个版本集,或者只查看过去特定时间显示的数据。幻灯片表中显示了闪回技术的典型用法。
闪回数据库使用闪回日志执行闪回。闪回删除使用回收站。其它所有功能都使用还原数据。并不是所有闪回功能都会修改数据库。有些功能只是一些用来查询数据其它版本的方法。这些工具用来查看问题并帮助进行恢复。根据闪回查询结果,可执行下列其中一项操作:
确定执行哪种类型的数据库修改闪回操作来修复问题。
将这些查询结果集反馈到 INSERT、UPDATE 或 DELETE 语句以便于修复错误数据。
二、闪回数据库概要
使用闪回数据库时,通过还原自先前某个时间点以来发生的所有更改,可快速将数据库恢复到较早的时间点。这个操作速度很快,因为不需要还原备份。使用这个功能可撤消导致逻辑数据损坏的更改。如果数据库发生介质丢失或物理损坏,则必须使用传统恢复方法。
三、闪回数据库减少还原时间
闪回数据库比使用还原文件和重做日志文件的传统时间点恢复的速度要更快。随着数据库规模的增加,通过还原所有数据文件来执行传统的时间点恢复所需的时间长度变得不太现实。使用闪回数据库时,因为不需要还原数据文件,所以恢复数据库的时间与需要回退的更改数目(而不是数据库大小)成比例。
闪回数据库是通过使用一类被称为闪回数据库日志的日志文件来实施的。Oracle 数据库会定期将数据块的“前像”记录在闪回数据库日志中。为了快速将数据文件更改回退到捕获闪回日志的时间(就在所需目标时间之前),可以重用块图像。然后,应用重做日志文件中的更改来填充间隔。在快速恢复区中会自动创建和管理闪回数据库日志。
四、闪回数据库注意事项
在不能使用闪回数据库功能的情况下,必须使用不完全恢复操作将数据库返回到特定时间。闪回数据库操作完成后,可在只读模式下打开数据库,验证是否使用了正确的目标时间或系统更改号 (SCN)。如果没有,可以再次闪回数据库,或者通过执行恢复操作来前滚数据库。因此,要撤消闪回数据库操作,必须向前恢复数据库。
注:闪回保留目标并不能绝对保证闪回可用。如果快速恢复区中必需存在的文件需要占用空间,可能会自动删除闪回日志。
五、闪回数据库限制
不能使用闪回数据库恢复自闪回目标时间以来已删除的数据文件。删除的数据文件会添加到控制文件中且标记为脱机,但是不会闪回。闪回数据库不能闪回自闪回目标时间以来已收缩的数据文件。这种数据文件必须先脱机,才能执行闪回操作。
六、闪回数据库实施
使用FLASHBACK DATABASE可以恢复数据库到先前的某个时间点或者某个SCN号。在Oracle10g以前的版本中,要实现数据库恢复到过去某个时间点或者SCN号,只能够通过数据库的不完全恢复实现。从Oracle 10g开始,可以使用FLASHBACK DATABASE实现。使用FLASHBACK DATABASE要比执行数据库系统的不完全恢复要快的多,但是需要对数据库做以下的配置:
1、数据库必须运行在归档模式下。
2、必须启用数据库的闪回功能。
3、必须配置初始化参数DB_FLASHBACK_RETENTION_TARGET。
注:db_flashback_retention_target参数是设定闪回数据的最长保存时间,单位是分钟;默认值是1440(60*24),即1天。
1、闪回操作的语法
FLASHBACK [STANDBY | DATABASE] [数据库名称] to SCN SCN号 | TIMESTAMP 时间表达式 | restore point 恢复点
2、配置闪回数据库选项
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 92275368 bytes
Database Buffers 192937984 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
SQL> select name,log_mode,open_mode,flashback_on from v$database;
NAME LOG_MODE OPEN_MODE FLASHBACK_ON
--------- ------------ ---------- ------------------
MYORACLE ARCHIVELOG MOUNTED NO
当前闪回数据库的开关没有打开,需要设置打开闪回开关。设置FLASHBACK_ON必须将数据库加载到MOUNT状态进行。
SQL> alter database flashback on;
数据库已更改。
SQL> alter system set db_flashback_retention_target=3600;
系统已更改。
SQL> alter database open;
数据库已更改。
3、闪回到某个时间点
SQL> select to_char(oldest_flashback_time,'yyyy-mm-dd hh24:mi:ss')
from v$flashback_database_log;
TO_CHAR(OLDEST_FLAS
-------------------
2011-07-12 10:20:59
SQL> drop table scott.emp;
表已删除
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 92275368 bytes
Database Buffers 192937984 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
SQL> flashback database to timestamp to_date('2011-07-12 10:20:59','yyyy-mm-dd hh24:mi:ss');
闪回完成。
SQL> alter database open resetlogs;
数据库已更改。
SQL> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250
……………………
已选择14行。
4、闪回到某个系统更改号(SCN)
SQL> select oldest_flashback_scn from v$flashback_database_log;
OLDEST_FLASHBACK_SCN
--------------------
846734
SQL> truncate table scott.emp;
表被截断。
SQL> select * from scott.emp;
未选定行
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 96469672 bytes
Database Buffers 188743680 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
SQL> flashback database to scn 846734;
闪回完成。
SQL> alter database open resetlogs;
数据库已更改。
SQL> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250
………………
已选择14行。
七、Oracle数据库回收站
Oracle也有回收站,如果不小心drop掉了哪张表,或误删了记录,可以通过回收站闪回。首先查看回收站中有哪些对象被删除:
SQL> select * from recyclebin t;
主要字段有object_name、original_name、createtime、droptime,original_name就是你删除对象之前在oracle里面的名称,根据droptime我们可以找到当时你删除的版本的object_name,然后根据object_name就可以进行闪回。
SQL> flashback table “BIN$SxyIpbUaSlGWt9j/dEZEhw==$0″ to before drop rename to gis_link;
注:object_name一定要用双引号括起来,而不是单引号。