怎么理解nologging、force logging、supplemental log日记

74次阅读
没有评论

共计 3989 个字符,预计需要花费 10 分钟才能阅读完成。

本篇内容介绍了“怎么理解 nologging、force logging、supplemental log 日记”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、nologging

nologging 对写日志的影响与数据库运行模式、表模式、插入模式三者都有关。

表的插入模式是指是否采用了 append 的 hint 提示:
insert /*+append*/ into t1 values(1, First

当数据库在非归档模式下:
无论表是否使用了 nologging 或是 logging,当表使用 append 做插入时,都不会生成 redo,而不使用 append 时都会生成 redo。

当数据库在归档模式下:
如果表使用了 nologging 模式,且使用了 append 做插入,则不会生成 redo,如果未使用 append,则仍然会生成 redo。
如果表使用了 logging 模式,则无论插入时是否使用了 append,redo 都会生成。

总结一句话就是:对于非归档模式,插入语句只要使用了 append 就不会生成 redo,而对于归档模式,除非表使用了 nologging,否则 append 仍然会产生 redo。

查看表的日志模式是否为 logging 状态,默认建表时的状态是 logging 的:
select table_name,logging from dba_tables where owner= SCOTT and table_name= EMP

TABLE_NAME  LOG
—————————— —
EMP  YES

Oracle 有个内部参数_disable_logging,默认为 false,如果该参数更改为 true,则 Oracle 在更改表时会完全不记录日志,但该参数应慎用。

二、force logging

通过使用强制日志使 Oracle 无论什么操作都进行 redo 的写入:
alter database force logging;

查看数据库是否为 force logging 状态,默认为 NO:
select force_logging from v$database;

FOR

NO

三、supplemental log

补充日志,主要是针对 update 命令的,是对重做日志记录中变更矢量块的补充记录。日志挖掘器(LogMiner)、闪回事务及其查询等都需要补充日志的支持。补充的目的是高度还原 update 命令,避免因为 update 命令造成的行迁移和行移动影响对日志的分析,让 LogMiner 通过分析重做日志识别 update 命令不是由 insert 和 delete 完成的。如果未启用补充日志,重做日志只将 update 命令更改的字段的旧值保存在撤销数据块的变更矢量中。而在数据块中的变更矢量中记载被修改后的字段的新值,同行中的未被修改的字段不会记载。如果启用了补充日志,重做日志中的撤销数据块的变更矢量中不仅会记录被修改字段前的值和修改后的值,而且还会记录修改字段的那个条件的值。

补充日志分为数据库级补充日志、表级补充日志。

数据库级补充日志又分为最小补充日志、标识关键字段补充日志。

最小补充日志:
是最基本的一种数据库级补充日志,而 LogMiner 正是依赖最小补充日志来工作的。其他补充日志都是基于数据库级最小补充日志之上的,如果未启用数据库级最小补充日志,在启用或使用其他补充日志时,会自动启用数据库的最小补充日志 (Implicit)。
启用最小补充日志:alter database add supplemental log data;
关闭最小补充日志:alter database drop supplemental log data;

标识关键字段补充日志:
分为主键、外键、唯一索引、全体字段补充日志 4 种。

1)主键补充日志:
在 update 命令的重做记录中添加被修改行的主键字段的旧值,无论是否被修改,都记录。
如果表没有主键,则由长度最小的唯一索引字段代替,若连唯一索引也没有,则记录该行所有字段。
alter database add supplemental log data(Primary key) columns;

2)唯一索引补充日志:
唯一索引主要是为复合索引(唯一)服务的。只有唯一索引的字段被 update 时,才会记录该字段被修改前的值。
alter database add supplemental log data(unique) columns;

3)外键补充日志:
同唯一索引补充日志一样,只有外键字段被 update 时,才会记录被修改前的旧值,即也是为复合外键服务的。
alter database add supplemental log data(foreign key) columns;

4)全体字段补充日志:
顾名思义就是所有字段的值不论是否被修改都记录(LOB、LONG 字段除外)。会导致磁盘快速增长,LGWR 进程繁忙,不建议使用。
alter database add supplemental log data(all) columns;

这 4 种补充日志可以并行使用,效果累加。

表级补充日志:
分为主键、唯一索引、外键、全体字段、用户自定义字段 5 种。

前 4 种同数据库级标识关键字段补充日志效果用法一样。只不过是在特定表上启用补充日志。
1)alter table t1 add supplemental log data(primary key) columns;
2)alter?table t1 add supplemental log data (unique) columns;
3)alter table t1 add supplemental log data(foreign key) columns;
4)alter table t1 add supplemental log data(all) columns;
5)alter table t1 add supplemental log group group_name(col01,col02,col05,col09) always;?

自定义字段的表级补充日志可以让用户任意指定哪些字段的旧值需要被补充日志记录,可以分为有条件日至组和无条件日至组:

有条件日志组:只要补充日志组中描述的列有一个被修改 (update),那么就要记录该日志组所有描述列的前镜像(旧值)。
无条件日志组:当表被修改时要记录日志组中所有描述列的前镜像(旧值),无论改变是否对日志组中任一描述列造成了影响。需使用 always 关键字。

表级补充日志的情况可通过查询数据字典视图 dba_log_groups 和 dba_log_group_columns 获得。

col owner for a10
col log_group_name for a20
col table_name for a20
select * from dba_log_groups where owner = SCOTT

OWNER  LOG_GROUP_NAME  TABLE_NAME  LOG_GROUP_TYPE  ALWAYS  GENERATED
———- ——————– ——————– —————————- ———– ————–
SCOTT  SYS_C0014349  T1  ALL COLUMN LOGGING  ALWAYS  GENERATED NAME
SCOTT  SYS_C0014350  T1  PRIMARY KEY LOGGING  ALWAYS  GENERATED NAME
SCOTT  SYS_C0014351  T1  UNIQUE KEY LOGGING  CONDITIONAL GENERATED NAME
SCOTT  SYS_C0014352  T1  FOREIGN KEY LOGGING  CONDITIONAL GENERATED NAME

col owner for a10
col table_name for a20
col column_name for a20
select * from dba_log_group_columns where owner = HR

OWNER  LOG_GROUP_NAME  TABLE_NAME  COLUMN_NAME  POSITION LOGGIN
———- —————————— ——————– ——————– ———- ——
HR  GGS_92582  EMPLOYEES1  EMPLOYEE_ID  1 LOG
HR  GGS_91276  COUNTRIES  COUNTRY_ID  1 LOG
HR  GGS_91281  DEPARTMENTS  DEPARTMENT_ID  1 LOG
HR  GGS_91286  EMPLOYEES  EMPLOYEE_ID  1 LOG
HR  GGS_91284  JOBS  JOB_ID  1 LOG
HR  GGS_91290  JOB_HISTORY  EMPLOYEE_ID  1 LOG
HR  GGS_91290  JOB_HISTORY  START_DATE  2 LOG
HR  GGS_91278  LOCATIONS  LOCATION_ID  1 LOG
HR  GGS_91274  REGIONS  REGION_ID  1 LOG

因为 insert 会记录所有修改后字段,delete 会记录所有修改前字段,所以补充日志只对 update 产生影响,开启补充日志时共享池中的 SQL 游标都会失效。

“怎么理解 nologging、force logging、supplemental log 日记”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-20发表,共计3989字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)