Oracle之补全日志(Supplemental Logging)、附加日志

0    354    1

Tags:

👉 本文共约3632个字,系统预计阅读时间或需14分钟。

简介

Oracle日志(redo log)一般用于实例恢复和介质恢复,但是如果需要靠日志还原完整的DML操作信息(比如Logmnr、Streams和这里的Goldengate),默认记录的日志量还不够。比如一个UPDATE的操作,默认redo只记录了rowid以及被修改的字段信息,但这里GoldenGate还原这个事务,因为不是根据rowid而是SQL层面根据唯一键值来定位记录,所以还需要将主键或者其他字段的信息附加到日志中去。要往日志中增加这些额外字段信息的操作,就是开启补全日志,即Add Supplemental Logging,也叫附加日志或补充日志。

打开补全日志,会使数据库的日志量增加,所以只打开需要的级别和对象即可。

说明

Oracle中insert、delete命令在默认情况下产生的重做记录足以表明被修改的行的每个字段在被修改前后的值是什么,insert,变更前行不存在,产生的重做记录会记载新行的每个字段的值,delete,变更后不存在,但是由于重做记录也要负责产生撤销数据块的变更,所以行被删除之前的各字段的值也记录在撤销数据块的变更矢量中,也就是insert和delete命令的重做记录中,能找到整行的所有信息。
update不同于insert和delete一定会涉及一行的所有字段,常常只是更改一个或几个字段,处于对性能的考虑,Oracle没必要把修改的字段的值也保存在变更矢量中,事实上是在撤销块的比昂矢量中只记载被修改的字段的更改前的值,而在数据块的变更矢量中则记载了被修改的字段的新值,同一行中其他没有被修改的字段,不会记载其修改前的值,因为没有被修改。
如:update scott.emp set sal=12000 where empno=7369 ;
为了支持实例恢复和介质恢复,其重做记录只需要记载sal字段的值为12000即可,在常规的重做记录中完全不会出现empno为7369的信息。
insert、delete、update的常规重做记录具体记载何种信息是以保证实例恢复与介质恢复能够正常进行为标准的,不相关的信息不会记录在重做日志中。正是因为有撤销数据块的变更矢量,所以保证实例恢复与介质恢复也间接地保证了回滚操作可以被执行。
如果启用了补充日志,数据块的变更矢量的记载可以变为; sal字段的值为12000,并且再额外的记录该行被修改之前第一个字段empno的值是7369以及sal为800(修改之前的值),更多的信息意味着update命令被等价还原的可能性提高了,数据的恢复性提高。
补充日志主要就是为update服务,补充的目的就是要高度还原真实的update命令。

分类

Oracle补全日志可以在数据库级别设置,也可以在表级别设置。在数据库级别中,补全日志按补全的信息量,对应几个级别:
(1)最小附加日志(Minimal supplemental logging):是开启logmnr的最低日志要求,提供了行链接(chained rows)和多种数据存储(比如聚簇表、索引组织表)的信息。在Oracle 9.2之后的版本中,默认都不开启。
(2)主键补全(Primary key supplemental logging):在日志中补全所有主键列。如果表中无主键,则补全一个非空唯一索引列;如果非空唯一索引键也没,那么会补全除了LOB和LONG类型字段以外的所有列,这时就和下面的所有补全一样了。
(3) 唯一键补全(Unique key supplemental logging):当唯一键列或位图索引列被修改时,在日志中补全所有唯一键列或位图索引列。打开唯一键补全也会同时打开主键补全。注意这个级别是需要条件触发的。唯一索引主要是为 复合索引(唯一)服务的。只有唯一索引的字段被 update 时,才会记录该字段被修改前的值。
(4)外键补全(Foreign Key supplemental logging):当外键列被修改时,将在日志中补全所有外键列。这个级别也是需要条件触发的。同唯一索引补充日志一样,只有外键字段被 update 时,才会记录被修改前的旧值,即也是为复合外键服务的。
(5)所有补全(All supplemental logging):在日志中补全所有字段(排除LOB和LONG类型)。顾名思义就所有字段的值不论是否被修改都记录。会导致磁盘快速增长,LGWR进程繁忙。不建议使用。

数据库级别中的5个类型中,除了最小附加日志级别,都可以在表级进行设置。除此之外,表级还可以明确指定需要补全的列。

Oracle表级补全日志需要在最小补全日志打开的情况下才起作用,即若一个数据库没有开最小补全日志或之前drop supplemental log data操作则即便指定了表级补全日志,实际在重做日志输出的过程中描述的记录仍只记录rowid和相关列值。而要关闭最小补全日志,也必须首先关闭数据库级别的其他补全级别后,才能关闭。

补充日志不是独立的日志,而是对重做日志变更矢量的补充。LogMiner、闪回事务、闪回事务查询等功能需要开启补充日志才能正常工作。

补充日志可分为两类数据库级别补充日志和表级别补充日志,数据库级别补充日志可分为最小补充日志、主键补充日志、唯一索引补充日志、外键补充日志、全体补充日志6种,表级别补充日志在数据库级别补充日志的基础上增加了一种自定义补充日志,没有最小补充日志。

因为insert会记录所有修改后字段,delete会记录所有修改前字段,所以补全日志只对update产生影响,开启补全日志时共享池中的SQL游标都会失效,他们的影响和功能如下:

最小补充日志主键补充日志唯一补充日志
Update操作的影响产生特殊的日志信息,可以识别update命令产生的行迁移和行转换。Logminer和闪回事务查询功能需要最小补全日志支持。打开最小补全日志会使共享池SQL游标失效。无条件补充日志,无论主键是否被修改旧值都会被记录到日志中。没有主键则记录长度最小唯一非空索引,没有非空唯一索引则记录所有字段。依赖最小补全日志,开启主键补充日志自动开启最小补充日志。关闭最小补全日志自动关闭主键补全日志有条件补充日志,当复合唯一索引的其中一个字段被修改时,唯一索引的所有字段旧值都会被记录。唯一补充日志专门为复合唯一索引服务。
开启/关闭开启/关闭:
alter database add/drop supplemental log data。
开启/关闭(数据库级):
alter database add/drop supplemental log data (primary key) columns。
开启/关闭(表级):
alter table T1 add/drop supplemental log data (primary key) columns。
开启/关闭(数据库级):
alter database add/drop supplemental log data (unique) columns。
开启/关闭(表级): alter table T1 add/drop supplemental log data (unique) columns。
依赖依赖最小补全日志依赖最小补全日志
外键补充日志全体补充日志自定义补充日志(表)
Update操作的影响有条件补充日志,当复合外键索引的其中一个字段被修改时,外键索引的所有字段旧值都会被记录。唯一补充日志专为复合外键索引服务。无条件补充日志,表的所有字段旧值都会被记录(除了LOB、LONG类型)。有/无条件补充日志,设置多个字段为日志组,日志组中的任何字段被修改,整个日志组字段的旧值都记录在日志中。
开启/关闭开启/关闭(数据库级):
alter database add/drop supplemental log data (foreign key) columns。
开启/关闭(表级): alter table T1 add/drop supplemental log data (foreign key) columns。
开启/关闭(数据库级):
alter database add/drop supplemental log data (all) columns。
开启/关闭(表级): alter table T1 add/drop supplemental log data (all) columns。
开启/关闭(表级):
alter table T1 add/drop supplemental log group GROUPNAME(C1,C2,C3) allways。
依赖依赖最小补全日志依赖最小补全日志依赖最小补全日志

配置和查询

数据库

可以通过以下SQL检查最小补全日志是否已经开启:

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复