首页 > 数据库 >oracle日志模式

oracle日志模式

时间:2023-12-10 12:34:21浏览次数:40  
标签:logging nologging 模式 oracle 日志 redo append

oracle日志模式
一、oracle日志模式分为(logging,force logging,nologging)默认情况是logging,就是会记录到redo日志中,force logging是强制记录日志,nologging是尽量减少日志。FORCE LOGGING可以在数据库级别、表空间级别进行设定、而LOGGING与NOLOGGING可以在表级别设定。注:FORCE LOGGING并不比一般的LOGGING记录的日志多,数据库在FORCE LOGGING状态下,NOLOGGING选项将无效,因为NOLOGGIN
https://blog.csdn.net/u010919402/article/details/117736639

一、oracle日志模式
oracle日志模式分为:logging,force logging,nologging,默认情况是logging
1)logging是会记录到redo日志中;
2)force logging是强制记录日志;
3)nologging是尽量减少日志。
FORCE LOGGING可以在数据库级别、表空间级别进行设定,而LOGGING与NOLOGGING可以在表级别设定。
注:FORCE LOGGING并不比一般的LOGGING记录的日志多,数据库在FORCE LOGGING状态下,NOLOGGING选项将无效,因为NOLOGGING将破坏DATAGUARD的可恢复性.FORCE LOGGING强制数据库在任何状态下必须记录日志。

logging,force logging和nologging是只记录到redo日志中,归档不归档是另外的设置,但是如果用nologging了,那么显然就算归档的话,归档日志就少了,但是可能不能用于介质回复了,因为有些根本没有记录。

二、日志记录模式的转换
1)数据库从非强制日子模式切换到强制日志模式
    alter database force logging; 
2)数据库从强制日志模式切换到非强制日志模式
    alter database no force logging; 
3)表空间级别从强制日志模式切换到非强制日志模式
    alter tablespace tablespace_name force logging
4)表空间级别从非强制日志模式切换到强制日志模式
    alter tablespace tablespace_name no force logging
5)表级日志记录换到不记录日志模式
    alter table tb_a nologging;
6)表级日志记录换到记录日志模式
    alter table tb_a logging;
注:
a)数据库处于归档模式:当表模式为logging状态时,无论是否使用append模式,都会生成redo.当表模式为nologging状态时,只有append模式,不会生成redo。
b)数据库处于非归档模式:无论是在logging还是nologing的模式下,append的模式都不会生成redo,而no append模式下都会生成redo。   

三、查看日志记录模式
1)查看数据库的日志归档模式
    select log_mode,force_logging from v$database;
2)查看表空间的日志归档模式
    select tablespace_name,logging,force_logging from dba_tablespaces;
3)查看表的日志归档模式
    select table_name,logging from user_tables;

三、使用情况
1.logging模式
这是日志记录的缺省模式,无论数据库是否处于归档模式,这并不改变表空间与对象级别上的缺省的日志记录模式。对于临时表空间将不记录日志到联机重做日志文件。
2.nologing模式
此模式不是不记录日志,而是最小化日志产生的数量,通常在下列情况下使用NOLOGGING:
nologing模式和append联合使用。
3.append介绍
/*+append*/ 
append 属于direct insert
归档模式下append+table nologging会大量减少日志,非归档模式append会大量减少日志,append方式插入只会产生很少的undo;
使用append,一是减少对空间的搜索;二是有可能减少redolog的产生。所以append方式会快很多,一般用于大数据量的处理。建议不要经常使用append,这样表空间会一直在高水位上,除非你这个表只插不删。
insert /*+append*/ into table1 select * from table2
在使用了append选项以后,insert数据会直接加到表的最后面,而不会在表的空闲块中插入数据。使用append会增加数据插入的速度。
/*+APPEND*/的作用是在表的高水位上分配空间,不再使用表的extent中的空余空间
append 属于direct insert,归档模式下append+table nologging会大量减少日志,非归档模式append会大量减少日志,append方式插入只会产生很少的undo,不去寻找 freelist 中的free block , 直接在table HWM 上面加入数据。
查redo大小语句:
select name,value,class from v$sysstat where name='redo size';
显示的好方法:
select (1745704-582728) redo1,(1839872-1745704) redo2 from dual;//注意,括号里其实就是两个数减法,然后写进去显示出来而已
(2)NOLOGGING与表模式,插入模式,数据库运行模式(archived/unarchived)的关系
下面仅说明使用append方式插入数据时日志产生的情况,如使用下面的方式进行插入(这里是表是否事先设置成nologging)
insert/*+append+*/into tb_name select colnam1,colname2from table_name;    


