supplemental log介绍及实例演示

关于Oracle补全日志补充说明
Oracle日志(redo log)一般用于实例恢复和介质恢复,但是如果需要靠日志还原完整的DML操作信息(比如Logmnr、Streams和这里的Goldengate),默认记录的日志量还不够。比如一个UPDATE的操作,默认redo只记录了rowid以及被修改的字段信息,但这里GoldenGate还原这个事务,因为不是根据rowid而是SQL层面根据唯一键值来定位记录,所以还需要将主键或者其他字段的信息附加到日志中去。要往日志中增加这些额外字段信息的操作,就是开启补全日志,即Add Supplemental Logging。打开补全日志,会使数据库的日志量增加,所以只打开需要的级别和对象即可。
Oracle补全日志可以在数据库级别设置,也可以在表级别设置。在数据库级别中,补全日志按补全的信息量,对应好几个级别:
(1)        最小附加日志(Minimal supplemental logging):是开启logmnr的最低日志要求,提供了行链接(chained rows)和多种数据存储(比如聚簇表、索引组织表)的信息。在Oracle 9.2之后的版本中,默认都不开启。
(2)        主键补全(Primary key supplemental logging):在日志中补全所有主键列。如果表中无主键,则补全一个非空唯一索引列;如果非空唯一索引键也没,那么会补全除了LOB和LONG类型字段以外的所有列,这时就和下面的所有补全一样了。
(3)        唯一键补全(Unique key supplemental logging):当唯一键列或位图索引列被修改时,在日志中补全所有唯一键列或位图索引列。打开唯一键补全也会同时打开主键补全。注意这个级别是需要条件触发的。
(4)        外键补全(Foreign Key supplemental logging):当外键列被修改时,将在日志中补全所有外键列。这个级别也是需要条件触发的。
(5)        所有补全(All supplemental logging):在日志中补全所有字段(排除LOB和LONG类型)。


这里对于补全日志的详细操作语句不做一一说明。
数据库级别中的5个类型中,除了最小附加日志级别,都可以在表级进行设置。除此之外,表级还可以明确指定需要补全的列。
Oracle表级补全日志需要在最小补全日志打开的情况下才起作用,即若一个数据库没有开最小补全日志或之前drop supplemental log data操作则即便指定了表级补全日志,实际在重做日志输出的过程中描述的记录仍只记录rowid和相关列值。而要关闭最小补全日志,也必须首先关闭数据库级别的其他补全级别后,才能关闭。




题目:
What are the prerequisites for performing flashback transactions? (Choose all that apply)
A.Supplemental log must be enabled
B.Supplemental log must be enabled for the primary key
C.Undo retention guarantee for the database must be configured
D.EXECUTE permission on the DBMS_FLASHBACK package must be granted to the user
Answer: ABD



闪回事务处理回退是一个逻辑恢复选项,用于回退特定事务处理及相关事务处理,同时保持数据库联机。相关事务处理通过连续编写(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
update "HR"."REGIONS" set "REGION_NAME" = 'Venus' where "REGION_ID" = '30' an
d "REGION_NAME" = 'Still called Venus'
update "HR"."REGIONS" set "REGION_NAME" = 'Venus' where "REGION_ID" =
'30' and "REGION_NAME" = 'Still called Venus'
SYS
0D001F002F000000 _SYS_COMP_TXN_2 01-OCT-13
425293_TIM_1380
673343
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'
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' an
d "REGION_NAME" = 'Red star'
update "HR"."REGIONS" set "REGION_NAME" = 'Two Poles' where "REGION_ID" = '1
0' and "REGION_NAME" = 'No star'
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_I
D" = '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'
SYS



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29196873/viewspace-1076796/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29196873/viewspace-1076796/

你可能感兴趣的:(supplemental log介绍及实例演示)