一、重做日志文件的作用:
1、 记录所有数据的改变
2、 提供恢复机制
3、 组方式管理(最少两组,默认为3组,每组一个重做日志文件, oracle官方建议,所有的每组重做日志文件大小最好相同;当然如果是为重做日志文件组添加成员的时候不能指定大小,因为每个重做日志文件相互冗余,所以必须一致)
二、重做日志文件状态
通过lgwr写到日志文件里面
日志组1写满了,就会切换到日志组2,然后到3;3再到1,循环使用。反正日志组是不停的工作。
重做日志文件一般具有4种状态(也可以分为6种)
1、 unused:说明此重做日志文件组没被用过
2、 current:说明是当前重做日志组,lgwr正在写
3、 active:说明此重做日志文件组刚写完,记录在重做日志文件组中的事务所造成的数据块的改变,没有完全从缓冲区写入到数据文件,重做日志文件组属于这种状态,是不允许被覆盖的,一旦写完成,就变问inactive状态。
4、 inactive:说明记录在重做日志文件组中的事务所造成的数据块的改变,已经从缓冲区写入到数据文件,这种状态允许被覆盖。
上面4中状态是重做日志文件常见的状态,下面两种状态是在重做日志组损坏或者特殊情况下的状态。
5、clearing:说明该重做日志文件正被重建(重建后状态变为unused)
6、clearing_cyrrent:说明此重做日志文件重建是出现错误
下面是日志大小设置问题
日志文件设置大小问题,值得我们思考
v$log_history 这个动态视图查询日志切换的频率,根据这个频率来判断日志的大小是否合适
SQL> desc v$log_history;
Name Null? Type
----------------------------------------- -------- ----------------------------
RECID NUMBER
STAMP NUMBER
THREAD# NUMBER
SEQUENCE# NUMBER
FIRST_CHANGE# NUMBER
FIRST_TIME DATE
NEXT_CHANGE# NUMBER
RESETLOGS_CHANGE# NUMBER
RESETLOGS_TIME DATE
日志组空间太小的话,第一会导致dbwr写的频率增加,增加了i/o;第二会造成事务的等待,延长事务周期,导致数据库假死,后果严重。
如果太大的话,记录的事务多了,这时日志文件损坏,丢失数据就会很多;如果发生崩溃,那么redo的时间会很长。(原因:数据在修改时不是直接写入datafile,而是操作记录在redo log,当ckpt发生,他才会从redo log读取已经修改的数据,写入datafile,而要想让他写入datafile的条件之一就是日志切换,如果不考虑其他条件,只有等日志切换时,才会写入datafile,一般情况下没事,但是发生日志损坏)
还有要考虑业务的繁忙程度,按照最忙的时候去设置日志的大小
总之一句话要保证lgwr有可写的日志组去写日志。按照官方建议,日志切换时间一般在10-15分钟比较适合
三、下面是一些基本概念
1、重做日志组(Redo Log Group)
日志组由一组完全相同的重做日志文件组成,每个日志组至少包含一个重做日志文件。如果一个日志组包含多个重做日志文件,后台进程LGWR会将相同的事务变化写入到同一个日志组的各个重做日志文件中。日志组汇总的每个重做日志文件都被称为日志成员,同一个日志组中所有日志成员都具有相同的日志序列号和尺寸。
2、重做日志条目(Redo Entry)
重做记录,由一组变化向量组成,这些变化向量包含表块变化(快位置、变化数据)、UNDO块变化和UNDO事务表的变化。
3、lgwr发生的条件
http://blog.csdn.net/yujin2010good/article/details/7709120
LGWR,用于将重做日志缓冲区所记载的全部内容写入到重做日志文件中。
Oracle 总是“先日志后修改”(先记载变化然后修改数据);
在DBWR工作之前,LGWR首先将事务变化写入到重做日志。
LGWR工作触发条件:
1、提交事务(commit)
2、每隔3秒钟
3、当重做日志信息超过1M
4、重做日志缓冲区超过1/3满
4、SCN(System Change Number)
SCN用于标识数据变化的唯一标识号,其数值顺序递增。执行事务操作时,系统会为每个事务变化生成相应的SCN.
基本上是发生dml操作时scn+1,正常关闭或者commit时也scn+1
5、日志序列号
日志序列号是重做日志的使用标识号,其数值也是循序递增的,当进行日志切换时,日志序列会自动增一,并将该信息写入到控制文件中去。
6、重做线程(Redo Thread)
重做线程由一组相关的重做日志组成。对于单实例的数据库系统来说,只有一个重做线程,而对于RAC(Real Application Cluster)来说,多个实例会同时访问数据库,并 且每个实例都有独立的重做线程。
7、日志切换
日志切换至后台进程LGWR停止写一个日志组,并开始写另一个日志组的事件,默认情况下,当日志组写满后,后台进程LGWR会自动进行日志切换。
当日志切换时,当前日志序列号会自动递增
也有手工切换日志
SQL> alter system switch logfile;
System altered.
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC
---------- ---------- ---------- ---------- ---------- ---------- ---
STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------------- ------------- --------- ------------ ---------
1 1 10 52428800 512 1 YES
ACTIVE 1137238 08-JUL-12 1139309 08-JUL-12
2 1 11 52428800 512 1 NO
CURRENT 1139309 08-JUL-12 2.8147E+14
3 1 9 52428800 512 1 YES
INACTIVE 1132531 08-JUL-12 1137238 08-JUL-12
SQL> alter system switch logfile;
System altered.
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC
---------- ---------- ---------- ---------- ---------- ---------- ---
STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------------- ------------- --------- ------------ ---------
1 1 10 52428800 512 1 YES
ACTIVE 1137238 08-JUL-12 1139309 08-JUL-12
2 1 11 52428800 512 1 YES
ACTIVE 1139309 08-JUL-12 1139367 08-JUL-12
3 1 12 52428800 512 1 NO
CURRENT 1139367 08-JUL-12 2.8147E+14
SQL> alter system archive log current;(手动归档)
System altered.
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC
---------- ---------- ---------- ---------- ---------- ---------- ---
STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------------- ------------- --------- ------------ ---------
1 1 13 52428800 512 1 NO
CURRENT 1139443 08-JUL-12 2.8147E+14
2 1 11 52428800 512 1 YES
ACTIVE 1139309 08-JUL-12 1139367 08-JUL-12
3 1 12 52428800 512 1 YES
ACTIVE 1139367 08-JUL-12 1139443 08-JUL-12
日志切换是,chpt发出checkpoint,然后促使scn写入控制文件和数据文件头,lgwr写完之后,dbwr开始把缓冲区脏数据写入数据文件。
当数据块处于归档模式时,日志切换时促使后台进程arch讲日志内容保存到归档日志
如下:
# pwd
/oracle/products/diag/rdbms/wolf/wolf/alert
# ls
log.xml
# tail -f log.xml
<txt>Completed checkpoint up to RBA [0xd.2.10], SCN: 1139443
</txt>
</msg>
<msg time='2012-07-08T21:35:06.308-05:00' org_id='oracle' comp_id='rdbms'
client_id='' type='UNKNOWN' level='16'
host_id='oracle' host_addr='192.168.8.254' module=''
pid='6160592'>
<txt>Incremental checkpoint up to RBA [0xd.273.0], current log tail at RBA [0xd.2aa.0]
</txt>
</msg>
<msg time='2012-07-08T21:44:00.575-05:00' org_id='oracle' comp_id='rdbms'
client_id='' type='UNKNOWN' level='16'
host_id='oracle' host_addr='192.168.8.254' module='sqlplus@oracle (TNS V1-V3)'
pid='14680092'>
<txt>ALTER SYSTEM ARCHIVE LOG
</txt>
</msg>
<msg time='2012-07-08T21:44:00.713-05:00' org_id='oracle' comp_id='rdbms'
client_id='' type='UNKNOWN' level='16'
host_id='oracle' host_addr='192.168.8.254' module=''
pid='6357218'>
<txt>Beginning log switch checkpoint up to RBA [0xe.2.10], SCN: 1140448
</txt>
</msg>
<msg time='2012-07-08T21:44:00.713-05:00' org_id='oracle' comp_id='rdbms'
client_id='' type='UNKNOWN' level='16'
host_id='oracle' host_addr='192.168.8.254' module=''
pid='6357218'>
<txt>Thread 1 advanced to log sequence 14 (LGWR switch)
</txt>
</msg>
<msg time='2012-07-08T21:44:00.713-05:00' org_id='oracle' comp_id='rdbms'
client_id='' type='UNKNOWN' level='16'
host_id='oracle' host_addr='192.168.8.254' module=''
pid='6357218'>
<txt> Current log# 2 seq# 14 mem# 0: /oracle/products/oradata/wolf/redo02.log
</txt>
</msg>
<msg time='2012-07-08T21:44:00.890-05:00' org_id='oracle' comp_id='rdbms'
client_id='' type='UNKNOWN' level='16'
host_id='oracle' host_addr='192.168.8.254' module='sqlplus@oracle (TNS V1-V3)'
pid='14680092'>
<txt>Archived Log entry 10 added for thread 1 sequence 13 ID 0xffffffffdfbf1c80 dest 1:
</txt>
</msg>
<msg time='2012-07-08T21:49:47.708-05:00' org_id='oracle' comp_id='rdbms'
client_id='' type='UNKNOWN' level='16'
host_id='oracle' host_addr='192.168.8.254' module=''
pid='6160592'>
<txt>Completed checkpoint up to RBA [0xe.2.10], SCN: 1140448
</txt>
</msg>
<msg time='2012-07-08T22:05:15.112-05:00' org_id='oracle' comp_id='rdbms'
client_id='' type='UNKNOWN' level='16'
host_id='oracle' host_addr='192.168.8.254' module=''
pid='6160592'>
<txt>Incremental checkpoint up to RBA [0xe.295.0], current log tail at RBA [0xe.b9b.0]
</txt>
</msg>
8、检查点
检查点(Checkpoint)是一个数据库事件,它拥有同步数据库的所有数据文件,控制文件和重做日志。当发出检查点时,后台进程CKPT会将检查点时刻的SCN(System Change Number)写入到控制文件和数据文件头部,同时促使后台进程DBWR将所有的脏缓冲区写入到数据文件中。当Oracle发出检查点时,后台进程CKPT促使后台进程DBWR开始工作,而后台进程DBWR又促使后台进程LGWR开始工作。因为当发出检查点时CKPT、DBWR、LGWR同时工作,所以数据文件、控制文件和重做日志的SCN完全一致,从而使三种数据库文件保持完全同步。
Chpt反生-------他会叫dbwr写-------他会叫lgwr写------lgwr他写完了---dbwr在写-写完
日志切换,日志组写满后,后台进程lgwr会进行日志切换,切换时,系统会促使后台进程ckpt发出checkpoint。
关闭数据库,正常关闭数据库,后台进程会发出检查点,而且要检查点完成之后才关闭数据库,就是上面的一个流程走完。
alter system switch logfile;一般在备份的时候,为了把脏数据块写入数据文件,就手工执行命令,强制ckpt发出checkpoint。
Fast_start_mttr_target,手工指定恢复最大时间,(如果人为设置不科学)当然oracle也会根据参数去调整。
9、实例恢复
实例恢复是指当出现实例失败时有后台进程SMON自动同步数据文件、控制文件和重做日志并打开数据库的过程。
Smon实例恢复过程:
1)确定不同步的物理文件。通过比较数据文件、控制文件和重做日志的SCN,后台进程SMON可以确定哪些文件处于不同步状态。
2)REDO.确定了不同步的数据文件后,SMON会重新应用哪些在数据文件未执行的事务操作,并且DBWR会将提交和未提交的数据写到数据文件及UNDO段上。
3)REDO之后会打开数据库,此时客户应用可以访问数据库。
4)UNDO。在第二步后,数据文件既包含被提交的数据,也包含被提交的数据。打开数据库后,SMON会自动使用UNDO段取消未提交的数据。
四、基本操作
(建议日子切换时间在15-30分钟之间,太短了日志可能归档来不及,太长了,恢复时间增加了)
1) 查看当前日志
SQL> select * from v$log;
2) 查看日志文件路径
SQL> select * from v$logfile;
3) 手动强制切换日志
SQL> alter system switch logfile;
4) 手动归档
SQL> alter system archive log current;
5) 查看历史文件
SQL> select * from v$log_history;
desc v$log_history
select SEQUENCE#,to_char(FIRST_TIME,'yyyy-mm-ddhh24:mi:ss') from v$log_history;
6) 查看归档模式
SQL> select log_mode from v$database;
SQL> archive log list;
7) 增加日志组
SQL> col member for a50
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ------- ------- --------------------------------------------------
IS_
---
3 ONLINE /oracle/products/oradata/wolf/redo03.log
NO
2 ONLINE /oracle/products/oradata/wolf/redo02.log
NO
1 ONLINE /oracle/products/oradata/wolf/redo01.log
NO
SQL> alter database add logfile '/oracle/products/oradata/wolf/redo04.log' size 50m;
Database altered.
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ------- ------- --------------------------------------------------
IS_
---
3 ONLINE /oracle/products/oradata/wolf/redo03.log
NO
2 ONLINE /oracle/products/oradata/wolf/redo02.log
NO
1 ONLINE /oracle/products/oradata/wolf/redo01.log
NO
GROUP# STATUS TYPE MEMBER
---------- ------- ------- --------------------------------------------------
IS_
---
4 ONLINE /oracle/products/oradata/wolf/redo04.log
NO
SQL> alter database add logfile group 6 '/oracle/redo06.log' size 50m;
上面两种方法都可以添加日志组,不多截图了,占空间。
当然日子组的个数也是有限制的。查看限制也有几种方法
盖总写的
自己按照这个方法去找,没找到,谁帮忙看看?(trace)
SQL> show parameter user_dump_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest string /oracle/products/diag/rdbms/wo
lf/wolf/trace
SQL> alter system set events 'immediate trace name controlf level 10'
8)删除日志组
SQL> alter database drop logfile group 6;
9) 增加和删除日志成员
alter database add logfile member '/oracle/redo09.log' to group 5;
alter database add logfile member '/oracle/redo10.log' to group 5;
SQL> alter database drop logfile member '/oracle/redo10.log';
在oracle里面删除之后,文件需要手动去删除
10) 移动日志文件或者修改名字
SQL> alter database rename file '/oracle/products/oradata/wolf/redo04.log' to '/oracle/redo04.log';
移动之后目录下redo04.log文件还存在,需要手动删除
11) 如果日志文件发生损坏或者丢失,试用下面的命令恢复
SQL> alter database clear logfile group 5;
SQL> alter database clear logfile group 4;
这里强调一下一定要注意一个问题:无论是移动还是删除日志,日志组的时候一定要看清楚是否是inactive,不然可能报错
SQL> startup force;
\ORACLE instance started.
Total System Global Area 1570009088 bytes
Fixed Size 2207128 bytes
Variable Size 1090519656 bytes
Database Buffers 469762048 bytes
Redo Buffers 7520256 bytes
Database mounted.
ORA-03113: end-of-file on communication channel
Process ID: 8978452
Session ID: 191 Serial number: 3
欢迎加入qq群:
119224876(db china联盟),233065499(db china联盟),229845401(虚拟化-云计算-物联网)