一、oracle对logging与nologging的控制。
Oracle在4个级别 提供对操作是否记录redo日志进行控制
- 数据库级别
Force_logging, 数据库级别开启force logging ,将忽略一切nologging的操作,即使显示加上nologging也不起作用。所以搭建物理standby时,一定要将force logging开启。
开启关闭语句
Alter database force logging;
Alter database no force logging;
- 表空间级别
Force_logging属性 , 表空间是否开启强制记日志,如果开启,表空间上所属对象上的操作都会记日志到redo log ,忽略一切nologging操作。
Logging/nologging属性,为表空间上的对象提供logging属性的默认值,如果创建对象时不显示指定是logging还是nologging,则取表空间的logging属性。
开启关闭语句
Alter tablespace users force logging;
Alter tablespace users no force logging;
Alter tablespace users logging;
Alter tablespace users nologging;
查询表空间的日志记录属性
Select tablespace_name,force_logging,logging from dba_tablespaces where tablespace_name=’USERS’;
- 对象级别
Logging属性取值为yes或no,对该对象的更改是否记录日志。
查询对象的logging属性
Select logging from dba_tables where table_name=’T’;
对象的logging开启与关闭
Alter table t logging;
Alter table t nologging;
- 语句级别
指定该sql语句是否记录日志,默认依赖对象的logging属性。
Insert into t nologging select object_id,object_name from dba_objects;
二、nologging的好处与影响
好处:
(1)可以大大减少插入大型表的时间
(2)提高并行创建大型表或索引的性能
(3)减少日志生成量,节省磁盘空间
影响:
(1) 无法从重做日志中恢复更改,带来数据丢失的风险
(2) 对于物理standby,数据库一旦应用了无效的重做日志,所有相应的数据块将标记为逻辑坏块,查询引用时将报错。
(3) 对于逻辑standby,SQL apply会忽略无效的重做日志,因为它无法将其转换为有效的sql,逻辑standby也不会立即收到任何错误,只是在查询引用丢失的数据时报错。
实验:
数据库表空间对象的logging属性都设为no
把数据库的force logging设为no,表空间的force logging设为no,logging设为nologging,对象的logging属性设为nologging
在这个基础上,sql语句显示加nologging 并不是都不记录日志。
Insert into .... values 不管是否加hint /*+append*/, 始终会记录redo log
以下语句可以调用nologging, 使nologging生效
(1) Insert /*+append*/ select .....
(2) CTAS , nologging模式下只记录建表的日志
(3) Create index....
(4) Alter index ... rebuild
(5) Alter table ....move ...
(6) Sqlloader, datapump加载数据
三,如何防止nologging带来的风险
- 对于有standby的数据库,一定要开启数据库级别的force logging
- 对于核心的生产数据库,为了避免数据丢失的风险,一定要开启force logging
- 重要程度不高的数据库上可以考虑使用nologging,临时性批量操作可以考虑使用nologging,或在nologging操作之后及时做一次全备。