日志记录模式(LOGGING 、FORCE LOGGING 、NOLOGGING)

本文介绍了Oracle数据库中三种日志记录模式:LOGGING、FORCELOGGING和NOLOGGING的区别与应用。阐述了它们与归档模式的关系,以及在不同场景下的使用方法。并提供了如何在数据库、表空间及对象级别设置这些模式的具体命令。

--==================================================

-- 日志记录模式(LOGGING FORCE LOGGING NOLOGGING)

--==================================================

一、日志记录模式(LOGGING FORCE LOGGING NOLOGGING)

1.三者的含义

LOGGING:当创建一个数据库对象时将记录日志信息到联机重做日志文件。LOGGING实际上是对象的一个属性,用来表示在创建对象时是

否记录REDO日志,包括在做DML时是否记录REDO日志。一般表上不建议使用NOLOGGING,在创建索引或做大量数据导入时,可以使用

NOLOGGING

FORCE LOGGING:简言之,强制记录日志,即对数据库中的所有操作都产生日志信息,并将该信息写入到联机重做日志文件。

NOLOGGING:正好与LOGGINGFORCE LOGGING 相反,尽可能的记录最少日志信息到联机日志文件。

FORCE LOGGING可以在数据库级别、表空间级别进行设定、而LOGGINGNOLOGGING可以在数据对象级别设定。

在使用DATA GUARD 时,要求使用强制记录日志模式。注:FORCE LOGGING并不比一般的LOGGING记录的日志多,数据库在FORCE LOGGING

状态下,NOLOGGING选项将无效,因为NOLOGGING将破坏DATAGUARD的可恢复性.FORCE LOGGING强制数据库在任何状态下必须记录日志。

2.与归档模式及非归档模式之间的关系

日志记录模式与归档模式之间并不能等同,归档模式是指对系统产生的日志是否进行归档或不归档。

归档模式下,将日志记录到日志文件,并进行归档。非归档模式下,同样将日志记录到日志文件,只不过不归档而已,容易丢失日志。

日志的记录模式则不论是否处于归档或非归档,可以对日志进行记录,强制记录,或少记录日志。

归档模式中的LOGGINGFORCE LOGGING 支持介质恢复,而NOLOGGING 模式不支持介质恢复。

基于NOLOGGING模式操作所产生的日志远小于LOGGING模式产生的日志,即NOLOGGING模式最小化日志记录。

3.优先级别:

当数据库使用FORCE LOGGING时,具有最高优先级别,其次是表空间级别的FORCE LOGGING。即是当一个对象指定NOLOGGING时,而表空

间或数据库级别的日志模式为FORCE LOGGING,则该选项不起作用,直到表空间或数据库级别的FORCE LOGGING解除。

一般建议将整个数据库设置为FORCE LOGGING或基于表空间级别设定FORCE LOGGING,而不建议两者都设置为FORCE LOGGING

当数据库或表空间使用非强制日志模式时,则日记记录优先级别由低到高为:数据库、表空间、数据对象

二、三者的使用情况

1.LOGGING模式

这是日志记录的缺省模式,无论数据库是否处于归档模式,这并不改变表空间与对象级别上的缺省的日志记录模式。

对于临时表空间将不记录日志到联机重做日志文件。

2.NOLOGGING模式

此模式不是不记录日志,而是最小化日志产生的数量,通常在下列情况下使用NOLOGGING

SQL*Loader in direct mode

INSERT /*+APPEND*/ ...

CTAS

ALTER TABLE statements (move/add/split/merge partitions)

CREATE INDEX

ALTER INDEX statements (move/add/split/merge partitions)

NOLOGGING与表模式,插入模式,数据库运行模式(archived/unarchived)的关系:

下面仅说明使用append方式插入数据时日志产生的情况,如使用下面的方式进行插入

insert /*+append+*/ into tb_name select colnam1,colname2 from table_name;

数据库处于归档模式

当表模式为logging状态时,无论是否使用append模式,都会生成redo.当表模式为nologging状态时,只有append模式,不会生成redo

数据库处于非归档模式

无论是在logging还是nologing的模式下,append的模式都不会生成redo,no append模式下都会生成redo

2.FORCE LOGGING模式

