日志文件是二进制文件,它记录了数据文件的变化。日志文件是物理存在的文件,它的组织模式是组,组是逻辑的组织方式,每个实例至少要两个组。
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号