您现在的位置是:首页 >技术教程 >Oracle大事务回滚网站首页技术教程

Oracle大事务回滚

挠背小能手 2024-06-17 11:28:39
简介Oracle大事务回滚

包含如下:–>注意RAC时其它实例的问题,或使用GVKaTeX parse error: Expected 'EOF', got '#' at position 152: ….收集事务恢复相关信息的脚本 #̲###############…ktuxe
where ktuxesta <> ‘INACTIVE’
and ktuxecfl like ‘%DEAD%’
order by ktuxesiz asc;

select distinct KTUXECFL,count(*) from x$ktuxe group by KTUXECFL;

KTUXECFL                  COUNT(*)
------------------------ ----------
DEAD                              1
NONE                          2393
SCO|COL                          8

===========
ktuxeusn – Undo Segment Number
ktuxeslt – Slot number
ktuxesqn – Sequence
ktuxesta – State
ktuxesiz – Undo Blocks Remaining
ktuxecfl – Flag

USN SLOT SEQ STATE UNDO


 9            9         335         ACTIVE         10337

##############################################
2.查询包含死事务的UNDO段的信息:
select useg.segment_name, useg.segment_id, useg.tablespace_name, useg.status
from dba_rollback_segs useg
where useg.segment_id in (select unique ktuxeusn
from x$ktuxe
where ktuxesta <> ‘INACTIVE’
and ktuxecfl like ‘%DEAD%’);

SEGMENT_NAME SEGMENT_ID TABLESPACE_NAME STATUS


_SYSSMU9$ 9 UNDOTBS1 ONLINE

