Oracle-suppelmental log

概述

附加日志(suppelmental log)是指在数据库的redo记录中添加额外的信息,以支持基于日志类工具正常工作,如:logminer, streams, goldengate, logical standby。

附加日志主要针对update命令,避免因update命令造成行迁移和行移动。

按设置对象分类

  • 数据库级设置
  • 表级设置

数据库级设置

最小附加日志(minimal supplemental logging)
-- 语法:
alter database {add|drop} supplemental log data;

启用或禁用最小附加日志

标识键日志(identification key logging)

标识键有如下类型:all, primary key, unique key, foreign key

标识键日志是对指定columns启用或关闭最小日志及列数据日志。当开启 all, primary, unique和foreign 附加日志时,若最小补充日志尚未启用,则oracle会隐式开启最小补充日志,其状态为IMPLICIT。

-- 语法
alter database {add|drop} supplemental log {data(all,primary key,unique,foreign key) columns};

alter database add supplemental log data(primary key) columns;

image-20210826100232253

查看当前设置
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 allc
  FROM v$database;

如果某一列的值为"YES",表明开启了对应的附加日志。如果开启标识键日志时,对应列的值为"YES",同时

supplemental_log_data_min列的值为"IMPLICIT"

注意事项
  • 启用或关闭数据库级别的附加日志时,都会导致共享池中SQL语句的游标失效,从而导致短期解析明显增加
  • 可能导致日志量暴增,建议每张表有主键或至少一个非空的唯一键

表级附加日志设置

设置命名日志组
alter table table_name 
{add|drop} supplemental log group group_a(column_a [no log],column_b,...) [always];
  • no log:用于指定在日志中排除的列,在命名日志组中,至少存在一个无"no log"选项的定长列
  • always:在更新时,日志组中的所有列都会记录在日志中。也称为“无条件”日志组。如果不指定always选项,只有在日志组中任何列被修改时,才会记录到日志中,称为“有条件”日志组。
设置所有列或主键/外键/唯一键组合日志组
alter table table_name 
{add|drop} supplemental log data(all,primary key,unique,foreign key) columns;
  • ALL:日志中将包含所有的最大长度固定的列
  • PRIMARY KEY:只要有更新,组成主键的所有列都会记录在日志中
查看日志组信息
set lines 168 pages 99
col owner for a16
col log_group_name for a16
col table_name for a16
col log_group_type for a16
col always for a8
col generated for a12
col column_name for a32
select lg.owner, lg.log_group_name, lg.table_name, lg.log_group_type, lg.always, lg.generated, lgcs.column_name, lgcs.position, lgcs.logging_property 
  from dba_log_groups lg, dba_log_group_columns lgcs
where lg.LOG_GROUP_NAME = lgcs.LOG_GROUP_NAME(+)
and lg.TABLE_NAME = lgcs.TABLE_NAME(+)
and lg.owner = lgcs.owner
;

image-20210826105126828

测试
组合日志组
drop table test;
create table test(x int,y int);
 
--增加附加日志
alter table test
add supplemental log data(all,primary key,unique,foreign key) columns;

--删除附加日志
alter table test
drop supplemental log data(all,primary key,unique,foreign key) columns;
命名日志组
--增加命名附加日志
alter table test
add supplemental log group group_a(x,y);

--删除命名附加日志
alter table test
drop supplemental log group group_a;
原文地址:https://www.cnblogs.com/binliubiao/p/15188993.html