вторник, 24 февраля 2009 г.

Oracle Сегменты отката

В oracle 8i все было так :

Создание сегмента отката

!!! Все экстенты сегмента отката в БД должны быть одинаковы

при создании используются следующие параметры:

initial - размер начального экстента сегмента отката

next - размер следующего экстента сегмента отката
указывайте его равным initial

minextents - минимальное число экстентов в сегменте отката
должно быть больше или равно 2

maxextents - максимально разрешенное число экстентов в сегменте отката
ставте число а не unlimited
особенно полезно это для autoextend

optimal - общий оптимальный размер сегмента отката
он не меньше чем initial*minextents, так как initial=next


create rollback segment rollseg01
tablespace orgdbrbs
storage (
initial 10k
next 10k
minextents 20
maxextents 450
optimal 300k
);


alter rollback segment имя online;

Отключить сегмент отката можно только если в нем нет
активных экстентов с незафиксированными транзакциями.

alter rollback segment имя offline;


Изменим параметры
(можно менять все параметры за исключением initial)
изменение параметра next не изменит размер уже существующих
экстентов и делать это не рекомендуется

alter rollback segment rollseg01
storage ( maxextents 200
optimal 310k );



Удалить сегмент отката

drop rollback segment rollseg01;


Вручную сузить область область, отведенную сегменту отката до размера
не меньше чем указано в optimal


alter rollback segment rollseg01 shrink to 220k;

по умолчанию сегмент отката сжимается до optimal

alter rollback segment rollseg01 shrink;

Оракл не уменьшает размер сегмента откатаб если активны его экстенты,
размер которых превышает указанный


select r.usn, r.name, ((sum(e.blocks)+min(s.curblk))*min(p.value))/(1024*1024) Mb
from v$rollname r, v$rollstat s, v$parameter p, dba_extents e
where p.name='db_block_size'
and s.usn=r.usn
and s.usn in (select xidusn from v$transaction)
and e.segment_type='ROLLBACK'
and e.segment_name=r.name
and e.extent_id<=s.curext
group by segment_type, segment_name, r.name, r.usn;



select a.name,
b.xacts,
b.extents,
b.rssize,
b.optsize,
b.hwmsize,
b.status
from v$rollname a,
v$rollstat b
where a.usn=b.usn



select a.username,
a.sid,
a.serial#,
b.name as rbsname,
c.used_ublk
from v$session a,
v$rollname b,
v$transaction c
where a.saddr=c.ses_addr
and b.usn=c.xidusn;


Не закоммиченная транзакция
такого пользователя нужно убить
оракл откатит убитую транзакцию

select a.username,
a.sid,
a.serial#,
to_char(b.start_time,'MM/DD/YY HH24:MI:SS') as start_time,
c.name
from v$session a,
v$transaction b,
v$rollname c,
v$rollstat d
where a.saddr=b.ses_addr
and b.xidusn=c.usn
and c.usn=d.usn
and ((d.curext=b.start_uext-1) or
((d.curext=d.extents-1) and b.start_uext=0))


select s.username,
s.sid,
s.serial#,
t.start_time, t.xidusn
from v$session s,
v$transaction t,
v$rollstat r
where s.saddr=t.ses_addr
and t.xidusn=r.usn
and ((r.curext=t.start_uext-1)
or
((r.curext=r.extents-1)
and (t.start_uext=0)));



Представления

dba_rollback_segs - информация о всех сегментах отката

v$rollstat - размер, текущее число экстентов, наивысшая точка,
оптимальный размер

v$rollname - имя сегмента отката и его номер,
соответствующий записям в v$rollstat

v$transaction - адрес сеанса и использование сегментов
отката текущими транзакциями

v$session - имя sid и порядковый номер адреса сеанса,
соответствуют адресу сеанса в v$transaction


Ошибки

ORA-01562 insufficient space in rollback segment
недостаточно места в сегменте отката

ORA-01560 insufficient space in the tablespace
недостаточно места в табличной области

ORA-01628 MAXEXTENTS has been reached
достигнуто значение MAXEXTENTS



ORA-01555 snapshot to old (rollback segment to small)
моментальный снимок слишком стар
сегмент отката слишком мал
простое повышение maxextents тут не поможет
тут нужно повысить minextents и optimal пересоздав сегмент отката


select s.username, s.sid, rn.name, rs.extents
,rs.status, t.used_ublk, t.used_urec
,do.object_name
from v$transaction t
,v$session s
,v$rollname rn
,v$rollstat rs
,v$locked_object lo
,dba_objects do
where t.addr = s.taddr
and t.xidusn = rn.usn
and rn.usn = rs.usn
and t.xidusn = lo.xidusn(+)
and do.object_id = lo.object_id;


To monitor rollback usage (waits/gets should be < 1 %)

select name, waits, gets
from v$rollstat, v$rollname
where v$rollstat.usn = v$rollname.usn;



select
substr(s.username,1,18) username,
substr(s.program,1,15) program,
decode(s.command,
0,'No Command',
1,'Create Table',
2,'Insert',
3,'Select',
6,'Update',
7,'Delete',
9,'Create Index',
15,'Alter Table',
21,'Create View',
23,'Validate Index',
35,'Alter Database',
39,'Create Tablespace',
41,'Drop Tablespace',
40,'Alter Tablespace',
53,'Drop User',
62,'Analyze Table',
63,'Analyze Index',
s.command||': Other') command
from
v$session s,
v$process p,
v$transaction t,
v$rollstat r,
v$rollname n
where s.paddr = p.addr
and s.taddr = t.addr (+)
and t.xidusn = r.usn (+)
and r.usn = n.usn (+)
order by 1


undo_management=auto and bounce your database:

CREATE UNDO TABLESPACE ts_undo
DATAFILE '/u01/oradata/prod/ts_undo.dbf'
SIZE 2M REUSE AUTOEXTEND ON;

Alter system set undo_tablespace=ts_undo;
Alter system set undo_management=auto;

Комментариев нет:

Отправить комментарий