WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606
全部博文(599)
分类: Oracle
2010-01-12 14:46:16
十六、log file switch(checkpoint imcomplete)
十七、log file switch completion
十八、log file sync(Commit类)
A. 每隔3秒
B. 当日志缓冲区的1/3已满或具有1MB的重做条目时
C. 当用户提交或回滚事务时
D. 当DBWR进程给LGWR发出信号(当DBWR将脏块写入到数据文件之前写入)
SELECT a.sid,
a.event,
a.time_waited,
round(a.time_waited / c.sum_time_waited * 100, 2) || '%' pct_wait_time,
d.VALUE user_commits,
round((SYSDATE - b.logon_time) * 24) hours_connected
FROM v$session_event a,
v$session b,
(SELECT sid, SUM(time_waited) sum_time_waited
FROM v$session_event
WHERE event NOT IN
('smon timer', 'pmon timer', 'rdbms ipc message', 'Null event',
'parallel query dequeue', 'pipe get', 'client message',
'SQL*Net message to client', 'SQL*Net message from client',
'SQL*Net more data from client', 'dispatcher timer',
'virtual circuit status',
'lock manager wait for remote message', 'PX Idle Wait',
'PX Deq: Execution Msg', 'PX Deq: Table Q Normal',
'wakeup time manager', 'slave wait', 'i/o slave wait',
'jobq slave wait', 'null event', 'gcs remote message',
'gcs for action', 'ges remote message', 'queue messages')
HAVING SUM(time_waited) > 0
GROUP BY sid) c,
v$sesstat d
WHERE a.sid = b.sid
AND a.sid = c.sid
AND a.sid = d.sid
AND d.statistic# =
(SELECT statistic# FROM v$statname WHERE NAME = 'user commits')
AND a.time_waited > 10000
AND a.event = 'log file sync'
ORDER BY hours_connected DESC, pct_wait_time
SELECT s.event, s.time_waited, s.average_wait
FROM v$system_event s
WHERE s.event IN ('log file parallel write', 'log file sync')
注:'log file parallel write'事件的平均等待时间大于10ms(1cs),这通常表示存在缓慢的IO吞吐量。
高提交率 |
原因: >> 高提交率会增加开始与结束事务时的系统开销(事务表的更新、提交后的清除、回滚段的使用被记录在日志缓冲区中等等)。 解决方法: >> 以事务单元作为提交的准则。 >> 不要因为回滚段空间不足或死锁的原因而引入附加的提交。如果回滚段空间不够而造成不可以处理一个工作单位,可以分配足够的空间给UNDO表空间,并且设置适当的UNDO保留时间(通过初始化参数undo_retention设置)。 >> 来自于中间层的持久性连接,因为服务于许多前端用户,所以只能用10046事件进行跟踪,以观察应用程序的行为;或使用Oracle Log Miner查看重做日志文件。 |
缓慢的IO子系统 |
通过查询v$system_event视图,找出LGWR平均等待时间。小于1厘秒(cs)一般是可以接受的。 |
过大的日志缓冲区 |
>> 日志缓冲区过小,会造成log buffer space事件上的等待,而日志缓冲区过大,会造成LGWR进程写入频率变慢,一次写入量变大。 >> 可以通过减少初始化参数_LOG_IO_SIZE的值,这将增LGWR的后台写入,从而减少log file sync等待时间,但这种方法仍然需要一定的系统开销,更为活跃的LGWR将在redo copy和redo writing锁存器方面添加更多的负载。 >> 获得_LOG_IO_SIZE设置值: select trunc(a.value/b.value*512) as "REDO每次写入字节数", WHERE s.NAME = 'redo blocks written') a, WHERE s.NAME = 'redo writes') b >> 较大的processes参数值也可增加log file sync的等待,在每个同步操作期间,LGWR必须扫描所有进程的数据结构查找哪些会话正在这个事件上等待,并将它们的重做写入到硬盘。 |
事件号:184
事件名:log file sync
参数一:需要同步的日志缓冲区的区号
十九、log buffer space(Configuration类)
-- 会话级统计必须等待日志缓冲区的次数。
SELECT s.SID , s.VALUE
FROM v$sesstat s
WHERE s.statistic# =
(SELECT t.statistic#
FROM v$statname t
WHERE t.NAME = 'redo buffer allocation retries')
-- 系统级统计必须等待日志缓冲区的次数
SELECT s.STATISTIC#, s.CLASS, s.NAME , s.VALUE
FROM v$sysstat s
WHERE s.statistic# =
(SELECT t.statistic#
FROM v$statname t
WHERE t.NAME = 'redo buffer allocation retries')
过小的日志缓冲区 |
>> 检查当前LOG BUFFER的设置,并根据需要做适当的调整。 >> 日志缓冲区不是SGA中的动态组件,因此必须生效前需要重启实例。 |
缓慢的I/O子系统 |
>> 确保log file parallel write等待事件的平均等待时间在可接受的范围内,否则需要改进IO性能。 >> 根据应用程序的情况,在适当的位置设置NOLOGGING选项。 >> 作为辅助手段借助Oracle Log miner深入研究来自于v$sql视图或重做日志文件的DML,发现异常行为。 |
二十、log file parallel write(SYSTEM I/0类)
>> 每隔3秒写入一次
>> 在提交或回滚时
>> 在满足_LOG_IO_SIZE阈值时
>> 在日志缓冲区有1MB的重做项时
>> 由DBWR提交时
SELECT s.event, s.time_waited, s.average_wait
FROM v$system_event s
WHERE s.event IN ('log file parallel write', 'log file sync')
注:'log file parallel write'事件的平均等待时间大于10ms(1cs),这通常表示存在缓慢的IO吞吐量。
也可以设法降低重做的数量。
>> 只要有可能就使用NOLOGGING选项。
>> CTAS操作也应该使用该选项。
也可以以较高的回滚段使用率为代价的较低提交频率,来缓解一些IO需求,使用以下SQL查出谁在频繁提交数据:
SELECT sid, VALUE
FROM v$sesstat s
WHERE s.statistic# =
(SELECT statistic# FROM v$statname WHERE NAME = 'user commits')
ORDER BY VALUE
SELECT b.NAME, a.VALUE, round(SYSDATE - c.startup_time) day_old
FROM v$sysstat a, v$statname b, v$instance c
WHERE a.statistic# = b.statistic#
AND b.NAME IN ('redo wastage', 'redo size')
注:由于LGWR不象DBWR那样能够有多个,所以尽可能将REDO放在IO快的磁盘结构上,不要放在象RAID5这样的磁盘上。
SELECT round((a.VALUE / b.VALUE) + 0.5, 0) AS avg_redo_blks_per_write,
round((a.VALUE / b.VALUE) + 0.5, 0) * c.lebsz AS avg_io_size -- 字节为单位
FROM v$sysstat a, v$sysstat b, x$kccle c
WHERE c.lenum = 1
AND a.NAME = 'redo blocks written'
AND b.NAME = 'redo writes'
注:x$kccle.lebsz字段包含每个日志块的大小。
事件号:176
事件名:log file parallel write
参数一:写入的日志文件号
参数二:写入的块数
参数三:IO请求的号码
二十一、log file sequential read
事件号:174
事件名:log file sequential read
参数一:REDO日志组中重做日志文件的相对序列号。
参数二:开始读入的块号
参数三:块数
二十二、SQL*Net message from client
参数一:显示客户端网络驱动的类型。
参数二:来自客户端的字节数
二十三、SQL*Net message to client
参数一:客户端连接使用的网络驱动器的类型
参数二:发送到客户端的字节数