Welcome 微信登录

首页 / 数据库 / MySQL / Oracle redo日志产生量测试及比较

Oracle数据库日志有几种模式,强制日志、非强制日志模式、对象级别等!通常在数据库模式设置强制后,余下的不管如何都会强制日志!现在我们就oracle数据库日志模式产生的日志量进行比较测试,在各种模式下日志产生的情况!日志记录模式的转换
     a.数据库从非强制日子模式切换到强制日志模式
         SQL>alter database force logging;   
        b.数据库从强制日志模式切换到非强制日志模式
         SQL>alter database noforce logging;
        c.表空间级别从强制日志模式切换到非强制日志模式
         SQL>alter tablespace tablespacename noforce logging;
        d.表空间级别从非强制日志模式切换到强制日志模式
         SQL>alter tablespace tablespacename force logging;
        e.对象级别日志记录模式
         SQL>alter tablet mytest nologging;    --不记录日志模式
         SQL>alter tablet mytest logging;      --采用日志记录模式
 
一、表段,索引段上使用一般DDL,DML时,LOGGING与NOLOGGING情况 
   1.查看数据库的归档模式
        有关设置日志归档模式的问题,请参考:
            Oracle 联机重做日志文件(ONLINE LOG FILE)
           Oracle 归档日志
 
       SQL> select log_mode,force_logging from v$database;
 
       LOG_MODE   FOR
       ------------ ---
       ARCHIVELOG NO
       
       SQL> archive log list;
       Database log mode              Archive Mode
       Automatic archival           Enabled
       Archive destination            /u01/mytest/arch
       Oldest online log sequence   1024
       Next log sequence to archive 1025
       Current log sequence         1025 
       
       SQL> select tablespace_name,logging,force_logging from dba_tablespaces;
 
       TABLESPACE_NAME                LOGGING FOR
       ------------------------------ --------- ---
       SYSTEM                       LOGGING NO
       UNDOTBS1                     LOGGING NO
       SYSAUX                       LOGGING NO
       TEMP                         NOLOGGING NO
       USERS                          LOGGING NO
       PERFSTAT                     LOGGING NO
            
   2.使用如下语句进行查询
     
          SQL >SELECT a.name,b.value  FROM v$statname a JOIN v$mystat b ON a.statistic# = b.statistic# WHERE a.name = "redo size";
   
   3.在归档模式下比较表段上的NOLOGGING与LOGGING
       SQL>  SELECT a.name,b.value  FROM v$statname a JOIN v$mystat b ON a.statistic# = b.statistic# WHERE a.name = "redo size";
 
       NAME               VALUE
       --------------- ----------
       redo size           1644
 
       SQL> CREATE TABLE mytest_nolog NOLOGGING AS SELECT * FROM dba_objects;  --nologging模式创建表
 
       SQL> SELECT a.name,b.value  FROM v$statname a JOIN v$mystat b ON a.statistic# = b.statistic# WHERE a.name = "redo size";
 
       NAME               VALUE
       --------------- ----------
       redo size            70064         
 
       SQL> select 1644 last,70064 as cur,(70064-1644) diff from dual;--使用nologging模式建表产生的redo size为
 
             LAST        CUR     DIFF
       ---------- ---------- ----------
             1644      70064      68420
 
       SQL> CREATE TABLE mytest LOGGING AS SELECT * FROM dba_objects;    --使用logging模式来创建表
 
       SQL> SELECT a.name,b.value  FROM v$statname a JOIN v$mystat b ON a.statistic# = b.statistic# WHERE a.name = "redo size";; --查看当前的redo size
 
       NAME               VALUE
       --------------- ----------           
       redo size          1344112                      SQL> select 70064 last,1344112 as cur,(1344112-70064) diff from dual; 
 
             LAST        CUR     DIFF
       ---------- ---------- ----------
           70064    1344112      1274048          ----查看logging模式产生的redo size 为-68420=1274048,比nologging日志模,有19倍多!
             
 
       SQL> select table_name,logging from user_tables where table_name like "MYTEST%";--查看创建表的日志记录模式
 
       TABLE_NAME                   LOG
       ------------------------------ ---
       MYTEST                        YES
       MYTEST_NOLOG                 NO
 
   4.基于索引来比较redo size(同样是在归档模式下)
       SQL> SELECT a.name,b.value  FROM v$statname a JOIN v$mystat b ON a.statistic# = b.statistic# WHERE a.name = "redo size";;    --查看当前的redo_size
 
       NAME               VALUE
       --------------- ----------
       redo size           1140
 
       SQL> create index idx_mytest on mytest(object_id);  --基于表mytest来创建索引
 
       SQL> SELECT a.name,b.value  FROM v$statname a JOIN v$mystat b ON a.statistic# = b.statistic# WHERE a.name = "redo size";;      --查看当前的redo_size
 
       NAME               VALUE
       --------------- ----------                --基于loggiing模式,创建索引产生的redo size 为221600-1140=220460
       redo size         221600
 
       SQL> alter index idx_mytest rebuild;    --重建索引
           
       SQL> select 221600 last,448132 cur,448132-221600 diff from dual;
       
             LAST        CUR     DIFF
       ---------- ---------- ----------
           221600   448132   226532 --重建索引产生的日志比直接建还要多,主要是重建过程还有一个对旧索引的删除
 
             
       SQL> alter index idx_mytest rebuild nologging; --使用nologging重建索引。
                                                --也可以在创建索引的时候直接使用nologging关键字
                                                --如:create index idx_mytest_nolog mytest_nolog(object_id) nologging
       SQL> SELECT a.name,b.value  FROM v$statname a JOIN v$mystat b ON a.statistic# = b.statistic# WHERE a.name = "redo size";;    --查看当前的redo size
 
       NAME               VALUE
       --------------- ----------              --基于nologging日志模式重建索引产生的redo size为469160-448132=21028
       redo size         469160
 
   5.非归档模式下的LOGGING与NOLOGGING
 
       SQL> drop table mytest purge;
 
       SQL> drop table mytest_nolog purge;
       
       SQL> select log_mode,force_logging from v$database;  --切换日志到非归档模式后,下面是查询的结果
 
       LOG_MODE   FOR
       ------------ ---
       NOARCHIVELOG NO
       
       SQL> SELECT a.name,b.value  FROM v$statname a JOIN v$mystat b ON a.statistic# = b.statistic# WHERE a.name = "redo size";;    --查看当前的redo size
 
       NAME               VALUE
       --------------- ----------
       redo size           1688
       SQL> create table mytest as select * from dba_objects; --创建表对象,使用logging日志记录模式
 
       SQL> SELECT a.name,b.value  FROM v$statname a JOIN v$mystat b ON a.statistic# = b.statistic# WHERE a.name = "redo size";; --查看当前的redo size
 
       NAME               VALUE
       --------------- ----------            --使用logging日志记录模式,创建表对象之后产生的redo size 为-1688 =68548
       redo size            70236
 
       SQL> create table mytest_nolog nologging as select * from dba_objects; --创建表对象,使用nologging日志记录模式
 
       SQL> SELECT a.name,b.value  FROM v$statname a JOIN v$mystat b ON a.statistic# = b.statistic# WHERE a.name = "redo size";; --查看当前的redo size
 
       NAME               VALUE
       --------------- ----------           --使用nologging日志记录模式创建表对象之后产生的redo size为135464-70236=65228
 
       redo size         135464
         
   6.小结:
        使用logging与nologging来创建对象或执行DML时
            对于非归档模式下,其产生的日志信息(redo size)相差的并不大
            对于归档模式下,logging模式产生的日志将远远大于使用nologging模式产生的日志量更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2016-06/132016p2.htm
  • 1
  • 2
  • 下一页
Oracle redo日志文件分析(insert)Oralce数据库的优化相关资讯      Oracle redo日志 
  • Oracle redo日志文件分析(insert  (06月04日)
  • Oracle redo日志维护  (04/10/2015 10:32:18)
本文评论 查看全部评论 (0)
表情: 姓名: 字数