数据库闪回,如何执行Oracle数据库闪回查询
大家好,今天小编来为大家解答以下的问题,关于数据库闪回,如何执行Oracle数据库闪回查询这个很多人还不知道,现在让我们一起来看看吧!
Oracle10g数据库中闪回表特性剖析
Oracle i Database推出了闪回查询选项的概念以便检索过去某个时间点的数据但它不能闪回 DDL操作如删除表的操作唯一的恢复方法是在另一个数据库中使用表空间的时间点恢复然后使用导出/导入或其他方法在当前数据库中重新创建表这一过程需要 DBA进行大量工作并且耗费宝贵的时间更不用说还要使用另一个数据库进行克隆使用 Oracle Database g中的闪回表特性它使得被删除表的恢复过程如同执行几条语句一样简单让我们来看该特性是如何工作的
删除那个表!
首先让我们查看当前模式中的表
SQL> select* from tab;TNAMETABTYPECLUSTERID
RECYCLETESTTABLE
现在我们意外地删除了该表
SQL> drop table recycletest;Table dropped
现在让我们来查看该表的状态SQL> select* from tab;TNAMETABTYPECLUSTERID BIN$ LhcpndanfgMAAAAAANPw==$ TABLE
表RECYCLETEST已不存在但是请注意出现新表BIN$ LhcpndanfgMAAAAAANPw==$这就是所发生的事情被删除的表 RECYCLETEST并没有完全消失而是重命名为一个由系统定义的名称它存在于同一个表空间中具有与原始表相同的结构如果在该表上定义了索引或触发器则它们也被重命名使用与表相同的命名规则任何相关源(如过程)都失效原始表的触发器和索引被改为放置在重命名的表 BIN$ LhcpndanfgMAAAAAANPw==$上保持被删除表的完整对象结构
表及其相关对象被放置在一个称为回收站的逻辑容器中它类似于您 PC机中的回收站但是对象并没有从它们原先所在的表空间中删除它们仍然占用那里的空间回收站只是一个列出被删除对象目录的逻辑结构在 SQL*Plus提示符处使用以下命令来查看其内容(您需要使用 SQL*Plus来进行此操作)
SQL> show recyclebinORIGINAL NAMERECYCLEBIN NAMEOBJECT TYPEDROP TIME RECYCLETESTBIN$ LhcpndanfgMAAAAAANPw==$ TABLE:::
结果显示了表的原始名称 RECYCLETEST并显示了回收站中的新名称该名称与我们看到的删除后所创建的新表名称相同(注意确切的名称可能因平台不同而不同)为恢复该表您所需要做的就是使用 FLASHBACK TABLE命令
SQL> FLASHBACK TABLE RECYCLETEST TO BEFORE DROP;FLASHBACK PLETE SQL> SELECT* FROM TAB;TNAMETABTYPECLUSTERID RECYCLETESTTABLE
瞧!表毫不费力地恢复了如果现在查看回收站它将是空的记住将表放在回收站里并不在原始表空间中释放空间要释放空间您需要使用以下命令清空回收站
PURGE RECYCLEBIN;
但是如果您希望完全删除该表而不需要使用闪回特性该怎么办?在这种情况下可以使用以下命令永久删除该表
DROP TABLE RECYCLETEST PURGE;
此命令不会将表重命名为回收站中的名称而是永久删除该表就象 g之前的版本一样
管理回收站
如果在该过程中没有实际删除表—因而没有释放表空间—那么当被删除的对象占用了所有空间时会发生什么事?
答案很简单这种情况根本不会出现当表空间被回收站数据完全占满以至于必须扩展数据文件来容纳更多数据时可以说表空间处于空间压力情况下此时对象以先进先出的方式从回收站中自动清除在删除表之前相关对象(如索引)被删除
同样空间压力可能由特定表空间定义的用户限额而引起表空间可能有足够的空余空间但用户可能将其在该表空间中所分配的部分用完了在这种情况下 Oracle自动清除该表空间中属于该用户的对象
此外有几种方法可以手动控制回收站如果在删除名为 TEST的特定表之后需要从回收站中清除它可以执行
PURGE TABLE TEST;
或者使用其回收站中的名称
PURGE TABLE BIN$ LhcpndanfgMAAAAAANPw==$;
此命令将从回收站中删除表 TEST及所有相关对象如索引约束等从而节省了空间但是如果要从回收站中永久删除索引则可以使用以下命令来完成工作
purge index in_test _;
此命令将仅仅删除索引而将表的拷贝留在回收站中有时在更高级别上进行清除可能会有用例如您可能希望清除表空间 USERS的回收站中的所有对象可以执行
PURGE TABLESPACE USERS;
您也许希望只为该表空间中特定用户清空回收站在数据仓库类型的环境中用户创建和删除许多临时表此时这种方法可能会有用您可以更改上述命令限定只清除特定的用户PURGE TABLESPACE USERS USER SCOTT;
诸如 SCOTT等用户可以使用以下命令来清空自己的回收站
PURGE RECYCLEBIN;
DBA可以使用以下命令清除任何表空间中的所有对象
PURGE DBA_RECYCLEBIN;
可以看到可以通过多种不同方法来管理回收站以满足特定的需要
表版本和闪回功能
用户可能会经常多次创建和删除同一个表如
CREATE TABLE TEST(COL NUMBER);INSERT INTO TEST VALUES();mit;DROP TABLE TEST;CREATE TABLE TEST(COL NUMBER);INSERT INTO TEST VALUES();mit;DROP TABLE TEST;CREATE TABLE TEST(COL NUMBER);INSERT INTO TEST VALUES();mit;DROP TABLE TEST;
此时如果您要对表 TEST执行闪回操作那么列 COL的值应该是什么?常规想法可能认为从回收站取回表的第一个版本列 COL的值是实际上取回的是表的第三个版本而不是第一个因此列 COL的值为而不是
此时您还可以取回被删除表的其他版本但是表 TEST的存在不允许出现这种情况您有两种选择
使用重命名选项
FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST;FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST;
这些语句将表的第一个版本恢复到 TEST将第二个版本恢复到 TEST TEST和 TEST中的列 COL的值将分别是和或者使用表的特定回收站名称进行恢复为此首先要识别表的回收站名称然后执行
FLASHBACK TABLE BIN$ LhcpnoanfgMAAAAAANPw==$ TO BEFORE DROP RENAME TO TEST;FLASHBACK TABLE BIN$ LhcpnqanfgMAAAAAANPw==$ TO BEFORE DROP RENAME TO TEST;
这些语句将恢复被删除表的两个版本
警告
取消删除特性使表恢复其原始名称但是索引和触发器等相关对象并没有恢复原始名称它们仍然使用回收站的名称在表上定义的源(如视图和过程)没有重新编译仍然保持无效状态必须手动得到这些原有名称并应用到闪回表
信息保留在名为 USER_RECYCLEBIN的视图中在对表进行闪回操作前请使用以下查询来检索原有名称
SELECT OBJECT_NAME ORIGINAL_NAME TYPEFROM USER_RECYCLEBINWHERE BASE_OBJECT=(SELECT BASE_OBJECT FROM USER_RECYCLEBINWHERE ORIGINAL_NAME= RECYCLETEST)AND ORIGINAL_NAME!= RECYCLETEST;
OBJECT_NAMEORIGINAL_N TYPE BIN$ LhcpnianfgMAAAAAANPw==$ IN_RT_ INDEXBIN$ LhcpnganfgMAAAAAANPw==$ TR_RTTRIGGER
在表进行闪回操作后表 RECYCLETEST上的索引和触发器将按照 OBJECT_NAME列中所示进行命名根据以上查询可以使用原始名称重新命名对象如下所示
ALTER INDEX BIN$ LhcpnianfgMAAAAAANPw==$ RENAME TO IN_RT_;ALTER TRIGGER BIN$ LhcpnganfgMAAAAAANPw==$ RENAME TO TR_RT;
lishixinzhi/Article/program/Oracle/201311/17794oracle数据库中闪回和回收站不是一个意思吗
这里说点自己的理解,不写那些名词解释了。
闪回功能和回收站并不一样。
举例来说,闪回一般操作就是短时间内的恢复(DML操作,个人感觉类似于win的ctrl+z(不过没有win的好用))。比如说你刚刚删除了数据,那么利用闪回功能可以回到删除之前。但是如果表的交易量很大,或者时间过长,那么就不能回到你需要的时间(比如你想回到一天前,那闪回是基本不可能实现的)
回收站则不同,它主要是删除段的放置空间。和windows的回收站一个意思(什么见过回收站能还原一段在word中删除的内容的),就是将删除的段放置在这里。oracle中drop的段(主要是表),如果不加purge(加了就是彻底删除),那么就会放置在回收站中,就好像我们在win系统中的删除,如果直接删除一个文件,那么在回收站中,如果是shift+del那么就是彻底删除,不可恢复。
其实回收站的表是可以看到的,就是那些一堆乱码(BIN$开头的字符串)表名的表。可以用show recyclebin查到,也可以zairecyclebin的视图中看到。
如何执行Oracle数据库闪回查询
可按以下步骤配置闪回数据库:(确保数据库处于ARCHIVELOG模式。)
1.配置快速恢复区。
2.使用初始化参数DB_FLASHBACK_RETENTION_TARGET设置保留目标。可指定
一个上限(以分钟为单位),指示数据库能够闪回到多长时间以前。本示例使用
了 2880分钟,相当于两天。此参数只是一个目标,并不提供任何保证。闪回时间
间隔取决于快速恢复区中保留的闪回数据量的大小。
3.使用以下命令启用闪回数据库:
ALTER DATABASE FLASHBACK ON;
必须先配置数据库以进行归档,且必须在 MOUNT EXCLUSIVE模式下启动数据库
后,才能发出此命令来启用闪回数据库。
可以使用以下查询来确定是否已启用闪回数据库:
SELECT flashback_on FROM v$database;
可以使用ALTER DATABASE FLASHBACK OFF命令禁用闪回数据库。这样,会自动删
除所有现有的闪回数据库日志。
注:仅当在独占模式下装载(而不是打开)数据库时才能启用闪回数据库。
1.确认当前模式
SYS AS SYSDBA on 29-MAR-05>select flashback_on from v$database;
FLA
---
NO
2.检查/修改恢复区设置
SYS AS SYSDBA on 29-MAR-05>show parameter db_recovery_file_dest
NAME TYPEVALUE
-----------------------------------------------------------------------------
db_recovery_file_deststring/u01/app/oracle/flash_recovery_areadb_recovery_file_dest_size big integer 10G
SYS AS SYSDBA on 29-MAR-05>alter system set db_recovery_file_dest='/u01/app/oracle/flash_recovery_area';
SYS AS SYSDBA on 29-MAR-05>alter system set db_recovery_file_dest_size=15G;
3.检查/修改闪回时间设置
SYS AS SYSDBA on 29-MAR-05>show parameter db_flashback_retention_target
NAME TYPEVALUE
-----------------------------------------------------------------------------
db_flashback_retention_targetinteger 60
SYS AS SYSDBA on 29-MAR-05>alter system set db_flashback_retention_target=1440;--分钟
System altered.
如何设置flash recovery area
(1).db_recovery_file_dest:指定闪回恢复区的位置
(2).db_recovery_file_dest_size:指定闪回恢复区的可用空间大小
(3).db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟,也就是一天。当然,实际上可回退的时间还决定于闪回恢复区的大小,因为里面保存了回退所需要的 flash log。所以这个参数要和db_recovery_file_dest_size配合修改。
alter system set db_flashback_retention_target=1440;
alter system set db_recovery_file_dest='/u01/app/oracle/flash_recovery_area';
alter system set db_recovery_size=15G;
4.重新启动数据库到Mount状态
启动flashback database选项。
SYS AS SYSDBA on 29-MAR-05>shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS AS SYSDBA on 29-MAR-05>startup mount exclusive;
ORACLE instance started.
Total System Global Area 314572800 bytes
Fixed Size 1301704 bytes
Variable Size 261890872 bytes
Database Buffers 50331648 bytes
Redo Buffers1048576 bytes
Database mounted.
SYS AS SYSDBA on 29-MAR-05>alter database flashback on;
Database altered.
SYS AS SYSDBA on 29-MAR-05>alter database open;
Database altered.
如果你还想了解更多这方面的信息,记得收藏关注本站。