ORACLE 从8i开始,引进了fast start parallel rollback机制来进行事务恢复,SMON使用并行的方式来进行事务的恢复,可以通过参数FAST_START_PARALLEL_ROLLBACK来控制是否启用和并行的进程个数
可以取下面的三个值
FALSE – 禁用并行恢复事务,使用旧的串行的方式。
LOW – 限制最大的并行度是2 * CPU_COUNT
HIGH -限制最大的并行度是4 * CPU_COUNT
但是并行恢复常常出现问题,如SMON进程使用CPU占用100%,还有就是恢复相当的慢,pq进程之前互相干扰,所以有些时间我们不得不禁用并行恢复机制。
在串行恢复机制下,我们常常增加_CLEANUP_ROLLBACK_ENTRIES值如400,每一次回滚400个entries,加速恢复的速度。
可能通过v$fast_start_server视图来查看并行的进程的状态,如果出现了idle进程,那么我们需要禁用并行恢复机制。
www.htz.pw >@tran_parallel_rollback.sql Session altered. USN STATE PID OS_PID USED_TIME(S) Total Done ToDo Estimated time to c ---------- ---------------- ---------- ------------ ------------- ---------- ---------- ---------- ------------------- 5 RECOVERING 15 20968 121 486100 73564 412536 2013-05-04 19:29:16 STATE UNDOBLOCKSDONE PID OS_PID XID ----------- -------------- ---------- ------------ ---------------- RECOVERING 73567 15 20968 050023005B010000 RECOVERING 0 21 20970 050023005B010000 RECOVERING 0 23 20972 050023005B010000 RECOVERING 0 25 20974 050023005B010000
暂停SMON进行事务恢复
www.htz.pw >oradebug setospid 20396
Oracle pid: 8, Unix process pid: 20396, image: oracle@rhel4 (SMON)
www.htz.pw >oradebug event 10513 trace name context forever ,level 2;
Statement processed.
暂停并行恢复后,过几分钟后,我们从v$fast_start_server与v$fast_start_transactions中都找不到回退的进程的信息,但是我们这里可以通过x$ktuxe来查看相关的信息
select ADDR, KTUXEUSN, KTUXESLT, KTUXESQN, KTUXESIZ from x$ktuxe where KTUXECFL = 'DEAD' ADDR KTUXEUSN KTUXESLT KTUXESQN KTUXESIZ ---------------- ---------- ---------- ---------- ---------- 0000002A973B79B8 8 4 355 500116
过10分钟左右,v$process也查不到并行恢复进程相当的信息,所以这里我们根本不需要去手动kill掉并行恢复相当进程,因为ORACLE会自己的kill掉相关的并行recover进程
如果不想等待,我们可以手动kill掉相当的进程
下面是改回串行
www.htz.pw >alter system set fast_start_parallel_rollback=false; System altered. www.htz.pw >oradebug setospid 20396 Oracle pid: 8, Unix process pid: 20396, image: oracle@rhel4 (SMON) www.htz.pw >oradebug event 10513 trace name context off; Statement processed. www.htz.pw >oradebug eventdump process Statement processed. www.htz.pw >@tran_parallel_rollback.sql Session altered. USN STATE PID OS_PID USED_TIME(S) Total Done ToDo Estimated time to c ---------- ---------------- ---------- ------------ ------------- ---------- ---------- ---------- ------------------- 5 RECOVERING 232 339650 176665 162985 2013-05-04 19:42:02 8 RECOVERED 652 500116 500116 0 2013-05-04 19:38:28 如果smon没有唤醒,可以通过下面的命令来唤醒 www.htz.pw >select pid,spid from v$process where spid=20396; PID SPID ---------- ------------ 8 20396 www.htz.pw >oradebug wakeup 8; Statement processed.
下面是计算恢复还需要多长的时间
www.htz.pw >@tran_dead.sql KTUXECFL COUNT(*) ------------------------ ---------- DEAD 2 NONE 576 ADDR KTUXEUSN KTUXESLT KTUXESQN KTUXESIZ ---------------- ---------- ---------- ---------- ---------- 0000002A97494488 5 35 347 101071 0000002A974939E0 8 4 355 0 DO YOU COMPUTE RECOVERY TIME :DO ENTER ,NOT CTRL+C: Enter Search Usn (i.e. 3) : 5 Enter Search Slt (i.e. 4) : 35 PL/SQL procedure successfully completed. time cost Hours:.02 PL/SQL procedure successfully completed.
ORACLE 启用与禁用事务的并行恢复:等您坐沙发呢!