oracle补充日志

简介

概述

  • Oracle 补充日志(supplemental log)又叫附加日志,可以指示数据库在日志中添加额外信息到日志流中,以支持基于日志的工具,如逻辑standby、streams、GoldenGate、LogMiner。
  • 补充日志不是独立的一种日志,是对重做记录中变更矢量的补充信息,增加了变更矢量记载的记录量,Oracle数据库某些功能要求启用补充日志才能正常地或更好的工作,如logminer、DG、闪回事务查询、闪回事务。
  • 补充日志可以在数据库级别和表级别上启用

说明

  • 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命令。

操作命令

1.数据库级别

数据库级的补充日志,共同点是启用和关闭导致所有SQL游标非法。
无论需要启用哪一种标识关键字段补充日志,都需要启用最小补充日志,4种标识关键字段的效果可以累加,不冲突。

查看是否启用补充日志

若结果返回YES或IMPLICIT则说明已开启对应的补充日志,当使用ALL,PRIMARY,UNIQUE或FOREIGN补全日志时最小补充日志默认开启(即查询结果为IMPLICIT)。

SELECT SUPPLEMENTAL_LOG_DATA_MIN MIN,  --最小补充日志
       SUPPLEMENTAL_LOG_DATA_PK  PK,   --主键补充日志
       SUPPLEMENTAL_LOG_DATA_UI  UI,   --唯一索引补充日志
       SUPPLEMENTAL_LOG_DATA_FK  FK,   --外键补充日志
       SUPPLEMENTAL_LOG_DATA_ALL ALL_COLUMN --全字段补充日志
  FROM V$DATABASE;
启用/关闭补充日志(数据库级别)
  1. 最小补充日志(minimal supplemental logging)
    启用最小补充日志可以确保LogMiner(或其他任何基于LogMiner的产品)支持行链接、簇表、索引组织表等。
    语法如下:
--开启最小补充日志
alter database add supplemental log data;
--关闭最小补充日志
alter database drop supplemental log data;
  1. 标识键补充日志
    在源库日志为变化来源同步其他数据库的情况下,比如逻辑备用数据库,受影响的数据行必须以列数据标识(而不是rowid),必须启用此种附加日志。
    缺省情况下,Oracle不启用以上任何附加日志。当使用ALL,PRIMARY,UNIQUE或FOREIGN附加日志时最小补全日志默认开启(即检查结果为IMPLICIT)。 在删除所有导致IMPLICIT最小化附加日志的附加日志后,最小化附加日志变为NO。
    • 2.1 主键补充日志:
      在update 命令的重做记录中添加被修改行的主键字段的旧值,无论是否被修改,都记录。如果表没有主键,则由长度最小的唯一索引字段代替,若连唯一索引也没有,则记录该行所有字段。
      语法如下(开启/关闭):
      alter database add supplemental log data (Primary key) columns ;
      alter database drop supplemental log data (Primary key) columns ;
    • 2.2 唯一索引补充日志:
      唯一索引主要是为 复合索引(唯一)服务的。只有唯一索引的字段被 update 时,才会记录该字段被修改前的值。
      语法如下(开启/关闭):
      alter database add supplemental log data (unique) columns;
      alter database drop supplemental log data (unique) columns;
    • 2.3 外键补充日志:
      同唯一索引补充日志一样,只有外键字段被 update 时,才会记录被修改前的旧值,即也是为复合外键服务的。
      语法如下(开启/关闭):
      alter database add supplemental log data (foreign key ) columns ;
      alter database drop supplemental log data (foreign key ) columns ;
    • 2.4 全字段补充日志
      顾名思义就所有字段的值不论是否被修改都记录。会导致磁盘快速增长,LGWR进程繁忙。不建议使用。
      语法如下(开启/关闭):
      alter database add supplemental log data (all) columns ;
      alter database drop supplemental log data (all) columns ;

2.表级别

只是针对某个表,没有必要在整个数据库范围启用补充日志功能,在启用表级补充日志之前,应该先启用数据库级最小补充日志。
表级补充日志分为主键、唯一索引、外键、全字段和自定义5种类型,前四种和数据级对应的类型特点一致,只是在特定的表上启用。
特定表上的表级补充日志的启用与关闭会导致所有引用该表的SQL游标非法,会引起一段时间的硬分析增加。

查看是否启用补充日志
SELECT G.LOG_GROUP_NAME,
       G.OWNER || '.' || G.TABLE_NAME TABLE_NAME,
       G.ALWAYS,
       G.GENERATED,
       C.COLUMN_NAME
  FROM DBA_LOG_GROUPS G
  LEFT JOIN DBA_LOG_GROUP_COLUMNS C
    ON G.LOG_GROUP_NAME = C.LOG_GROUP_NAME
   AND G.TABLE_NAME = C.TABLE_NAME
 ORDER BY 1, 2, 3, 4;
启用/关闭补充日志(表级别)
  1. 可以通过以下语句启用/关闭所有列或主键/外键/唯一键组合日志组:
    alter table table_name add supplemental log data(all,primary key,unique,foreign key) columns;
    alter table table_name drop supplemental log data(all,primary key,unique,foreign key) columns;
  2. 可以通过以下语句设置命名(自定义)日志组:
    语法:
    alter table table_name add supplemental log group group_a(column_a [no log],column_b,...) [always];
    增加命名日志组group_a:
    alter table test add supplemental log group group_a(x,y);
    删除命名日志组group_a:
    alter table test drop supplemental log group group_a;
    • NO LOG选项用于指定在日志中排除哪些列。
      在命名日志组中,至少存在一个无”NO LOG“的定长列。比如,对LONG列使用 no log选项,可以在更改LONG列时,记录其他列的内容(LONG列本身不能存在日志里)。
    • ALWAYS选项, 在更新时,日志组中的所有列都会记录在日志中。
      这就是所谓的”无条件“日志组,有时也叫”always log group“。如果不指定该选项,只有在日志组中的任何列被修改时,所有列才会出现在日志中。这就是所谓的”有条件“日志组。
    • 说明:同一列可以在多个日志组中存在,但日志中只记录一次;同一列在“无条件”与“有条件”日志组中存在时,该列将“无条件”记录。

参考资料

  1. Oracle中的补充日志(supplemental log)
  2. Oracle补充日志
  3. Oracle补全日志(Supplemental logging)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一点见解

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值