2018-03-08 Oracle 宅必备

这个专题讲一些日常运维的异常处理

今天讲一次大事务回滚导致的数据库奇慢

1. 现象

公司一套测试数据库User反应查询还可以,做DML操作没有反应,会hang住

2. 原因查找

2.1 查看等待事件

select* from v$session_wait order by event desc ;

发现有大量的checkpoint incompleted 和Wait for a undo record等待

2.2 诊断 checkpoint incomplete

通过v$session_wait 对应的SID号对应的进程全部对应到的是并行进程(J000-J016)

2.3 查询并行状态

SELECT QCSID, SID, INST_ID "Inst", SERVER_GROUP "Group", SERVER_SET "Set",

DEGREE "Degree", REQ_DEGREE "Req Degree"

FROM GV$PX_SESSION ORDER BY QCSID, QCINST_ID, SERVER_GROUP, SERVER_SET;

上面语句可以查找出 coordinator 的SID,通过查询其对应的是SMON进程

该进程是数据库的主进程我们无法对其做操作

2.4 诊断Wait for a undo record

通过搜索我们查出如下网站有所发现

http://expertoracle.com/2017/06/19/wait-for-a-undo-record-or-wait-for-stopper-event-to-be-increased-database-messages/

从上面我们得知当Oracle做大事物回滚时smon进程会作为coordinator 启动并行恢复

这时就可能会导致数据库DML语句无法继续

2.5 查询undo表空间使用率

SELECT round(((SELECT (NVL(SUM(bytes), 0))FROM dba_undo_extents

WHERE tablespace_name =

(select value from v$parameter

where lower(name) = 'undo_tablespace')

AND status IN ('ACTIVE', 'UNEXPIRED')) * 100) /

(SELECT SUM(bytes) FROM dba_data_files

WHERE tablespace_name =

(select value from v$parameter

where lower(name) = 'undo_tablespace')), 2) PCT_INUSE

FROM dual

2.6 查看当前事务占用的undo大小

SELECT s.sid, s.username, s.program, t.name,

t.used_ublk * (SELECT value/1024/1024 FROM v$system_parameter2 WHERE name='db_block_size') as "undoMB",

flag,space,recursive,noundo,ptx, t.start_time start_mmddyy, t.status

FROM v$transaction t, v$session s

WHERE t.addr=s.taddr(+)

ORDER BY t.used_ublk DESC;

2.7 查看undo表空间各个时间段retention大小

select to_char(begin_time, 'DD-MON-RR HH24:MI') begin_time,

to_char(end_time, 'DD-MON-RR HH24:MI') end_time,

tuned_undoretention

from v$undostat

order by end_time;

3.问题处理

临时解决方案我们需要调整fast_start_parallel_rollback参数为false

修改后重启数据库

fast_start_parallel_rollback = false scope=spfile;

如果不使用spfile,会导致大量enq: PE - contention等待,从而使业务收到影响

重启后等待回滚完成可将值修改回来

4.关于FAST_START_PARALLEL_ROLLBACK

该参数用于指定回滚的并行度,当使用fast-start parallel rollback时 smon充当coordinator角色并开启相应的多个J00进程,他可以有三个值

  • FALSE: Parallel rollback is disabled

  • LOW: Limits the maximum degree of parallelism to 2 * CPU_COUNT

  • HIGH : Limits the maximum degree of parallelism to 4 * CPU_COUNT

当修改该参数时rollback会停止并重新启动