همانطور که می دانید، در هنگام اجرای دستور shutdown immediate، بک گراند پروسس SMON باید تراکنشهای در حال اجرا را rollback کند و همچنین این بک گراند پروسس، Temporary segmentها را در صورت وجود پاکسازی کند.
برای تسریع در اجرای دستور shutdown immediate، می توان از طریق eventای؛ SMON را از انجام این دو وظیفه منصرف نمود و انجام آنها را به بعد از استارت بعدی دیتابیس موکول کرد.
—به تعویق انداختن پاکسازی Temporary segmentها: این کار با event شماره 10061قابل انجام است.
مثال زیر را ببینید:
–session 1:
SQL> create index indffff on mytbl(id);
Executing
–session 2:
SQL> select owner, segment_name, segment_type, bytes/1024/1024 size_MB from dba_segments where segment_type=’TEMPORARY’;
SQL> select pid from v$process where PNAME like ‘%SMON%’;
PID
———-
23
SQL> oradebug setorapid 23
Oracle pid: 23, Unix process pid: 6048, image: oracle@ol6 (SMON)
SQL> oradebug event 10061 trace name context forever, level 10
Statement processed.
SQL> shut immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
SQL> select owner, segment_name, segment_type, bytes/1024/1024 size_MB from dba_segments where segment_type=’TEMPORARY’;
برای آشنایی بیشتر با این موضوع، می توانید مطلب “SMON در یک نگاه” را مطالعه بفرمایید.
—به تعویق انداختن Rollback transaction: در مثال زیر خواهیم دید که می توان SMON را به صورت موقت از انجام عملیات rollback منصرف کرد تا این کار بعد از استارت بعدی دیتابیس انجام شود:
–session 1:
SQL> update mytbl set count=count+10 where id =1 and rownum<=10000000;
10000000 rows updated.
SQL> select XIDUSN,sid,serial#,USED_UBLK from v$transaction ,v$session where addr=taddr;
XIDUSN SID SERIAL# USED_UBLK
———- ———- ———- ———-
5 748 23424 56332
–session 2:
SQL> select pid from v$process where PNAME like ‘%SMON%’;
PID
———-
23
SQL> oradebug setorapid 23
Oracle pid: 23, Unix process pid: 23251, image: oracle@ol6 (SMON)
SQL> oradebug event 10061 trace name context forever, level 10
Statement processed.
SQL> shut immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
SQL> select ktuxeusn , ktuxesiz, ktuxesta from x$ktuxe where ktuxecfl = ‘DEAD’ and ktuxesta=’ACTIVE’;
KTUXEUSN KTUXESIZ KTUXESTA
———- ———- —————-
5 8388 ACTIVE
SQL> /
KTUXEUSN KTUXESIZ KTUXESTA
———- ———- —————-
5 5728 ACTIVE
SQL> /
no rows selected