概述
附加日志(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;
查看当前设置
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
;
测试
组合日志组
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;