一、说明
补充日志是对重做记录中变更矢量的补充信息。
Oracle的一些功能需要补充日志才能使用。比如LogMiner、闪回事务查询、闪回事务等。
insert和delete命令在默认情况下产生的重做记录足以表明被修改的行在修改前后的值。
update和以上不一样,他不会影像一行的所有字段,也不会把没有被修改的字段值保存到记录中。在撤销块的变更矢量中保存旧值,在数据块的变更矢量中保存新值。
二、数据库级补充日志
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"
from v$database;
都为NO,数据库启用补充日志,数据库级补充日志分为:最小补充日志和标识关键字段补充日志。
1、最小补充日志
最基本的一种数据库级补充日志。不对对重做记录产生明显的额外开销,又能使日志文件支持LogMiner和闪回事务查询。建议启动该功能。
alter database add supplemental log data;
select supplemental_log_data_min as MIN from v$database;
alter database drop supplemental log data;
启动或者关闭数据库级补充日志,都会导致共享池中所有的SQL命令游标非法,短期内硬解析量会显著上升。
2、标识关键字补充日志
分别对应4中,主键、唯一索引、外键、、全体字段补充日志。
主键:争对于update,无论主键有没有被修改,旧值都会记录。
如果没有主键则记录长度最小的非空唯一索引,如果还没有就会将所有的字段(除了LOB和LONG类型)的旧值记录。这将导致重做记录数据量暴涨。
alter database add supplemental log data (primary key) columns;
select supplemental_log_data_pk as PK from v$database;
这时候最小补充日志,如果最小补充日志没有被启动,则会被隐式开启。查询结果为IMPLICIT
唯一索引:和主键完全不同,当唯一索引字段被修改后才会记录修改前的值。特定针对的是复合索引。
alter databae add supplemental log data (unique) columns;
select supplemental_log_data_ui as UI from v$database;
外键同唯一索引
alter database add supplemental log data(foreign key) columns;
全体字段:只要有修改,就会记录所有的字段(LOB、LONG除外)
alter database add supplement log data (all) columns;
可叠加所有标识关键字段
alter database add supplemental log data (primary key,unique,foreign key, all) columns;
三、表级补充日志
只争对特定的表,不涉及所有的数据库。
开启前表级补充日志,先开启数据库级最小补充日志。
表级补充日志分为:主键、唯一索引、外键、全字段、自定义字段
alter table hr.employee add supplemental log data (primary key) columns;
alter table hr.employee add supplemental log data (unique) columns;
alter table hr.employee add supplemental log data (foreign key) columns;
alter table hr.employee add supplemental log data (all) columns;
自定义,将first_name,last_name,email指派为一个名为empinfo的日志组。
alter table hr.employee add supplemental log
group emp_info (first_name,last_name,email);
只要修改以上3个字段任意一个,重做记录就记载全部三个字段,成为有条件。无条件,在末尾急上always,不管修改哪个字段,都会记载这三个字段。
alter table hr.employee add supplemental log
group emp_info (first_name,last_name,email) always;
表级补充日志查询
break on name on table_name on always on generated
col name format d20
col table_name format a19
col column_name format all
select
g.log_group_name name,
g.owner || '.' || g.table_name table_name,
g.always,
g.generated,
c.column_name
from dba_log_groups g, dba_log_group_columns c
where g.owner=c.owner(+)
and g.log_group_name=c.log_group_name(+)
and g.table_name=c.table_name(+)
order by 1,2,3,4
总结:
补充日志主要为UPDATE服务,额外记录指定字段的旧值。高度还原update命令。
可以当成特殊的备份,在所有的备份都不可用的情况下,可以使用LogMiner。
建议至少启用最小补充日志。