oracle 物理结构之redo log

一、重做日志文件的作用:

1、 记录所有数据的改变

2、 提供恢复机制

3、 组方式管理(最少两组,默认为3组,每组一个重做日志文件, oracle官方建议,所有的每组重做日志文件大小最好相同;当然如果是为重做日志文件组添加成员的时候不能指定大小,因为每个重做日志文件相互冗余,所以必须一致)

二、重做日志文件状态

通过lgwr写到日志文件里面

oracle 物理结构之redo log_第1张图片

oracle 物理结构之redo log_第2张图片

日志组1写满了,就会切换到日志组2,然后到33再到1,循环使用。反正日志组是不停的工作。

重做日志文件一般具有4种状态(也可以分为6种)

1、 unused:说明此重做日志文件组没被用过

2、 current:说明是当前重做日志组,lgwr正在写

3、 active:说明此重做日志文件组刚写完,记录在重做日志文件组中的事务所造成的数据块的改变,没有完全从缓冲区写入到数据文件,重做日志文件组属于这种状态,是不允许被覆盖的,一旦写完成,就变问inactive状态。

4、 inactive:说明记录在重做日志文件组中的事务所造成的数据块的改变,已经从缓冲区写入到数据文件,这种状态允许被覆盖。

上面4中状态是重做日志文件常见的状态,下面两种状态是在重做日志组损坏或者特殊情况下的状态。

5clearing:说明该重做日志文件正被重建(重建后状态变为unused

6clearing_cyrrent:说明此重做日志文件重建是出现错误

下面是日志大小设置问题

日志文件设置大小问题,值得我们思考

v$log_history这个动态视图查询日志切换的频率,根据这个频率来判断日志的大小是否合适

SQL> desc v$log_history;

NameNull?Type

----------------------------------------- -------- ----------------------------

RECIDNUMBER

STAMPNUMBER

THREAD#NUMBER

SEQUENCE#NUMBER

FIRST_CHANGE#NUMBER

FIRST_TIMEDATE

NEXT_CHANGE#NUMBER

RESETLOGS_CHANGE#NUMBER

RESETLOGS_TIMEDATE

oracle 物理结构之redo log_第3张图片

oracle 物理结构之redo log_第4张图片

日志组空间太小的话,第一会导致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事务表的变化。

3lgwr发生的条件

http://blog.csdn.net/yujin2010good/article/details/7709120

LGWR,用于将重做日志缓冲区所记载的全部内容写入到重做日志文件中。

Oracle 总是先日志后修改(先记载变化然后修改数据);

DBWR工作之前,LGWR首先将事务变化写入到重做日志。

LGWR工作触发条件:

1、提交事务(commit

2、每隔3秒钟

3、当重做日志信息超过1M

4、重做日志缓冲区超过1/3

4SCN(System Change Number

SCN用于标识数据变化的唯一标识号,其数值顺序递增。执行事务操作时,系统会为每个事务变化生成相应的SCN.

基本上是发生dml操作时scn+1,正常关闭或者commit时也scn+1

5、日志序列号

日志序列号是重做日志的使用标识号,其数值也是循序递增的,当进行日志切换时,日志序列会自动增一,并将该信息写入到控制文件中去。

oracle 物理结构之redo log_第5张图片

6、重做线程(Redo Thread

重做线程由一组相关的重做日志组成。对于单实例的数据库系统来说,只有一个重做线程,而对于RAC(Real Application Cluster)来说,多个实例会同时访问数据库,并且每个实例都有独立的重做线程。

oracle 物理结构之redo log_第6张图片

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

INACTIVE1132531 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

CURRENT1139367 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

ACTIVE1139309 08-JUL-12 1139367 08-JUL-12

3 1 12 52428800 512 1 YES

ACTIVE1139367 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会将检查点时刻的SCNSystem Change Number)写入到控制文件和数据文件头部,同时促使后台进程DBWR将所有的脏缓冲区写入到数据文件中。当Oracle发出检查点时,后台进程CKPT促使后台进程DBWR开始工作,而后台进程DBWR又促使后台进程LGWR开始工作。因为当发出检查点时CKPTDBWRLGWR同时工作,所以数据文件、控制文件和重做日志的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可以确定哪些文件处于不同步状态。

2REDO.确定了不同步的数据文件后,SMON会重新应用哪些在数据文件未执行的事务操作,并且DBWR会将提交和未提交的数据写到数据文件及UNDO段上。

3REDO之后会打开数据库,此时客户应用可以访问数据库。

4UNDO。在第二步后,数据文件既包含被提交的数据,也包含被提交的数据。打开数据库后,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;

SQL> SELECT TO_CHAR(first_time,'yyyy-mm-dd hh24:mi:ss'),group# 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;

上面两种方法都可以添加日志组,不多截图了,占空间。

当然日子组的个数也是有限制的。查看限制也有几种方法

盖总写的

oracle 物理结构之redo log_第7张图片

自己按照这个方法去找,没找到,谁帮忙看看?(trace

SQL> show parameter user_dump_dest

NAMETYPE VALUE

------------------------------------ ----------- ------------------------------

user_dump_deststring /oracle/products/diag/rdbms/wo

lf/wolf/trace

SQL> alter system set events 'immediate trace name controlf level 10'

Database altered.oracle 物理结构之redo log_第8张图片

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 drop logfile group 5;

SQL> alter database drop 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

欢迎加入:
119224876(db china联盟),233065499(db china联盟),229845401(虚拟化-云计算-物联网)

你可能感兴趣的:(oracle)