日志文件是二进制文件,它记录了数据文件的变化。日志文件是物理存在的文件,它的组织模式是组,组是逻辑的组织方式,每个实例至少要两个组。
Select * from v$logfile;

Select * from v$log;

select to_char(FIRST_TIME,'yyyy/mm/dd') day,count(*) from v$log_history
group by to_char(FIRST_TIME,'yyyy/mm/dd');

select current_scn from V$database;--16514163
 
实验:日志文件管理和nologging的实现
该实验的目的是验证我们学习的日志文件的原理,管理维护日志文件.如何减少日志的产生.用到了一些后面的语法,克服一下.
增加组
查看当前日志文件的路径
Select member from v$logfile;
增加组
alter database add logfile group 9    'D:\ORACLE\ORADATA\O10\REDO08.rr'  size 4m;
如果不指定组号,数据库自动分配组号
验证
   Select * from v$log;
   Select * from v$logfile; 
组内的日志文件叫做成员
同组内的成员是镜像关系,大小相等
使用成员的目的是安全
一个组内有一个成员可以使用,该组就可用
一般要把不同的成员放在不同的盘上
一个组内成员的最大成员数由控制文件决定。
增加成员到现有的组
 alter database add logfile member 'D:\ORACLE\ORADATA\O10\REDO08.kk' to group 9;
增加成员不要指明大小,它和现有的日志大小相同,是镜像关系。要指明组。
Alter system switch logfile;
使成员的状态为正确
Select * from v$logfile;
查看成员信息
删除成员
 alter database drop logfile member 'D:\ORACLE\ORADATA\O10\REDO08.kk';
如果删除不掉,可能是因为该组为当前组
手工切换
alter system switch logfile;
再删除就可以了,一个组内最少有一个成员。最后的成员是不能删除的。
日志文件改名称
1.Select * from v$log;
2.如果想修改的日志为当前组,请切换
           Alter system switch logfile;
3.select * from v$logfile;
            查看现有的文件名称
4.拷贝日志文件到新的名称
5.alter database rename file ‘..old’  to ‘…new’;
      这句话是修改控制文件的指针,使控制文件知道日志文件已经处于新的位置了,所以新的位置文件一定得存在,不然会报错。
6.select * from v$logfile;
    验证修改成功
清除组内的内容
Alter database clear logfile group 9;
如果清除不了
Alter system switch logfile;
清除等于删除老的,增加新的日志文件
删除组
该组应该为非当前,非活动。如果是请切换组
Alter database drop logfile group 9;
正常的DML总要产生日志,但当我们要大量的加载数据的时候我们希望尽快的完成任务,我们可以使用nologging的选项,该选项可以减少日志的产生,只产生少量的日志.当真的是这样吗?不是的,请看实验
SQL> conn scott/tiger
Connected.
SQL> drop table t1 purge;
Table dropped.
SQL> drop table t2 purge;
Table dropped.
SQL> create table t1 as select * from emp;
Table created.
SQL> insert into t1 select * from t1;
14 rows created.
SQL> /
28 rows created.
反复重复插入,直到2000行.构造一个大表.
SQL> /
1792 rows created.
SQL> commit;
Commit complete.
SQL> create table t2 as select * from t1 where 0=9;
建立空表t2
Table created.
SQL> set autotrace trace stat
SQL> insert into t2 select * from t1;
正常的SQL语句,没有禁止日志的产生
3584 rows created.
Statistics
----------------------------------------------------------
        298  recursive calls
        322  db block gets
        157  consistent gets
          1  physical reads
     193200  redo size  正常产生日志
        
SQL> rollback;
Rollback complete.
SQL> insert into t2 select * from t1 nologging;
禁止日志的产生模式插入
3584 rows created.
Statistics
----------------------------------------------------------
          5  recursive calls
        166  db block gets
        106  consistent gets
          0  physical reads
     181104  redo size   没有效果
      
SQL> rollback;
Rollback complete.
SQL> alter table t2 nologging;
将T2表改为nologging模式
Table altered.
SQL> insert into t2 select * from t1 nologging;
3584 rows created.
Statistics
----------------------------------------------------------
        175  recursive calls
        164  db block gets
        125  consistent gets
          0  physical reads
     181044  redo size   没有效果
        
SQL> rollback;
Rollback complete.
SQL> insert /*+ append */ into t2 select * from t1 nologging;
3584 rows created.
Statistics
----------------------------------------------------------
        136  recursive calls
        107  db block gets
        105  consistent gets
          0  physical reads
     189460  redo size  没有效果
        
为什么我们无论怎么改变都没有效果,很奇怪
SQL> conn / as sysdba
Connected.
SQL> select FORCE_LOGGING from v$database;
FORCE_
------
YES
原来数据库的运行模式为强制产生日志,这就难怪了.
SQL> alter database no FORCE LOGGING;
Database altered.
SQL> select FORCE_LOGGING from v$database;
FORCE_
------
NO
SQL> conn scott/tiger
Connected.
SQL> set autot  trace stat
SQL> insert into t2 select * from t1;
3584 rows created.
Statistics
--------------------------------------
        311  recursive calls
        166  db block gets
        141  consistent gets
          0  physical reads
     181052  redo size
SQL> insert into t2 select * from t1 nologging;
3584 rows created.
Statistics
-----------------------------------------------
        327  recursive calls
        261  db block gets
        183  consistent gets
          0  physical reads
     188816  redo size  没有效果
SQL> insert /*+ append */ into t2 select * from t1;
并行插入无nologging选项
3584 rows created.
Statistics
----------------------------------------------------------
          0  recursive calls
         34  db block gets
         31  consistent gets
          0  physical reads
        528  redo size  有效果
        
SQL> rollback;
Rollback complete.
SQL> insert /*+ append */ into t2 select * from t1 nologging; 
并行插入加nologging选项
3584 rows created.
Statistics
----------------------------------------------------------
          0  recursive calls
         34  db block gets
         31  consistent gets
          0  physical reads
        484  redo size  效果最好,只有少量的日志产生
总结:只有数据库不是强制产生日志的状态下,并行插入才可以产生少量的日志.其它情况都要产生大量的日志,无论你在什么样的表空间,无论是否使用nologging选项.
 
                    
                     
                    
                 
                    
                 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号