select usn,name
from v r o l l n a m e w h e r e u s n i n ( s e l e c t u n i q u e k t u x e u s n f r o m x rollname where usn in (select unique ktuxeusn from x rollnamewhereusnin(selectuniquektuxeusnfromxktuxe
where ktuxesta <> ‘INACTIVE’
and ktuxecfl like ‘%DEAD%’);
##############################################
3.大事务恢复所需的时间
alter session set nls_date_format=‘yyyymmdd hh24:mi:ss’;
select usn, state, undoblockstotal “Total”, undoblocksdone “Done”, undoblockstotal-undoblocksdone “ToDo”,
decode(cputime,0,‘unknown’,sysdate+(((undoblockstotal-undoblocksdone) / (undoblocksdone / cputime)) / 86400)) “Estimated time to complete”
from v$fast_start_transactions;
USN STATE Total Done ToDo Estimated time to Complete


5    RECOVERING        16207     14693      1514     11-may-2012 08:05:40

####################################################
4.对于死事务回滚所需时间的评估:
select distinct KTUXECFL,count() from x$ktuxe group by KTUXECFL;
KTUXECFL COUNT(
)
------------------------ ----------
DEAD 1
NONE 2393
SCO|COL 8

select ADDR,KTUXEUSN,KTUXESLT,KTUXESQN,KTUXESIZ from x$ktuxe where KTUXECFL=‘DEAD’;
ADDR KTUXEUSN KTUXESLT KTUXESQN KTUXESIZ


00002B92FF5D5F68 15 12 314961 43611
–KTUXESIZ代表需要回滚的回滚块数。

declare
l_start number;
l_end number;
begin
select ktuxesiz
into l_start
from x k t u x e w h e r e K T U X E U S N = 10 a n d K T U X E S L T = 39 ; − − − − − − − − − 这里根据实际数字来填写 d b m s l o c k . s l e e p ( 60 ) ; − − − − − − − − − 单位是秒,建议适当增大一些,评估出的时间更准确。 s e l e c t k t u x e s i z i n t o l e n d f r o m x ktuxe where KTUXEUSN = 10 and KTUXESLT = 39; ---------这里根据实际数字来填写 dbms_lock.sleep(60); ---------单位是秒,建议适当增大一些,评估出的时间更准确。 select ktuxesiz into l_end from x ktuxewhereKTUXEUSN=10andKTUXESLT=39;这里根据实际数字来填写dbmslock.sleep(60);单位是秒,建议适当增大一些,评估出的时间更准确。selectktuxesizintolendfromxktuxe
where KTUXEUSN = 10
and KTUXESLT = 39; ---------这里根据实际数字来填写
dbms_output.put_line(‘time cost Day:’ ||
round(l_end / (l_start - l_end) / 60, 2));
end;
/
(l_start - l_end) -->dbms_lock.sleep(60);指定的60秒间隔恢复的块数
l_end -->还需要恢复的块数
l_end / (l_start - l_end) /得出所需恢复的分钟数;
------------------------------------------得出所需小时
declare
l_start number;
l_end number;
begin
select ktuxesiz
into l_start
from x k t u x e w h e r e K T U X E U S N = 10 a n d K T U X E S L T = 39 ; d b m s l o c k . s l e e p ( 60 ) ; s e l e c t k t u x e s i z i n t o l e n d f r o m x ktuxe where KTUXEUSN = 10 and KTUXESLT = 39; dbms_lock.sleep(60); select ktuxesiz into l_end from x ktuxewhereKTUXEUSN=10andKTUXESLT=39;dbmslock.sleep(60);selectktuxesizintolendfromxktuxe
where KTUXEUSN = 10
and KTUXESLT = 39;
dbms_output.put_line(‘time cost Day:’ ||
round(l_end / (l_start - l_end)/60, 2));
end;
/


round(l_end / (l_start - l_end)/60, 2)部分可以修改为:
TO_CHAR(sysdate+(l_end/(l_start-l_end)*60/86400),‘YYYY/MM/DD HH24:MI:SS’)
显示评估的到什么时间可以恢复完成。
##############################################
5.查询并行恢复时Slaves进程数量
select * from v$fast_start_servers;
STATE UNDOBLOCKSDONE PID XID


RECOVERING 54 18 001F005C00001BD6
RECOVERING 0 20 001F005C00001BD6

如果只有1个进程STATE 是RECOVERING ,其它都是IDLE; 建议关闭并行回滚–>FAST_START_PARALLEL_ROLLBACK=FALSE。
##############################################
6.查询事务恢复涉及的对象–>查字典表
查出SID:
select decode(px.qcinst_id,NULL,username,’ - '||lower(substr(s.program,length(s.program)-4,4) ) ) “Username”,
decode(px.qcinst_id,NULL, ‘QC’, ‘(Slave)’) “QC/Slave” ,
to_char( px.server_set) “Slave Set”,
to_char(s.sid) “SID”,
decode(px.qcinst_id, NULL ,to_char(s.sid) ,px.qcsid) “QC SID”,
px.req_degree “Requested DOP”,
px.degree “Actual DOP”
from gv p x s e s s i o n p x , g v px_session px, gv pxsessionpx,gvsession s
where px.sid=s.sid (+)
and px.serial#=s.serial#
order by 5 , 1 desc ;

根据SID查出对象ID:
select distinct current_obj#
from v$active_session_history
where SESSION_ID=145
and SESSION_SERIAL#=15;
–(This Query to be run multiple times and you should be able to see the Current Object id consistently)
根据object_id查 Object_name
select Object_name, object_type
from dba_objects
where object_id=77211;

##############################################
7.查询事务恢复涉及的对象–>DUMP UNDO段
通过下面的语句查到回滚的事务:
select * from v f a s t s t a r t t r a n s a c t i o n s ; 或者 s e l e c t ∗ f r o m x fast_start_transactions; 或者 select * from x faststarttransactions;或者selectfromxktuxe where KTUXECFL=‘DEAD’ AND KTUXESTA!=‘INACTIVE’
根据上面的语句,我们可以查到事务的undo的segment id(USN或者KTUXEUSN),undo的slot(SLT或者KTUXESLT),和undo的sequence(SEQ或者KTUXESQN)。
根据USN,我们可以查到undo segment:
select * from v$rollname where usn=xxx

DUMP相应段:
alter system dump undo block “” XID ;
例如:alter system dump undo block “_SYSSMU33$” XID 33 56 7463;

dump出来的trace file,可以判断object number(objn)或者object id(objd)
cat xxx.trc |grep objn

根据object_id查 Object_name
select Object_name, object_type
from dba_objects
where object_id=77211;

################################
8.收集事务恢复相关信息的脚本

  1. Complete Database Alert log (at least logs from last 2sucessful startups)
  2. SMON Trace file (if available)
  3. Undo Block dump Trace file (if taken).
    ----------------------收集信息命令脚本:
    spool /tmp/transaction_recovery.html
    set markup html on
    set time on
    alter session set nls_date_format=‘dd-mon-yyyy hh24:mi:ss’;
    select sysdate from dual;
    show parameter fast_start_parallel_rollback
    select ktuxeusn USN, ktuxeslt Slot, ktuxesqn Seq, ktuxesta State,ktuxesiz Undo from x k t u x e w h e r e k t u x e s t a < > ′ I N A C T I V E ′ a n d k t u x e c f l l i k e ′ s e l e c t u s n , s t a t e , u n d o b l o c k s t o t a l " T o t a l " , u n d o b l o c k s d o n e " D o n e " , u n d o b l o c k s t o t a l − u n d o b l o c k s d o n e " T o D o " , d e c o d e ( c p u t i m e , 0 , ′ u n k n o w n ′ , s y s d a t e + ( ( ( u n d o b l o c k s t o t a l − u n d o b l o c k s d o n e ) / ( u n d o b l o c k s d o n e / c p u t i m e ) ) / 86400 ) ) " E s t i m a t e d t i m e t o c o m p l e t e " f r o m v ktuxe where ktuxesta <> 'INACTIVE' and ktuxecfl like '%DEAD%' order by ktuxesiz asc; select usn, state, undoblockstotal "Total", undoblocksdone "Done", undoblockstotal-undoblocksdone "ToDo", decode(cputime,0,'unknown',sysdate+(((undoblockstotal-undoblocksdone) / (undoblocksdone / cputime)) / 86400)) "Estimated time to complete" from v ktuxewherektuxesta<>INACTIVEandktuxecfllikeselectusn,state,undoblockstotal"Total",undoblocksdone"Done",undoblockstotalundoblocksdone"ToDo",decode(cputime,0,unknown,sysdate+(((undoblockstotalundoblocksdone)/(undoblocksdone/cputime))/86400))"Estimatedtimetocomplete"fromvfast_start_transactions;
    select * from v f a s t s t a r t s e r v e r s ; s e l e c t k t u x e u s n , t o c h a r ( s y s d a t e , ′ D D − M O N − Y Y Y Y H H 24 : M I : S S ′ ) " T i m e " , k t u x e s i z , k t u x e s t a f r o m x fast_start_servers; select ktuxeusn, to_char(sysdate,'DD-MON-YYYY HH24:MI:SS') "Time", ktuxesiz, ktuxesta from x faststartservers;selectktuxeusn,tochar(sysdate,DDMONYYYYHH24:MI:SS)"Time",ktuxesiz,ktuxestafromxktuxe where ktuxecfl = ‘DEAD’;
    set markup html off
    spool off

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。