闪回事务处理回退是一个逻辑恢复选项,用于回退特定事务处理及相关事务处理,同时保持数据库联机。相关事务处理通过连续编写(WAW) 关系或主键约束关系相关联,在前者中事务处理对目标事务处理更改的同一数据进行修改,而在后者中事务处理重新插入由目标事务处理删除的同一主键值。闪回事务处理利用为还原块生成的还原和重做来创建并执行校正事务处理,以将受影响的数据还原到其原始状态。
闪回事务处理
• 建立闪回事务处理的先决条件
• 逐步完成可能的工作流
• 使用闪回事务处理向导
• 查询有相关性及没有相关性的事务处理
• 选择回退选项和闪回事务处理
• 检查结果
可从Enterprise Manager 或PL/SQL 程序包中使用闪回事务处理功能。
DBMS_FLASHBACK.TRANSACTION_BACKOUT
先决条件。1,2
1、闪回事务处理回退要求数据库处于
archivelog模式。
sys@TEST0924> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 36
Next log sequence to archive 38
Current log sequence 38
2、设置测试环境,以便使用闪回回退事务处理。
要使用此功能,必须启用补充事件记录功能并建立正确的权限。例如,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;
HR用户需要拥有表或拥有SELECT、UPDATE、DELETE和INSERT权限,这样才能执行校正还原SQL 代码。
sys@TEST0924> alter database add supplemental log data;
Database altered.
sys@TEST0924> alter database add supplemental log data (primary key) columns;
Database altered.
sys@TEST0924> grant execute on dbms_
flashback to hr;
Grant succeeded.
sys@TEST0924> grant select any transaction to hr;
Grant succeeded.
闪回事务处理
• 可使用Enterprise Manager 或命令行闪回事务处理。
• EM 使用闪回事务处理向导,该向导使用NOCASCADE选项调用DBMS_FLASHBACK.TRANSACTION_BACKOUT
过程。
• 如果PL/SQL 调用成功完成,即意味着事务处理不具有任何相关性,并且已成功回退单个事务处理。
安全权限
要闪回或回退事务处理,也就是创建校正事务处理,必须对所有受影响的表具有SELECT、FLASHBACK和DML 权限。
使用条件
• 相冲突的DDL 不支持事务处理回退。
• 事务处理回退从LogMiner 中继承数据类型支持。
建议
• 发现需要回退事务处理时,尽快启动回退操作的效果会比较好。重做日志太大和事务处理率过高会降低事务处理回退操作的速度。
• 为回退操作提供事务处理名称有利于稍后的审计工作。如果没有提供事务处理名称,会自动生成一个名称。
可能的工作流
• 查看表中的数据
• 发现逻辑问题
• 使用闪回事务处理
– 执行查询
– 选择事务处理
– 闪回事务处理(如果没有冲突)
– 选择其它回退选项(如果存在冲突)
• 查看闪回事务处理结果
3、用hr连接数据库,并创建第一个测试事务处理,该事务处理要插入5行。
sys@TEST0924> conn hr/hr
Connected.
hr@TEST0924> insert into regions values(10,'Pole');
1 row created.
hr@TEST0924> insert into regions values(20,'Moon');
1 row created.
hr@TEST0924> insert into regions values(30,'Venus');
1 row created.
hr@TEST0924> insert into regions values(40,'Mars');
1 row created.
hr@TEST0924> insert into regions values(50,'Saturn');
1 row created.
hr@TEST0924> commit;
Commit complete.
4、继续创建第二个测试事务处理,该事务处理要更新刚出入的两行。
此时将创建连续编写(WAW)依赖性。
当事务处理更新或删除由从属事务处理插入或更新的行时,就存在WAW依赖性。
hr@TEST0924> update regions set region_name='Two Poles' where region_id=10;
1 row updated.
hr@TEST0924> update regions set region_name='Many Moons' where region_id=20;
1 row updated.
hr@TEST0924> commit;
Commit complete.
5、创建第三个事务处理,该事务处理要更新三行,其中的一行也在前面的事务处理中更新过。
次操作将创建另一个WAW依赖性。
hr@TEST0924> update regions set region_name='No star' where region_id=
10;
1 row updated.
hr@TEST0924> update regions set region_name='Red star' where region_id=40;
1 row updated.
hr@TEST0924> update regions set region_name='Big star' where region_id=50;
1 row updated.
hr@TEST0924> commit;
Commit complete.
6、继续创建第四个事务处理,该事务处理要更新在事务处理1中出入的行。
此操作将创建另一个WAW依赖性。
hr@TEST0924> update regions set region_name='Still called Venus' where region_id=30;
1 row updated.
hr@TEST0924> commit;
Commit complete.
7、以sys用户连接到数据库并切换日志。闪回事务处理至少需要一份归档日志才能启动分析重做。然后退出。
hr@TEST0924> conn /as sysdba
Connected.
sys@TEST0924>
alter system archive log current;
System altered.
sys@TEST0924>
alter system archive log current;
System altered.
sys@TEST0924> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
8、事务处理可具有连续编写(WAW) 依赖性,这意味着事务处理会更新或删除由以前的事务处理插入或更新的行数据。
在此部分中,希望回退错误事务处理,该事务处理除了产生WAW依赖性外,还导致了不正确的更改。
执行以下步骤:
我的em地址:
https://10.27.1.208:1158/em
第一次使用em应先
emctl start dbconsole
[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
1、以sys用户身份登录Enterprise Manager Database Control。
2、怀疑regions表包含错误事务处理所导致的更改,希望查看完整的表数据。
单击“Schema(方案)”选项卡,然后单击“Database Objects(数据库对象)”下的“Tables(表)”。
3、要查看属于 HR 方案用户的所有表,在“Schema(方案)”字段中输入HR 并单击“Go(执行)”按钮。
4、在“Tables(表)”页上,选择 REGIONS 表,然后选择“Actions(操作)”下拉列表中的“View Data(查看数据)”。单击“Go(执行)”按钮查看 HR.REGIONS 表中的数据。
5、查看表内容时,认为它不应包含以下行
:“Many moons”和“Still called Venus”。单击“OK(确定)”。
6、单击“OK(确定)”返回表的列表并选择 REGIONS 表,然后选择“Actions(操作)”下拉列表中的“Flashback Transaction(闪回事务处理)”,并单击“Go(执行)”按钮,此时会针对选定表调用闪回事务处理向导。
8、复查查询条件。指定您认为发生错误更改的时间段。
选择适当的时间范围,然后添加查询参数(指定的范围越小,搜索闪回事务处理向导用的时间就越短)。
对于本示例,接受默认的时间段并单击“Next(下一步)”。
在Enterprise Manager 中,闪回事务处理与LogMiner 无缝集成在一起(如此页中所示)。
如果没有Enterprise Manager,请使用DBMS_FLASHBACK.TRANSACTION_BACKOUT过
程(《PL/SQL Packages and Types Reference》中提供了有关此过程的说明)。实际上,可以将事务处理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
);
9、在“Flashback Transaction: Select Transaction(闪回事务处理:选择事务处理)”页上,
单击已更新了两个区域的事务处理的“Transaction ID(事务处理ID)”链接。
10、在“Select Transaction: Show Details(选择事务处理:显示详细信息)”页上,查看错误的 UPDATE 命令,并单击“OK(确定)”。
10、单击“Next(下一步)”标识所有从属事务处理并回退所有所需更改。
此时将显示“Processing: Flashback Transaction(正在处理:闪回事务处理)”窗口。在“Flashback Transaction: Show Dependencies(闪回事务处理:显示相关性)”页上,单击第一个“Transaction ID(事务处理ID)”链接。
首先,显示事务处理的详细信息以确认正在闪回正确的事务处理,然后,选择违规事务处理并继续按照向导执行操作。
11、在“Show Dependencies: Details(显示相关性:详细资料)”页上,查看 校正事务处理。请注意,其中一个校正事务处理已被执行,它被标记为[exec=yes]。另一个未执行,被标记为 [exec=no]。单击“OK
(确定)”。
12、在“Flashback Transaction: Show Dependencies(闪回事务处理:显示相关性)”页上,单击“Change Recovery Option(更改恢复选项)”按钮。
13、在“Show Dependencies: Change Recovery Option(显示相关性:更改恢复选项)”页上,选择“Cascade(级联)”,这也会回退错误的从属事务处理更改,然后单击“OK(确定)”。
14、在“Flashback Transaction: Show Dependencies(闪回事务处理:显示相关性)”页上,单击“Next(下一步)”。
15、在“Flashback Transaction: Show Dependencies(闪回事务处理:显示相关性)”页上,单击“Next(下一步)”。单击“Show Undo SQL Script(显示还原SQL 脚本)”按钮。
16 、在“Review:Show Undo SQL(复查:显示还原SQL)”页上,复查所有校正 UPDATE 命令,然后单击“OK(确定)”。
update "HR"."REGIONS" set "REGION_NAME" = 'Saturn' where "REGION_ID" = '50' and "REGION_NAME" = 'Big star';
update "HR"."REGIONS" set "REGION_NAME" = 'Mars' where "REGION_ID" = '40' and "REGION_NAME" = 'Red star';
update "HR"."REGIONS" set "REGION_NAME" = 'Two Poles' where "REGION_ID" = '10' and "REGION_NAME" = 'No star';
update "HR"."REGIONS" set "REGION_NAME" = 'Moon' where "REGION_ID" = '20' and "REGION_NAME" = 'Many Moons';
update "HR"."REGIONS" set "REGION_NAME" = 'Pole' where "REGION_ID" = '10' and "REGION_NAME" = 'Two Poles';
17、在“Execute SQL(执行SQL)”区域中输入以下命令,然后单击“Execute SQL(执行SQL)”按钮,预览校正还原语句生成的结果:SELECT * FROM HR.REGIONS;
18、请注意,“Many Moons”行已从结果列表中消失。单击“OK(确定)”。
19、在“Flashback Transaction: Review(闪回事务处理:复查)”页中,单击“Finish(完成)”。
20、闪回事务处理执行成功。单击“OK(确定)”。
21、返回到 HR.REGIONS 表并查看其内容。返回到“Tables(表)”页。指定HR 作为“Schema(方案)”,单击“Go(执行)”,选择 REGIONS 表,
从“Actions(操作)”下拉列表中选择“View Data(查看数据)”,然后单击“Go(执行)”。
显示还原SQL脚本
update "HR"."REGIONS" set "REGION_NAME" = 'Venus' where "REGION_ID" = '30' and "REGION_NAME" = 'Still called Venus';
22、表的内容与上述四个步骤显示的内容相同。由于事务处理2 和4 之间不存在WAW 依赖性,所以回退事务处理2 和3,而仍保留事务处理4(区域名设置为“Still called Venus”)。
23、注销EM。
选择其它回退选项
TRANSACTION_BACKOUT过程可检查相关性,例如:
• 连续编写(WAW)
• 主约束条件和唯一约束条件
事务处理可以具有WAW 相关性,这意味着事务处理将更新或删除由相关事务处理插入或更新的行。例如,在主(或唯一)约束条件和强制外键约束条件的主/从关系中会发生这种情况。
要了解NONCONFLICT_ONLY和NOCASCADE_FORCE选项之间的差异,可以假定T1 事务处理更改了R1 行、R2 行和R3 行,T2 事务处理更改了R1 行、R4 行和R5 行。在此方案中,因为两个事务处理都更新了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视图可提供关于数据库中已提交的所有校正事务处理的详细信息。此视图中的每一行都与一个校正事务处理相关联。
*_FLASHBACK_TXN_REPORT 显示相关的XML 信息
*_FLASHBACK_TXN_STATE 显示已回退的事务处理的事务处理标识符
sys@TEST0924> desc DBA_FLASHBACK_TXN_STATE
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
COMPENSATING_XID RAW(8)
XID RAW(8)
DEPENDENT_XID RAW(8)
BACKOUT_MODE VARCHAR2(16)
USERNAME NOT NULL VARCHAR2(30)
sys@TEST0924> select * from
DBA_FLASHBACK_TXN_STATE;
COMPENSATING_XID XID DEPENDENT_XID BACKOUT_MODE USERNAME
---------------- ---------------- ---------------- ---------------- ------------------------------
0D001F002F000000 0F00000008000000 CASCADE SYS
0D001F002F000000 0E00190006000000 0F00000008000000 CASCADE SYS
1100110010000000 0E000A0007000000 NONCONFLICT_ONLY SYS
sys@TEST0924> desc
dba_flashback_txn_report
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
COMPENSATING_XID NOT NULL RAW(8)
COMPENSATING_TXN_NAME VARCHAR2(256)
COMMIT_TIME DATE
XID_REPORT CLOB
USERNAME NOT NULL VARCHAR2(30)
sys@TEST0924> select * from dba_flashback_txn_report
2 ;
COMPENSATING_XID COMPENSATING_TX COMMIT_TI
---------------- --------------- ---------
XID_REPORT
--------------------------------------------------------------------------------
USERNAME
------------------------------
1100110010000000 _SYS_COMP_TXN_2 01-OCT-13
425293_TIM_1380
674969
<?xml version="1.0" encoding="ISO-8859-1"?>
<COMP_XID_REPORT XID="1100110010000000" NAME="_SYS_COMP_TXN_2425293_TIM_13806749
69">
<TRANSACTION XID="0E000A0007000000">
<CHARACTERISTICS>
</CHARACTERISTICS>
<UNDO_SQL>
<USQL exec="yes">
update "HR"."REGIONS" set "REGION_NAME" = 'Venus' where "REGION_ID" = '30' an
d "REGION_NAME" = 'Still called Venus'
</USQL>
</UNDO_SQL>
<DEPENDENT_XIDS>
</DEPENDENT_XIDS>
</TRANSACTION>
<EXECUTED_UNDO_SQL>
<EXEC_USQL>update "HR"."REGIONS" set "REGION_NAME" = 'Venus' where "REGION_ID" =
'30' and "REGION_NAME" = 'Still called Venus'
</EXEC_USQL>
</EXECUTED_UNDO_SQL>
</COMP_XID_REPORT>
SYS
0D001F002F000000 _SYS_COMP_TXN_2 01-OCT-13
425293_TIM_1380
673343
<?xml version="1.0" encoding="ISO-8859-1"?>
<COMP_XID_REPORT XID="0D001F002F000000" NAME="_SYS_COMP_TXN_2425293_TIM_13806733
43">
<TRANSACTION XID="0E00190006000000">
<CHARACTERISTICS>
</CHARACTERISTICS>
<UNDO_SQL>
<USQL exec="yes">
update "HR"."REGIONS" set "REGION_NAME" = 'Moon' where "REGION_ID" = '20' and
"REGION_NAME" = 'Many Moons'
</USQL>
<USQL exec="yes">
update "HR"."REGIONS" set "REGION_NAME" = 'Pole' where "REGION_ID" = '10' and
"REGION_NAME" = 'Two Poles'
</USQL>
</UNDO_SQL>
<DEPENDENT_XIDS>
<TRANSACTION XID="0F00000008000000">
<CHARACTERISTICS>
</CHARACTERISTICS>
<UNDO_SQL>
<USQL exec="yes">
update "HR"."REGIONS" set "REGION_NAME" = 'Saturn' where "REGION_ID" = '50'
and "REGION_NAME" = 'Big star'
</USQL>
<USQL exec="yes">
update "HR"."REGIONS" set "REGION_NAME" = 'Mars' where "REGION_ID" = '40' an
d "REGION_NAME" = 'Red star'
</USQL>
<USQL exec="yes">
update "HR"."REGIONS" set "REGION_NAME" = 'Two Poles' where "REGION_ID" = '1
0' and "REGION_NAME" = 'No star'
</USQL>
</UNDO_SQL>
<DEPENDENT_XIDS>
</DEPENDENT_XIDS>
</TRANSACTION>
</DEPENDENT_XIDS>
</TRANSACTION>
<EXECUTED_UNDO_SQL>
<EXEC_USQL>update "HR"."REGIONS" set "REGION_NAME" = 'Saturn' where "REGION_ID"
= '50' and "REGION_NAME" = 'Big star'
</EXEC_USQL>
<EXEC_USQL>update "HR"."REGIONS" set "REGION_NAME" = 'Mars' where "REGION_ID" =
'40' and "REGION_NAME" = 'Red star'
</EXEC_USQL>
<EXEC_USQL>update "HR"."REGIONS" set "REGION_NAME" = 'Two Poles' where "REGION_I
D" = '10' and "REGION_NAME" = 'No star'
</EXEC_USQL>
<EXEC_USQL>update "HR"."REGIONS" set "REGION_NAME" = 'Moon' where "REGION_ID" =
'20' and "REGION_NAME" = 'Many Moons'
</EXEC_USQL>
<EXEC_USQL>update "HR"."REGIONS" set "REGION_NAME" = 'Pole' where "REGION_ID" =
'10' and "REGION_NAME" = 'Two Poles'
</EXEC_USQL>
</EXECUTED_UNDO_SQL>
</COMP_XID_REPORT>
SYS