用户修改一条数据时,redo的一系列的行为
1,用户发出一条SQL语句,Oracle为该事务分配了唯一的事务号
2,服务器进程负责将需要的数据、索引和undo数据读入内存,并将要更新的行加锁
3,服务器进程获得重做拷贝闩锁(闩锁实现对redo_buffer的串行使用),该闩锁是服务器进程访问redo_log_buffer
的第一步。此时如果,没有其他的闩锁使用,则别的服务器进程无法使用redo_log_buffer
4,服务器进程获得重做分配闩锁从而获得在redo_log_buffer中的预留空间,此时释放重做分配闩锁
5,服务器进程利用重做拷贝闩锁把 重做项(更新数据的原始值,操作类型,事务号等信息)写入redo_log_buffer
中,然后释放重做拷贝闩锁
6,服务器进程把还原信息写入该事务相关的undo段中,undo段在用户使用rollback时使用
7,服务器进程更新锁住的数据,将回滚所需的原始值和对数据所做的修改都写入db_buffer_cache中,然后
db_buffer_cache的这些数据被标记为脏数据
========================================
LGWR把redo_log_buffer的数据写入redofiles条件:
1,3秒
2,1/3,特别说明,并不是redo_log_buffer永远不会超过其1/3容量,而是说当redo_log_buffer的数据量
达到其容量的1/3这个阀值时,LGWR会写出其中的数据,而剩下的2/3的数据可以供其他服务器进程使用
3,checkpoint
4,commit
5,DBWR写之前
SQL> show parameter log_buffer
NAME TYPE VALUE
------------------------------------ -------------------------------- ------------------------------
log_buffer integer 11187200
============================================================
查看会话的等待事件
SQL> col event for a35
SQL> col username for a10
SQL> select sw.sid,s.username,sw.event,sw.wait_time
2 from v$session s,v$session_wait sw
3 where sw.event not like 'rdbms%'
4 and sw.sid=s.sid
5 order by sw.wait_time,sw.event;
SID USERNAME EVENT WAIT_TIME
---------- ---------- ----------------------------------- ----------
142 SYS SQL*Net message to client -1
151 Streams AQ: qmn coordinator idle wa 0
it
146 Streams AQ: qmn slave idle wait 0
148 Streams AQ: waiting for time manage 0
ment or cleanup tasks
139 jobq slave wait 0
158 jobq slave wait 0
159 jobq slave wait 0
143 jobq slave wait 0
170 pmon timer 0
165 smon timer 0
10 rows selected.
Log bufffer space
说明:缺少redo_log_buffer空间
原因:
1,一般是服务器进程写入速度比LGWR的写出速度快——调整redo_log_buffer大小
2,redo_files所在磁盘速度慢——将重做日志文件迁移到高速磁盘
3,设备争用——将重做日志文件和数据文件或归档放在不同磁盘上
Log file parallel write
说明:日志文件并行写等待,是将redo_log_buffer中的数据写入磁盘引起的等待事件
原因:
1,一般是日志文件所在的磁盘慢——同上,换高速设备
2,磁盘争用——同上,分散
Log file single write
说明:与写日志文件头块有关,表示检查点中的等待
Log file switch(archiving needed)
说明:日志文件切换等待。——当日志组,写完一圈后,而归档还未完成,日志切换不过了
原因:
1,I/O问题——分开日志文件,减少磁盘争用
2,ARCH归档进程跟不上LGWR进程的速度——启动多个ARCH进程或I/O进程
3,日志组太少——增加日志组
Log file switch(checkpoint incomplete)
说明:日志切换频繁,造成checkpoint排队
原因:
1,一般是redo_log_buffer太小——增加redo_log_buffer大小
2,日志组太小——加日志组
Log file sync
说明:当用户commit时,redo_log_buffer中的数据会一次全部写到重做日志文件中,
此时发生LGWR的写出等待
原因:
1,磁盘争用
2,磁盘速度慢
Latch free
说明:是当前的服务器进程需要某个闩锁,比如等待共享池的library_cache闩锁
通过v$latch查看相关的闩锁命中率
SQL> select LATCH#,NAME,GETS,MISSES,1-(MISSES/(GETS+MISSES)) "gets rate"
2 from v$latch
3 where MISSES > 1;
LATCH# NAME GETS MISSES gets rate——进一步确认闩锁的命中率
---------- -------------------- ---------- ---------- ----------
42 slave class create 150 10 .9375
213 shared pool 2483935 9 .999996377
148 redo allocation 86149 870 .990002183
117 cache buffers lru ch 420467 3 .999992865
ain
17 messages 412799 19 .999953975
131 object queue header 701391 2 .999997149
operation
136 archive process latc 18453 2 .999891628
h
214 library cache 4006075 6 .999998502
323 qmn task queue latch 7450 238 .969042664
109 Memory Management La 697 5 .992877493
tch
146 redo writing 121231 2 .999983503
11 rows selected.
==============================================================
SQL> show parameter log_buffer;
NAME TYPE VALUE
------------------------------------ ------------- ----------------
log_buffer integer 11187200——单位是字节,设置时也必须用字节来修改
SQL> select name,value/(1024*1024) M
2 from v$parameter
3 where name = 'log_buffer';
NAME M
-------------------- ----------
log_buffer 10.6689453
假设要设置为15M,转换为字节
SQL> select 15*1024*1024 bytes from dual;
BYTES
----------
15728640
SQL> alter system set log_buffer = 15728640 scope=spfile;
System altered.
SQL> shutdown immediate
SQL> startup
SQL> show parameter log_buffer
NAME TYPE VALUE
------------------------------------ -------------------------------- ------------------------------
log_buffer integer 19446784
SQL> select 19446784/1024/1024 MB from dual;
MB
----------
18.5458984——这里的buffer大小为15M,但是其数值为18.5458984M,是因为Oracle会根据系统情况做一些调整
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26465805/viewspace-713102/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26465805/viewspace-713102/