Oracle Study之--Oracle等待事件(9)
Log buffer space
当log buffer 中没有可用空间来存放新产生的redo log数据时,就会发生log buffer space等待事件。如果数据库中新产生的redo log的数量大于LGWR 写入到磁盘中的redo log 数量,必须等待LGWR 完成写入磁盘的操作,LGWR必须确保redo log写到磁盘成功之后,才能在redo buffer当中重用这部分信息。
如果数据库中出现大量的log buffer space等待事件,可以考虑如下方法:
(1)增加redo buffer的大小。
(2)提升磁盘的I/O性能
Log file sequential read
这个等待事件通常发生在对redo log信息进行读取时,比如在线redo 的归档操作,ARCH进程需要读取redo log的信息,由于redo log的信息是顺序写入的,所以在读取时也是按照顺序的方式来读取的。
这个等待事件包含三个参数:
Log#: 发生等待时读取的redo log的sequence号。
Block#: 读取的数据块号。
Blocks: 读取的数据块个数。
Log file single write
这个等待事件发生在更新redo log文件的文件头时,当为日志组增加新的日志成员时或者redo log的sequence号改变时,LGWR 都会更新redo log文件头信息。
这个等待事件包含三个参数:
Log#: 写入的redo log组的编号。
Block#:写入的数据块号。
Blocks:写入的数据块个数。
Log file parallel write
后台进程LGWR 负责将log buffer当中的数据写到REDO 文件中,以重用log buffer的数据。如果每个REDO LOG组里面有2个以上的成员,那么LGWR进程会并行地将REDO 信息写入这些文件中。
如果数据库中出现这个等待事件的瓶颈,主要的原因可能是磁盘I/O性能不够或者REDO 文件的分布导致了I/O争用,比如同一个组的REDO 成员文件放在相同的磁盘上。
这个等待事件有三个参数:
Files: 操作需要写入的文件个数。
Blocks: 操作需要写入的数据块个数。
Requests:操作需要执行的I/O次数。
Log file switch(archiving needed)
在归档模式下,这个等待事件发生在在线日志切换(log file switch)时,需要切换的在线日志还没有被归档进程(ARCH)归档完毕的时候。 当在线日志文件切换到下一个日志时,需要确保下一个日志文件已经被归档进程归档完毕,否则不允许覆盖那个在线日志信息(否则会导致归档日志信息不完整)。
出现这样的等待事件通常是由于某种原因导致ARCH 进程死掉,比如ARCH进程尝试向目的地写入一个归档文件,但是没有成功(介质失效或者其他原因),这时ARCH进程就会死掉。 如果发生这种情况,在数据库的alert log文件中可以找到相关的错误信息。
这个等待事件没有参数。
Log file switch(checkpoint incomplete)
当一个在线日志切换到下一个在线日志时,必须保证要切换到的在线日志上的记录的信息(比如一些脏数据块产生的redo log)被写到磁盘上(checkpoint),这样做的原因是,如果一个在线日志文件的信息被覆盖,而依赖这些redo 信息做恢复的数据块尚未被写到磁盘上(checkpoint),此时系统down掉的话,Oracle将没有办法进行实例恢复。
在v$log 视图里记录了在线日志的状态。通常来说,在线日志有三种状态。
Active: 这个日志上面保护的信息还没有完成checkpoint。
Inactive: 这个日志上面保护的信息已完成checkpoint。
Current: 当前的日志。
Oracle 在做实例恢复时,会使用状态为current和Active的日志进行实例恢复。
如果系统中出现大量的log file switch(checkpoint incomplete)等待事件,原因可能是日志文件太小或者日志组太少,所以解决的方法是,增加日志文件的大小或者增加日志组的数量。
这个等待事件没有参数。
Log file sync
这是一个用户会话行为导致的等待事件,当一个会话发出一个commit命令时,LGWR进程会将这个事务产生的redo log从log buffer里面写到磁盘上,以确保用户提交的信息被安全地记录到数据库中。
会话发出的commit指令后,需要等待LGWR将这个事务产生的redo 成功写入到磁盘之后,才可以继续进行后续的操作,这个等待事件就叫作log file sync。
当系统中出现大量的log file sync等待事件时,应该检查数据库中是否有用户在做频繁的提交操作。
这种等待事件通常发生在OLTP系统上。OLTP 系统中存在很多小的事务,如果这些事务频繁被提交,可能引起大量的log file sync的等待事件。
这个等待事件包含一个参数:
Buffer#: redo buffer 中需要被写入到磁盘中的buffer。
案例分析:
16:01:25 SYS@ prod>select event,TOTAL_WAITS,AVERAGE_WAIT,EVENT_ID from v$system_event 2* where event like '%log%' EVENT TOTAL_WAITS AVERAGE_WAIT EVENT_ID ---------------------------------------------------------------- ----------- ------------ ---------- log file sequential read 184 .8 549236675 log file single write 51 .45 215477332 log file parallel write 5318 1.39 3999721902 log buffer space 17 21.07 3357856061 log file switch (private strand flush incomplete) 4 7.92 114164561 switch logfile command 3 9.06 3845123846 log file switch completion 9 13.97 3834950329 log file sync 336 3.41 1328744198 ARCH wait for archivelog lock 18 .01 2370101988 9 rows selected. 16:03:06 SYS@ prod>show parameter log_buffer NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_buffer integer 2236416 16:01:10 SYS@ prod>select group#,sequence#,status,bytes/1024/1024 from v$log; GROUP# SEQUENCE# STATUS BYTES/1024/1024 ---------- ---------- ---------------- --------------- 4 31 INACTIVE 4 5 32 CURRENT 4 Elapsed: 00:00:00.02 事务操作; 16:01:53 SCOTT@ prod>select count(*) from t1; COUNT(*) ---------- 700000 Elapsed: 00:00:00.06 16:02:02 SCOTT@ prod>insert into t1 select * from t1; 700000 rows created. 16:09:20 SYS@ prod>select event,TOTAL_WAITS,AVERAGE_WAIT,EVENT_ID from v$system_event 2 where event like '%log%' 3* EVENT TOTAL_WAITS AVERAGE_WAIT EVENT_ID ---------------------------------------------------------------- ----------- ------------ ---------- log file sequential read 506 .41 549236675 log file single write 143 .42 215477332 log file parallel write 6606 1.36 3999721902 log buffer space 18 20.05 3357856061 log file switch (checkpoint incomplete) 78 58.69 2867289651 log file switch (private strand flush incomplete) 4 7.92 114164561 switch logfile command 3 9.06 3845123846 log file switch completion 51 8.32 3834950329 log file sync 344 3.36 1328744198 ARCH wait for archivelog lock 64 .01 2370101988 告警日志: Fri Aug 08 16:07:38 2014 Thread 1 advanced to log sequence 77 (LGWR switch) Current log# 4 seq# 77 mem# 0: /dsk1/oradata/prod/redo04a.log Fri Aug 08 16:07:38 2014 Archived Log entry 133 added for thread 1 sequence 76 ID 0xfc8aa16 dest 2: Thread 1 cannot allocate new log, sequence 78 Checkpoint not complete Current log# 4 seq# 77 mem# 0: /dsk1/oradata/prod/redo04a.log Thread 1 advanced to log sequence 78 (LGWR switch) Current log# 5 seq# 78 mem# 0: /dsk1/oradata/prod/redo05a.log Fri Aug 08 16:07:46 2014 Archived Log entry 134 added for thread 1 sequence 77 ID 0xfc8aa16 dest 2: Fri Aug 08 16:07:46 2014 ORA-1653: unable to extend table SCOTT.T1 by 128 in tablespace USERS Fri Aug 08 16:08:11 2014 Thread 1 advanced to log sequence 79 (LGWR switch) Current log# 4 seq# 79 mem# 0: /dsk1/oradata/prod/redo04a.log Fri Aug 08 16:08:11 2014 Archived Log entry 135 added for thread 1 sequence 78 ID 0xfc8aa16 dest 2: Fri Aug 08 16:08:56 2014 Thread 1 advanced to log sequence 80 (LGWR switch) Current log# 5 seq# 80 mem# 0: /dsk1/oradata/prod/redo05a.log Fri Aug 08 16:08:56 2014 Archived Log entry 136 added for thread 1 sequence 79 ID 0xfc8aa16 dest 2: Fri Aug 08 16:09:37 2014 Thread 1 advanced to log sequence 81 (LGWR switch) Current log# 4 seq# 81 mem# 0: /dsk1/oradata/prod/redo04a.log Fri Aug 08 16:09:37 2014 Archived Log entry 137 added for thread 1 sequence 80 ID 0xfc8aa16 dest 2: @由于日志组size较小,日志组数量少,在做事务处理时,日志切换频繁,发生大量关于redo log的等待事件 解决方法: 1、调整日志组的个数 2、增加日志组size 3、将redo log存储到I/O较快的磁盘上(RAID 10) 4、增大log buffer的size