• 描述闪回技术
• 执行闪回查询
• 使用闪回版本查询
• 对表启用行移动
• 执行闪回表操作
• 使用闪回事务处理查询
• 使用闪回事务处理
当Oracle DB 发生逻辑损坏,而又需要简单快捷地恢复数据时,可以使用闪回技术。与人为错误一样,很难确定错误事务处理所影响的对象和行。
通过使用闪回技术,可以诊断错误在数据库中是如何造成的,然后可以修复损坏。可以查看导致修改特定行的事务处理,查看特定时间段内给定行的所有版本集,或者只查看过去特定时间显示的数据。
上表中显示了闪回技术的典型用法。
闪回数据库依赖于闪回日志来执行闪回。
闪回删除功能使用回收站,其它所有技术都使用还原数据。
并不是所有闪回功能都会修改数据库。有些功能只是用来查询数据的其它版本的方法;
可以使用这些工具来调查问题,并帮助进行恢复。闪回查询的结果可以帮助用户执行以下两种操作之一:
• 确定要执行哪类数据库修改闪回操作来修复问题。
• 将这些查询的结果集输入到INSERT、UPDATE或DELETE语句中,便可以轻松地修复错误数据。
通过
闪回数据归档,可使用前面的逻辑闪回功能访问过去很久以前的数据。
事务处理开始时,它被分配到一个还原段。在事务处理的整个过程中,更改数据时,原始“旧”值会复制到还原段。
通过检查V$TRANSACTION视图,可以查看哪些事务处理被分配到哪些还原段。
还原段是为了支持事务处理,根据需要由实例自动创建的专用段。像所有段一样,还原段由区组成,区又由数据块组成。还原段根据需要可自动增长和收缩,它充当一个用于所分配的事务处理的循环存储缓冲区。
当事务处理填满其当前还原段区中的块时,会为事务处理分配相同区中的其它块。如果该区中没有空闲块,则事务处理获取段中下一个区的块。占用了所有区之后,事务处理会自动转回到第一个区或请求为还原段分配新区。
上表在左侧显示了一个表图标,以及由DML 操作获得的原始数据。原始数据保留在缓冲区高速缓存中(如果未过期),然后写入到还原表空间(显示在右侧的圆
环中)。
注:并行DML 操作实际上可导致事务处理使用多个还原段。
默认还原行为是覆盖提交的、尚未失效的事务处理,而不是因为缺少还原空间而使活动事务处理失败。出现冲突时,事务处理优先于查询。
此行为在保证了保留时间后会有所改变。有了保证的保留时间,即使会导致事务处理失败,仍然会强制执行还原保留时间设置。(因此,出现冲突时,查询优先于事务处理。)
RETENTION GUARANTEE是表空间属性而不是初始化参数。可使用SQL 命令行语句或Oracle Enterprise Manager 更改此属性。
通过更改还原表空间来保证保留时间的语法是:
SQL> ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;
要将保证的还原表空间恢复至其常规设置,请使用以下命令:
SQL> ALTER TABLESPACE undotbs1 RETENTION NOGUARANTEE;
如何启动EM:
[oracle@rtest ~]$
emctl start dbconsole
Oracle Enterprise Manager 11g Database Control Release 11.2.0.3.0
Copyright (c) 1996, 2011 Oracle Corporation. All rights reserved.
https://rtest.localdomain:1158/em/console/aboutApplication
Starting Oracle Enterprise Manager 11g Database Control ............ started.
------------------------------------------------------------------
Logs are generated in directory /u01/app/oracle/product/11.2.0/dbhome_1/rtest.localdomain_test0924/sysman/log
可以在Oracle Enterprise Manager 中设置还原保留时间保证。导航到‘’服务器-Automatic Undo Management(自动还原管理)”页。单击保留时间保证的当前设置(“General/Undo Retention Settings(一般/还原保留时间设置)”)进行修改。
• 创建还原表空间
• 启用自动还原管理
• 指定还原保留时间和保证还原保留时间
• 默认的数据库初始化参数:
– UNDO_MANAGEMENT='AUTO'
– UNDO_TABLESPACE='UNDOTBS1'
– UNDO_RETENTION=900
准备数据库以进行闪回
要启用应用程序的闪回功能,必须执行以下任务:
• 创建具有足够空间的还原表空间以保留闪回操作所需的数据。用户更新数据越频繁,所需空间就越大。数据库管理员通常会计算空间要求。如果用户不确定空间要求,则可以先创建一个可自动扩展的还原表空间,观察该表空间一个业务周期(例如,1 或2 天),使用V$UNDO_STAT视图收集还原块信息,计算空间要求,然后使用这些空间要求来创建大小合适的固定还原表空间
• 默认情况下会启用自动还原管理。
• 对于固定大小的还原表空间,Oracle DB 会自动优化系统,以便为还原表空间提供可能的最佳还原保留时间。
• 对于可自动扩展的还原表空间(默认),Oracle DB 会保留还原数据,其保留时间至少满足
运行时间最长的查询所需的保留期,以及UNDO_RETENTION参数指定的还原保留时间阈值。
可以查询V$UNDOSTAT.TUNED_UNDORETENTION来确定对当前还原表空间的还原数据的保留时间。
设置UNDO_RETENTION参数并不能保证未失效的还原数据不会被覆盖。
如果系统需要更多空间,Oracle DB 可以用最新生成的还原数据覆盖未失效的还原数据。
• 为还原表空间指定
RETENTION GUARANTEE子句,确保不会丢弃未失效的还原数据。
• 为需要使用闪回功能的用户、角色或应用程序授予闪回权限。要满足长期保留要求,则可以创建闪回数据归档。
• 闪回查询
– 查询指定时间点的所有数据。
• 闪回版本查询
– 查看两个时间点之间行的所有版本。
– 查看更改了行的事务处理。
• 闪回事务处理查询
– 查看事务处理所做的所有更改。
使用闪回技术查询数据
闪回技术提供了查询以前版本的方案对象、查询历史记录数据和执行更改分析的功能。
每个事务处理在逻辑上都会生成一个新版本的数据库。借助闪回技术,可通过浏览这些版本来查找错误及起因:
• 闪回查询:查询在特定时间点存在的所有数据。
• 闪回版本查询:查看两个时间点之间行的所有版本以及更改了行的事务处理。
• 闪回事务处理查询:查看某个事务处理所做的所有更改,并且,如果需要,使用“还原”SQL 命令回退事务处理。
SELECT employee_id, salary FROM employees
AS OF TIMESTAMP
<T1>
WHERE employee_id = 200
闪回查询
使用闪回查询功能,可以执行截止到特定时间的查询。使用SELECT语句的AS OF子句,可以指定要查看其对应数据的时间戳。这在分析数据差异时非常有用。
注:TIMESTAMP和SCN是AS OF子句的有效选项。
UPDATE employees
SET salary =
(SELECT salary FROM employees
AS OF TIMESTAMP TO_TIMESTAMP
('2005-05-04 11:00:00', 'yyyy-mm-dd hh24:mi:ss')
WHERE employee_id = 200)
WHERE employee_id = 200
闪回查询:示例
如果最近错误地给某个雇员加了薪,则可重新更改薪金,其值由子查询返回的闪回值提供。
闪回版本查询
使用闪回查询,可对特定时间范围或用户指定的系统更改号(SCN) 范围内的数据库进行查询。通过闪回版本查询功能,可使用VERSIONS子句检索两个时间点或两个SCN 之间的所有行的所有版本。
闪回版本查询返回的那些行表示跨事务处理的那些行的更改历史记录。闪回版本查询只检索提交的行。不显示事务处理中未提交的行版本。返回的行还包括行的已删除版本和后来重新插入的版本。
可以使用闪回版本查询检索行历史记录。闪回版本查询提供了一种方法,通过这种方法可审计表行,检索影响行的事务处理的有关信息。然后,可以使用返回的事务处理标识符来执行事务处理挖掘(通过使用LogMiner)或执行闪回事务处理查询。
注:VERSIONS_XID是返回相应行版本的事务处理标识符的伪列。
• 不能使用VERSIONS子句查询:
– 外部表
– 临时表
– 固定表
– 视图,不能使用VERSIONS子句查询视图。但是,在视图定义中可使用VERSIONS子句。
• VERSIONS子句不能跨DDL 命令使用。
• 段收缩操作已过滤掉。
SELECT语句中的VERSIONS子句不能跨更改相应表的结构的多个DDL 语句生成行的版本。这意味着查询到达某个过去时间(此时更改了表结构)后会停止生成行。
诸如段收缩这样的维护操作可能会跨块移动表行。在这种情况下,因为行数据保持不变,所以版本查询会过滤掉此类幻像版本。
• 闪回表可将表恢复到特定的时间点。
• 闪回表是一个原位操作。
• 数据库保持联机。
闪回表概览
使用闪回表功能,可将一组表恢复到特定的时间点,而不需要执行传统的时间点恢复操作。
闪回表操作是在数据库处于联机状态时,通过只回退对指定表及其从属对象所做的更改,原位完成的。
闪回表语句可作为单个事务处理来执行。必须成功地闪回所有表,否则会回退整个事务处理。
注:可以使用闪回版本查询和闪回事务处理查询来确定适当的闪回时间。
闪回表
• 使用闪回表,可将一个或多个表还原到特定时间点,而不需要还原备份。
• 将从还原表空间检索数据来执行闪回表操作。
• 需要具有对特定表的FLASHBACK ANY TABLE或FLASHBACK对象权限。
• 需要对要闪回的表具有SELECT、INSERT、DELETE和ALTER权限。
• 必须对要执行闪回操作的表启用行移动。
闪回表
使用闪回表时,可以将一个或多个表还原到特定时间点,而不需要还原备份。使用此功能时,会还原表及其关联对象(如索引、约束条件、触发器等)中的数据。可从还原表空间检索用于满足闪回表请求的数据。可以使用闪回版本查询和闪回事务处理查询确定适当的闪回时间。
闪回表提供了一种方法,通过这种方法用户可方便快速地恢复意外的修改,而不需要数据库管理员的干预。必须为使用闪回表功能的所有用户授予FLASHBACK TABLE或FLASHBACK ANY TABLE系统权限。此外,还必须为用户授予SELECT、INSERT、DELETE和ALTER对象权限。
可以使用Oracle Enterprise Manager 对表执行闪回操作。向导会引导您完成整个过程。
ALTER TABLE employees ENABLE ROW MOVEMENT;
对表启用行移动
必须先对表启用行移动,然后才能对表执行闪回操作。启用了行移动之后,Oracle Server 便可移动表中的行。
使用Oracle Enterprise Manager 时,可通过执行以下步骤对表启用行移动:
1.在“Schema(方案)”属性页的“Database Objects(数据库对象)”区域中,选择“Tables(表)”。输入方案名以搜索表,然后单击“Go(开始)”。
2.单击要启用行移动的表的名称。此时会出现“View Table(查看表)”页。
3.单击“Edit(编辑)”进入“Edit Table(编辑表)”页。
4.单击“Options(选项)”选项卡,可在其中更改表的“Enable Row Movement(启用行移动)”设置。
5.将“Enable Row Movement(启用行移动)”设置为“Yes(是)”,然后单击“Apply(应用)”。此时会显示更新确认消息。
FLASHBACK TABLE hr.departments TO TIMESTAMP
TO_TIMESTAMP('2007-04-05 21:00:00','YYYY-MM-DD HH24:MI:SS');
执行闪回表
可以使用Oracle Enterprise Manager 对表执行闪回操作,步骤如下:
1. 在“Availability(可用性)”属性页上的“Backup/Recovery(备份/恢复)”区域中,选择“Perform Recovery(执行恢复)”。
2. 在“Object Level Recovery(对象层次恢复)”区域中,从“Object Type(对象类型)”下拉列表选择“Tables(表)”。
3. 选择“Flashback existing tables(闪回现有表)”作为“Operation Type(操作类型)”。
单击“Recover(恢复)”。此时会显示“Perform Object Level Recovery: Point-in-time(执行对象级恢复: 时间点)”页。
4. 选择“Flashback to a timestamp(闪回至时间戳)”或“Flashback to a known SCN(闪回至已知SCN)”,指定要闪回到的时间戳或SCN,然后单击“Next(下一步)”。
5. 单击“Add Tables(添加表)”,将表添加到闪回操作列表。单击“Next(下一步)”。
6. 如果存在从属表,则会显示“Dependency Options(相关性选项)”页。选择处理从属表的所需选项。通常,应选择“Cascade(级联)”来确保闪回一致。单击“Next(下一步)”。
7. 此时会显示“Perform Object Level Recovery: Review(执行对象级恢复: 复查)”页。复查信息后单击“Submit(提交)”。此时会出现“Confirmation(确认)”页。
注:还可以使用“Administration(管理)”页的“Schema(方案)”区域中的“Tables(表)”链接来闪回表。
所涉及到的SQL语句:
FLASHBACKTABLEHR.EMPLOYEES,HR.DEPARTMENTS,HR.JOBSTOTIMESTAMPto_timestamp('2013-10-07 19:23:02','YYYY-MM-DD HH24:MI:SS')
• FLASHBACK TABLE命令作为单个事务处理执行,要求获取
DML 排它锁。
• 不闪回统计信息。
• 保留当前索引和从属对象。
• 闪回表操作:
–
不能对系统表执行
– 不能跨DDL 操作
–
会生成还原和重做数据
闪回表:注意事项
• 整个FLASHBACK TABLE语句是在一个事务处理中执行的。将闪回所有指定表,或者不闪回任何指定表。
• 在执行操作的整个过程中,闪回表会获取对该语句指定的所有表的数据操纵语言(DML) 排它锁。
• 不会闪回受影响对象的统计信息。
• 会保留所有现有索引。不会重新创建删除的索引。还会自动保留相关的提交时实体化视图。
• 只要不违反任何表约束条件,就会闪回FLASHBACK TABLE语句中指定的表。如果在闪回执行期间违反了任何约束条件,则会中止操作,此时表的状态与调用
FLASHBACK TABLE语句之前的状态相同。
• 不能将表闪回至早于执行数据定义语言(DDL) 操作时的某个特定时间,因为执行数据定义语言(DDL) 操作变更了闪回操作中涉及的表的结构或收缩了表。只更改表的
存储属性的DDL 语句不受此限制。
• 不能对系统表、远程表和固定表执行闪回表操作。
FLASHBACK_TRANSACTION_QUERY
闪回事务处理查询
闪回事务处理查询是一种用于查看在事务处理级对数据库所做更改的诊断工具。这样,可诊断数据库中的问题并对事务处理执行分析和审计。
可以使用FLASHBACK_TRANSACTION_QUERY视图来确定所有必要的SQL 语句,以便用来还原由特定事务处理所做的或在特定时间段内所做的修改。
- 使用Oracle Enterprise Manager 执行闪回事务处理查询
使用Oracle Enterprise Manager 执行闪回事务处理查询
借助执行恢复向导,这个功能可与闪回版本查询功能结合使用。在“Perform Object Level Recovery: Choose SCN(执行对象级恢复: 选择SCN)”页上,单击“Flashback Version Query Result(闪回版本查询结果)”部分中对应的“Transaction ID(事务处理ID)”链接。
• DDL 命令被视为字典更新。
• 通过执行DDL 命令对事务处理执行闪回事务处理查询时,会显示对数据字典所做的更改。
• 删除的对象显示为对象编号。
• 删除的用户显示为用户标识符。
在数据库中,DDL 操作只是一系列空间管理操作和对数据字典所做的更改。通过执行DDL 命令对事务处理执行闪回事务处理查询时,会显示对数据字典所做的更改。
当闪回事务处理查询涉及从数据库中删除的表时,不会反映表名,而是使用对象编号。
如果删除了执行事务处理的用户,则该事务处理的闪回事务处理查询只显示相应的用户ID,而不是用户名。
注:当特定的事务处理没有足够的还原数据时,在FLASHBACK_TRANSACTION_QUERY的OPERATION列中会返回值为UNKNOWN的行。
参考闪回事务处理回退: http://blog.csdn.net/rlhua/article/details/12224763
• 建立闪回事务处理的先决条件
• 逐步完成可能的工作流
• 使用闪回事务处理向导
• 查询有依赖关系及没有依赖关系的事务处理
• 选择回退选项和闪回事务处理
• 检查结果
闪回事务处理
使用闪回事务处理,可以撤消事务处理及从属事务处理。Oracle DB 将确定事务处理之间的依赖关系,实际上,它会创建一个撤消不需要的更改的校正事务处理。数据库会倒回到似乎从未发生过该事务处理及从属于它的任何事务处理的状态。
可从Oracle Enterprise Manager 或PL/SQL 程序包中使用闪回事务处理功能。
先决条件
要使用此功能,必须启用
补充日志记录功能并建立正确的权限。例如,HR方案中的HR用户决定对REGIONS表使用闪回事务处理。SYSDBA在SQL*Plus 中执行下列设置步骤:
alter database add supplemental log data;
alter database add supplemental log data (primary key) columns;
grant execute on dbms_flashback to hr;
grant select any transaction to hr;
闪回事务处理
• 可使用Oracle Enterprise Manager 或命令行闪回事务处理。
• EM 使用闪回事务处理向导,该向导调用带NOCASCADE选项的DBMS_FLASHBACK.TRANSACTION_BACKOUT过程。
• 如果PL/SQL 调用成功完成,即意味着事务处理不具有任何依赖关系,并且已成功回退单个事务处理。
闪回事务处理
安全权限
要闪回或回退事务处理,也就是创建校正事务处理,必须对所有受影响的表具有SELECT、FLASHBACK和DML 权限。
使用条件
• 不支持跨相冲突的DDL 的事务处理回退。
• 事务处理回退从LogMiner 中继承数据类型支持。
建议
• 发现需要回退事务处理时,尽快启动回退操作的效果会比较好。重做日志太大和事务处理率过高会降低事务处理回退操作的速度。
• 为回退操作提供事务处理名称有利于稍后的审计工作。如果没有提供事务处理名称,会自动生成一个名称。
1. 查看表中的数据
2. 发现逻辑问题
3. 使用闪回事务处理
1.执行查询
2.选择事务处理
3.闪回事务处理(如果没有冲突)
4.选择其它回退选项(如果存在冲突)
4. 查看闪回事务处理结果
可能的工作流
假定有如下所示的几个事务处理:
connect hr
Enter password: oracle_4U <<< not displayed
INSERT INTO hr.regions VALUES (5,'Pole');
COMMIT;
UPDATE hr.regions SET region_name='Poles' WHERE region_id = 5;
UPDATE hr.regions SET region_name='North and South Poles' WHERE
region_id = 5;
COMMIT;
INSERT INTO hr.countries VALUES ('TT','Test Country',5);
COMMIT;
connect sys/<password> as sysdba
ALTER SYSTEM ARCHIVE LOG CURRENT;
在Oracle Enterprise Manager 中,在“Table(表)”下方选择HR.REGIONS,从“Actions(操作)”下拉列表中选择“Flashback Transaction(闪回事务处理)”,然后单击“Go(开始)”。此时会针对选定表调用闪回事务处理向导,并显示“Flashback Transaction: Perform Query(闪回事务处理: 执行查询)”页。
选择适当的时间范围,然后添加查询参数(指定的范围越具体,闪回事务处理向导进行搜索所用的时间就越短)。
如果没有Oracle Enterprise Manager,请使用DBMS_FLASHBACK.TRANSACTION_BACKOUT过程。
实际上,你可以将事务处理ID 数组作为依赖关系搜索的起点。
例如:
CREATE TYPE XID_ARRAY AS VARRAY(100) OF RAW(8);
CREATE OR REPLACE PROCEDURE TRANSACTION_BACKOUT(
numberOfXIDs NUMBER, -- number of transactions passed as input
xids XID_ARRAY, -- the list of transaction ids
options NUMBER default NOCASCADE, -- back out dependent
txn timeHint TIMESTAMP default MINTIME -- time hint on the txn
start
);
TRANSACTION_BACKOUT过程会检查依赖关系,例如:
• 连续编写(WAW)
• 主约束条件和唯一约束条件
• 外键约束条件
事务处理可以具有WAW 依赖关系,这意味着事务处理将更新或删除由从属事务处理插入或更新的行。例如,在主(或唯一)约束条件和强制外键约束条件的主/从关系中会发生这种情况。
要了解NONCONFLICT_ONLY和NOCASCADE_FORCE选项之间的差异,可以假定T1事务处理更改了行R1、R2和R3,T2事务处理更改了行R1、R3和R4。在此方案中,因为两个事务处理都更新了R1行,因此R1行成了“冲突”行。T2事务处理与T1事务处理具有WAW 依赖关系。使用NONCONFLICT_ONLY选项,可回退R2和R3,因为R2
和R3不存在冲突并且假定用户知道处理R1行的方法。使用NOCASCADE_FORCE选项,可回退全部三个行(R1、R2和R3)。
注:此屏幕快照不是工作流示例的一部分,但它显示了较复杂情况的其它详细资料。
闪回事务处理向导按以下方式运行:
如果带有NOCASCADE选项的DBMS_FLASHBACK.TRANSACTION_BACKOUT过程失败
(因为存在从属事务处理),则可以更改恢复选项。
• 使用“Nonconflict Only(仅限无冲突)”选项,可回退事务处理中的非冲突行,从而保持了数据库的一致性(虽然为了修复数据而破坏了事务处理的原子性)。
• 如果希望不考虑从属事务处理而强制回退给定的事务处理,使用“Nocascade Force(强制无级联)”选项。服务器按照与提交时间相反的顺序仅对给定事务处理执行校
正DML 命令。如果没有违反约束条件,你可以继续提交更改,否则会回退。
• 要按投寄顺序完全删除给定事务处理及其所有从属事务处理,使用“Cascade(级联)”选项。
选择回退选项后,会在DBA_FLASHBACK_TXN_STATE和DBA_FLASHBACK_TXN_REPORT视图中生成相关性报告。
• 检查显示了已回退的所有事务处理的相关性报告。
• 提交更改使其成为永久更改。
• 回退以放弃更改。
DBA_FLASHBACK_TXN_STATE视图包含事务处理的当前状态:该事务处理在系统中处于活动状态还是已被有效回退。系统将使用校正事务处理以原子方式维护此表。对于每个校正事务处理,可能存在多个行,其中每行都会提供校正事务处理已校正的事务处理间的依赖关系。
DBA_FLASHBACK_TXN_REPORT视图可提供关于数据库中已提交的所有校正事务处理的详细信息。此视图中的每一行都与一个校正事务处理相关联。