续

当数据库中出现比较严重的free buffer waits等待事件时,可能的原因是:
data buffer 太小,导致空闲空间不够 内存中的脏数据太多,DBWR无法及时将这些脏数据写到磁盘中以释放空间
File#: 需要读取的数据块所在的数据文件的文件号。 Block#: 需要读取的数据块块号。 查询阻塞的语句:
SELECT *+ ORDERED USE_HASH(H,R) */
h.sid hold_sid,
holds.username h_user,
holds.lockwait h_lockwait,
holds.status h_status,
holds.module h_module,
holds.row_wait_obj# h_obj,
holds.row_wait_row# h_row,
r.sid wait_sid,
waits.username w_user,
waits.lockwait w_lockwait,
waits.status w_status,
waits.module w_module,
waits.row_wait_obj# w_obj,
waits.row_wait_row# w_row,
h.type h_type,
h.id1 h_id1,
h.id2 h_id2,
h.lmode h_lmode,
h.request h_request,
h.ctime h_ctime,
h.block h_block,
r.type r_type,
r.id1 r_id1,
r.id2 r_id2,
r.lmode r_lmode,
r.request r_request,
r.ctime r_ctime,
r.block r_block,
'alter system kill session ''' || holds.sid || ',' || holds.serial# || '''; -- kill -9 ' ||
nvl(holdp.spid,
'null') killhold,
holdsql.sql_text hsql,
waitsql.sql_text wsql
FROM v$lock h,
v$lock r,
v$session holds,
v$session waits,
v$process holdp,
v$sqlarea holdsql,
v$sqlarea waitsql
WHERE h.block = 1
AND r.block = 0
AND h.type <> 'MR'
AND r.type <> 'MR'
AND h.id1 = r.id1
AND h.id2 = r.id2
AND h.sid = holds.sid
AND r.sid = waits.sid
AND holds.paddr = holdp.addr(+)
AND holds.sql_address = holdsql.address(+)
AND holds.sql_hash_value = holdsql.hash_value(+)
AND waits.sql_address = waitsql.address(+)
AND waits.sql_hash_value = waitsql.hash_value(+);
Address: 会话等待的latch 地址。 Number: latch号,通过这个号,可以从v$latchname 视图中找到这个latch 的相关的信息。
这个事件包含四个参数:
Handle address: 被加载的对象的地址。 Lock address: 锁的地址。 Mode: 被加载对象的数据片段。 Namespace: 被加载对象在v$db_object_cache 视图中namespace名称。
Handle address: 被加载的对象的地址。 Lock address: 锁的地址。 Mode: 被加载对象的数据片段。 Namespace: 被加载对象在v$db_object_cache 视图中namespace名称。
Files: 操作需要写入的文件个数。 Blocks: 操作需要写入的数据块个数。 Requests:操作需要执行的I/O次数。
如果数据库中出现大量的log buffer space等待事件,可以考虑如下方法:
增加redo buffer的大小。 提升磁盘的I/O性能
这个等待事件包含三个参数:
Log#: 发生等待时读取的redo log的sequence号。 Block#: 读取的数据块号。 Blocks: 读取的数据块个数。
这个等待事件包含三个参数:
Log#: 写入的redo log组的编号。 Block#:写入的数据块号。 Blocks:写入的数据块个数。
Active: 这个日志上面保护的信息还没有完成checkpoint。 Inactive: 这个日志上面保护的信息已完成checkpoint。 Current: 当前的日志。
高提交频率
解决方法是简单的消除不必要的提交,事务是工作单元。工作单元应该是全部成功或全部失败。缓慢的I/O子系统
较高的IO吞吐良可以改善log file sync和log file parallel write事件的平均等待时间。频繁的提交会弄乱数据库布局和IO子系统。解决办法是将日志文件放裸设备上或绑定在RAID 0或RAID 0+1中,而不是绑定在RAID 5中。过大的日志缓冲区
过大的日志缓冲区也可能延长log file sync等待。大型的日志缓冲区减少后台写入的数量,允许LGWR变得懒惰,并导致更多的重做条目堆积在日志缓冲区中。同时可以调整参数_LOG_IO_SIZE参数,其默认值是LOG_BUFFER的1/3或1MB,取两者之中较小的值。换句话说,你可以具有较大的日志缓冲区,但较小的_LOG_IO_SIZE将增加后台写入,从而减少log file sync的等待时间.过小的日志缓冲区
过小的日志缓冲区,还会导致log buffer space等待日志组多少与日志大小不合适 这个等待事件包含一个参数: Buffer#: redo buffer 中需要被写入到磁盘中的buffer。
Driver id: 服务器和客户端连接使用的协议信息。 Breaks:零表示服务端向客户端发送一个重置(reset)信息,非零表示服务器端向客户端发送一个断开(break)消息。
Driver id: 服务器和客户端连接使用的协议信息。 Breaks:零表示服务端向客户端发送一个重置(reset)信息,非零表示服务器端向客户端发送一个断开(break)消息。
这个等待事件包含两个参数:
Driver id: 服务器端和客户端连接使用的协议信息。 #bytes: 服务器端接收到的来自客户端消息的字节数。
这个等待事件也是一个空闲等待事件。
Driver id: 服务器端和客户端连接使用的协议信息。 #bytes: 服务器端通过dblink 收到的来自另一个服务器端消息的字节数。
期待下期更精彩 !
http://www.7daysgps.com/
本文分享自微信公众号 - Oracle优化大师,如有侵权,请联系 service001@enmotech.com 删除。