设定数据库为Force Logging模式后,数据库将会记录除临时表空间或临时回滚段外所有的操作,而忽略类似NOLOGGING之类的指定参数。

通过下面的操作来修改

ALTER DATABASE FORCE LOGGING;

ALTER TABLESPACE tablespace_name FORCE LOGGING;

取消FORCE LOGGING模式

ALTER DATABASE NO FORCE LOGGING;

ALTER TABLESPACE tablespace_name NO FORCE LOGGING;

3.查看不同级别的日志模式

查看数据库级别日志的归档模式、记录模式

SQL> select log_mode,force_logging from v$database;

LOG_MODE FORCE_LOGGING

------------ -------------

ARCHIVELOG NO

查看表空间级别的日志记录模式

SQL> select tablespace_name,logging,force_logging from dba_tablespaces;

TABLESPACE_NAME LOGGING FORCE_LOGGING

--------------- --------- -------------

SYSTEM LOGGING NO

UNDOTBS1 LOGGING NO

SYSAUX LOGGING NO

TEMP NOLOGGING NO

USERS LOGGING NO

查看对象级别的日志记录模式

scott@ORCL> select table_name,logging from user_tables;

TABLE_NAME LOG

------------------------------ ---

TB_A YES

TB_B YES

4.日志记录模式的转换

a.数据库从非强制日子模式切换到强制日志模式

sys@ORCL> alter database force logging;

b.数据库从强制日志模式切换到非强制日志模式

sys@ORCL> alter database no force logging;

c.表空间级别从强制日志模式切换到非强制日志模式

sys@ORCL> alter database no force logging;

d.表空间级别从非强制日志模式切换到强制日志模式

sys@ORCL> alter database no force logging;

e.对象级别日志记录模式

sys@ORCL> alter table tb_a nologging; --不记录日志模式

sys@ORCL> alter table tb_a logging; --采用日志记录模式

三、LOB段上有关NOLOGGINGLOGGING的情况

计算所有LOB的大小:

SELECT SUM(BYTES)/1024/1024/1024 as LOB_Size FROM user_segments

WHERE segment_type='LOBSEGMENT';

计算所有nologging的大小

SELECT SUM(s.BYTES)/1024/1024/1024 as Nologging_size

FROM user_segments s,user_lobs l

WHERE s.segment_type='LOBSEGMENT'

AND l.LOGGING='NO' AND l.SEGMENT_NAME=s.SEGMENT_NAME;

列出所有nologging/logging lobs和对应的表空间及其大小:

SELECT s.segment_name,s.bytes,s.TABLESPACE_NAME

FROM user_segments s,user_lobs l

WHERE s.segment_type='LOBSEGMENT'

AND l.LOGGING='NO' AND l.SEGMENT_NAME=s.SEGMENT_NAME;

SELECT s.segment_name,s.bytes,s.TABLESPACE_NAME

FROM user_segments s,user_lobs l

WHERE s.segment_type='LOBSEGMENT'

AND l.LOGGING='YES' AND l.SEGMENT_NAME=s.SEGMENT_NAME;

计算LOB段上nologging/logging的数量

SELECT COUNT(*) FROM user_lobs WHERE logging='NO';

SELECT COUNT(*) FROM user_lobs WHERE logging='YES';

四、更多参考

有关闪回特性请参考

Oracle 闪回特性(FLASHBACK DATABASE)

Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN)

Oracle 闪回特性(Flashback Query、Flashback Table)

Oracle 闪回特性(Flashback Version、Flashback Transaction)

有关基于用户管理的备份和备份恢复的概念请参考:

Oracle 冷备份

Oracle 热备份

Oracle 备份恢复概念

Oracle 实例恢复

Oracle 基于用户管理恢复的处理(详细描述了介质恢复及其处理)

有关RMAN的恢复与管理请参考:

RMAN 概述及其体系结构

RMAN 配置、监控与管理

RMAN 备份详解

RMAN 还原与恢复

有关Oracle体系结构请参考:

Oracle 实例和Oracle数据库(Oracle体系结构)

Oracle 表空间与数据文件

Oracle 密码文件

Oracle 参数文件

Oracle 数据库实例启动关闭过程

Oracle 联机重做日志文件(ONLINE LOG FILE)

Oracle 控制文件(CONTROLFILE)

Oracle 归档日志

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值