----补充日志 Supplemental Logging
补充日志只要是针对 UPDATE 命令的,是对重做日志记录中 变更矢量块的补充信息,增加了变更矢量记载的记录量。
日志挖掘器(LogMiner)、闪回事务查询、闪回事务等都需要 补充日志的支持。尤其是 日志挖掘器如果发现未启用补充
日志,就拒绝服务。也就是说补充日志主要是为UPDATE 命令服务的,补充的目的是高度还原 UPDATE 命令,避免因为
update 命令造成的行迁移和行移动,让LogMiner 通过分析重做日志中识别 update 命令 不是 由 insert 和 delete 完成的。
如果未启用补充日志,重做日志只将 UPDATE 命令更改的字段的旧值保存在撤销数据块的变更矢量中。而在数据块中的 变更矢量中记载被修改后的字段的新值。同行中的未被修改的字段,不会被记载。
如果启用了补充日志,重做日志中的撤销数据块的变更矢量中会记录 被修改字段前的值和修改后的值,而且还会记录 修改字段的那个条件的值。即变更矢量中会记载:
几号数据文件+几号文件中的几号块+第几个字段+修改后的值+修改前的值+“where 条件” 的值
行移动: 指 update 命令执行时 在索引组织表中有时 会导致整行被转移至另一个索引块中。该情况或过程称为 行移动。
行迁移: 如果是在堆栈表中,update 命令导致行太长,在数据块空间不足的情况下会将部分(行头部除外)迁移到另 一个数据块中,行头任然保留 在原数据块中。
补充日志分为:数据库级补充日志、 表级补充日志
其他补充日志都是基于数据库级最小补充日志之上的,如果未启用数据库级最小补充日志,在启用
或使用其他补充日志时,会自动启用数据库的最小补充日志
数据库级补充日志分为:最小补充日志、标识关键字段补充日志
最小补充日志:是最基本的一种数据库级补充日志,而 LogMiner 正是依赖最小补充日志工作服务的(即识别 行移动 行迁移)。
启用最小补充日志命令:
ALTER DATABASE ADD Supplemental LOG DATA;
关闭最小补充日志命令:
ALTER DATABASE DROP Supplemental Log Data;
标识关键字段补充日志:分为 主键、外键、唯一索引、全体字段 补充日志 4种。
主键补充日志:在update 命令的重做记录中添加被修改行的主键字段的旧值,无论是否被修改,都记录。
如果表没有主键,则由长度最小的唯一索引字段代替,若连唯一索引也没有,则记录该行所有字段。
alter database add supplemental log data (Primary key) columns;
唯一索引补充日志:唯一索引主要是为 复合索引(唯一)服务的。只有唯一索引的字段被 update 时,才会记录该字段 被修改前的值。
alter database add supplemental log data (unique) columns;
外键补充日志:同唯一索引补充日志一样,只有外键字段被 update 时,才会记录被修改前的旧值,即也是为复合外键 服务的。
alter database add supplemental log data (foreign key ) columns;
全体字段补充日志:顾名思义就所有字段的值不论是否被修改都记录。会导致磁盘快速增长,LGWR进程繁忙。不建议使用。
alter database add supplemental log data (all) columns;
这 4 种补充日志可以并行使用,效果累加。
表级补充日志:
分为: 主键、唯一索引、外键、全体字段、用户自定义字段 5种。
前 4 种 同数据库级 标识关键字段补充日志效果用法一样。只不过是在特定表上启用补充日志
1、 alter table tb_name add supplemental log data (primary key) columns;
2、alter table tb_name add supplemental log data (unique) columns;
3、 alter table tb_name add supplemental log data (foreign key) columns;
4、 alter table tb_name add supplemental log data (all) columns;
5、 alter table tb_name add supplemental log group group_name (col01,col02,col05,col09) | always;
--自定义字段表级补充日志 用户可以任意指定哪些字段的旧值需要被补充日志记录。
有条件记录式记载是指 无论 update 那个字段 这组中的其他字段都的记录其旧值
无条件记录式记载是指 有无条件记录式记载 命令末尾 加 always 关键字,然后无论 update 该行那个字段,都记录该组中
的字段的旧值。
表级补充日志的情况 通过 dba_log_groups 和 dba_log_group_columns 视图查询获得
补充日志只要是针对 UPDATE 命令的,是对重做日志记录中 变更矢量块的补充信息,增加了变更矢量记载的记录量。
日志挖掘器(LogMiner)、闪回事务查询、闪回事务等都需要 补充日志的支持。尤其是 日志挖掘器如果发现未启用补充
日志,就拒绝服务。也就是说补充日志主要是为UPDATE 命令服务的,补充的目的是高度还原 UPDATE 命令,避免因为
update 命令造成的行迁移和行移动,让LogMiner 通过分析重做日志中识别 update 命令 不是 由 insert 和 delete 完成的。
如果未启用补充日志,重做日志只将 UPDATE 命令更改的字段的旧值保存在撤销数据块的变更矢量中。而在数据块中的 变更矢量中记载被修改后的字段的新值。同行中的未被修改的字段,不会被记载。
如果启用了补充日志,重做日志中的撤销数据块的变更矢量中会记录 被修改字段前的值和修改后的值,而且还会记录 修改字段的那个条件的值。即变更矢量中会记载:
几号数据文件+几号文件中的几号块+第几个字段+修改后的值+修改前的值+“where 条件” 的值
行移动: 指 update 命令执行时 在索引组织表中有时 会导致整行被转移至另一个索引块中。该情况或过程称为 行移动。
行迁移: 如果是在堆栈表中,update 命令导致行太长,在数据块空间不足的情况下会将部分(行头部除外)迁移到另 一个数据块中,行头任然保留 在原数据块中。
补充日志分为:数据库级补充日志、 表级补充日志
其他补充日志都是基于数据库级最小补充日志之上的,如果未启用数据库级最小补充日志,在启用
或使用其他补充日志时,会自动启用数据库的最小补充日志
数据库级补充日志分为:最小补充日志、标识关键字段补充日志
最小补充日志:是最基本的一种数据库级补充日志,而 LogMiner 正是依赖最小补充日志工作服务的(即识别 行移动 行迁移)。
启用最小补充日志命令:
ALTER DATABASE ADD Supplemental LOG DATA;
关闭最小补充日志命令:
ALTER DATABASE DROP Supplemental Log Data;
标识关键字段补充日志:分为 主键、外键、唯一索引、全体字段 补充日志 4种。
主键补充日志:在update 命令的重做记录中添加被修改行的主键字段的旧值,无论是否被修改,都记录。
如果表没有主键,则由长度最小的唯一索引字段代替,若连唯一索引也没有,则记录该行所有字段。
alter database add supplemental log data (Primary key) columns;
唯一索引补充日志:唯一索引主要是为 复合索引(唯一)服务的。只有唯一索引的字段被 update 时,才会记录该字段 被修改前的值。
alter database add supplemental log data (unique) columns;
外键补充日志:同唯一索引补充日志一样,只有外键字段被 update 时,才会记录被修改前的旧值,即也是为复合外键 服务的。
alter database add supplemental log data (foreign key ) columns;
全体字段补充日志:顾名思义就所有字段的值不论是否被修改都记录。会导致磁盘快速增长,LGWR进程繁忙。不建议使用。
alter database add supplemental log data (all) columns;
这 4 种补充日志可以并行使用,效果累加。
表级补充日志:
分为: 主键、唯一索引、外键、全体字段、用户自定义字段 5种。
前 4 种 同数据库级 标识关键字段补充日志效果用法一样。只不过是在特定表上启用补充日志
1、 alter table tb_name add supplemental log data (primary key) columns;
2、alter table tb_name add supplemental log data (unique) columns;
3、 alter table tb_name add supplemental log data (foreign key) columns;
4、 alter table tb_name add supplemental log data (all) columns;
5、 alter table tb_name add supplemental log group group_name (col01,col02,col05,col09) | always;
--自定义字段表级补充日志 用户可以任意指定哪些字段的旧值需要被补充日志记录。
有条件记录式记载是指 无论 update 那个字段 这组中的其他字段都的记录其旧值
无条件记录式记载是指 有无条件记录式记载 命令末尾 加 always 关键字,然后无论 update 该行那个字段,都记录该组中
的字段的旧值。
表级补充日志的情况 通过 dba_log_groups 和 dba_log_group_columns 视图查询获得