alter table aa nologging
alter table aa logging
insert /*+append*/ into ...nologing
select * from ...
insert /*+ append, parallel */ into ods_list_t nologging
select * from ods_list;
但这样不行:整个表可以插入,但要某一个字段则不能加入nologging
insert /*+ append, parallel */ into ods_list_t(a,b) nologging
select a,b from ods_list;
但可以这样:
insert /*+ append, parallel */ into ods_list_t  nologging(a,b)
select a,b from ods_list;
create table ods_list_t nologging as select * from ods_list;
insert /*+ append, parallel */ into ods_list_t nologging 
select * from ods_list;
insert /*+ Append parallel(tablename,number) */ into ods_list_t nologging 
select * from ods_list;
tablename: 表名
number: 并行度
使用批量拷贝方法
set arraysize 20
set copycommit 5000
copy from username/password@oracle_name append table_name1 
using select * from table_name2;
(3)总结
可以看出(这是insert /*+ append */ into ddddd  nologging as select ...... from ...)
1. 不管哪种模式下append要与nologging方式联用才能达到很好的效果。
2. 非归档与归档方式,只用NOLOGGING是不起效果的。
3. 非归档下append已达到不错的效果,但不及与nologging的联用方式。
4. 归档下单append起不到效果。
另外,如果库处在FORCELOGGING模式下,此时的nologging方式是无效的,这个我也测试过
5.非归档模式下:
没有优化前    (1281372  redo size)
(1)、单一的使用nologging参数,对redo的产生没有什么影响。  (1214836  redo size)
(2)、单一的使用append提示,redo的减少很显著              (43872  redo size)
(3)、nologging+append,更显著                             (1108  redo size)
6.归档模式下:
没有优化前:            
(1)、单独使用nologging参数,(1231904  redo size)
(2)、单独使用append提示,  (1245804  redo size)
(3)、nologging + append,     (3748  redo size)
a、使用nologging参数,并不代表在dml操作中oracle不产生redo,只是对于指定表的更新数据不产生redo,但是 oracle还是要记录这些操作,所以无论怎么优化,dml操作肯定要产生redo,但是使用这些参数对redo size的影响还是非常可观的。
b、单独使用nologging参数,对redo size没有多少影响,只有和append配合时,才能产生效果。
c、单独使用append提示,对redo的产生影响很大,这是我到现在都不明白的道理,按说append是绕过freelists,直接去寻找新块,能减少对freelists的争用,为什么会少这么多redo呢?
d、归档模式和非归档模式下,参数影响不一样,尤其是单独使用append参数时,看来oracle对归档模式下出于安全考虑还是要多一些。 
三、查询总结
1.查看不同级别的日志模式
        查看数据库级别日志的归档模式、记录模式  
  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

注意:
(1)表是否是nologging模式,还需要查user_tables.logging字段才行。
我刚才在oracle 10g中测试,create table xxx nologging as select *....产生的表并不是nologging方式,还得手工改一下:
alter table xxxx nologging.
改完后,在归档模式,insert /*+append*/确实日志很少。
(2)在使用append 快速加载数据完成后,需要commit or roll ,才能进行进行对该表进程操作否则会报错:ORA-12838: cannot read/modify an object after modifying it in parallel错误。insert和append insert的原理上是完全不同的,insert append可以实现直接路径加载,速度比常规加载方式快很多。但有一点需要注意: insert append时在表上加“6”类型的Exclusive锁,即排它锁,为表级锁,会阻塞表上的所有DML语句。因此在有业务运行的上传环境下要慎重使用。

标签:logging,nologging,模式,oracle,日志,redo,append
From: https://www.cnblogs.com/Pro-Cyon/p/17892390.html

相关文章

  • 小谈设计模式(16)—抽象工厂模式
    (小谈设计模式(16)—抽象工厂模式)专栏介绍主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。抽象工厂模式抽象工厂模式(AbstractFactoryPattern)是一种创建型设计模式,它提供了......
  • 实验18:迭代器模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解迭代器模式的动机,掌握该模式的结构;2、能够利用迭代器模式解决实际问题。 [实验任务一]:JAVA和C++常见数据结构迭代器的使用信1305班共44名同学,每名同学都有姓名,学号和年龄等属性,分别使用JAVA内置迭代器和C++中......
  • 实验 20:备忘录模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解备忘录模式的动机,掌握该模式的结构;2、能够利用备忘录模式解决实际问题。 [实验任务一]:多次撤销改进课堂上的“用户信息操作撤销”实例,使得系统可以实现多次撤销(可以使用HashMap、ArrayList等集合数据结构实现......
  • 实验19:中介者模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解中介者模式的动机,掌握该模式的结构;2、能够利用中介者模式解决实际问题。 [实验任务一]:虚拟聊天室在“虚拟聊天室”实例中增加一个新的具体聊天室类和一个新的具体会员类,要求如下:新的具体聊天室中发送的图片......
  • 实验 21:观察者模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解观察者模式的动机,掌握该模式的结构;2、能够利用观察者模式解决实际问题。 [实验任务一]:股票提醒当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下降时会大哭一场......
  • 实验 22:状态模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解状态模式的动机,掌握该模式的结构;2、能够利用状态模式解决实际问题。 [实验任务一]:银行账户用Java代码模拟实现课堂上的“银行账户”的实例,要求编写客户端测试代码模拟用户存款和取款,注意账户对象状态和行为的......
  • 实验15:职责链模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解职责链模式的动机,掌握该模式的结构;2、能够利用职责链模式解决实际问题。 [实验任务一]:财务审批某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以下的采购单,副......
  • 实验16:命令模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解命令模式的动机,掌握该模式的结构;2、能够利用命令模式解决实际问题。 [实验任务一]:多次撤销和重复的命令模式某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对象,并通过该命令集......
  • 实验14:代理模式
    [实验任务一]:婚介所婚介所其实就是找对象的一个代理,请仿照我们的课堂例子“论坛权限控制代理”完成这个实际问题,其中如果年纪小于18周岁,婚介所会提示“对不起,不能早恋!”,并终止业务。实验要求:1. 提交类图;、2.提交源代码;3.注意编程规范。packageorg.example;publicclas......
  • springboot集成log4j日志
    一、在springboot的pom.xml配置文件中引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><!--排除默认spring-boot-starter-logging启动器-->......