Круглый стол: Опыт использования недокументированных возможностей
Источник: Russian Oracle User Group
Дата публикации: 02.04.2010


Тема 1: Чтение данных незафиксированной транзакции.

--Подготовка:
create table t ( i number );
insert into t values( 1 );
commit;
--Сеанс 1:
update t set i=100;
--Сеанс 2:
oradebug setospid <pid_of_lgwr>
oradebug suspend
--Сеанс 1:
commit; --висит
--Сеанс 3:
select * from t; --видим незафиксированные данные
--Сеанс 2:
shutdown abort
startup
select * from t; --видим начальное значение

Тема 2: Увеличение кол-ва LIO при обновлении данных.

--Подготовка:
create table t ( i number );
insert into t values( 1 );
commit;
--Сеанс 1:
update t set i=1;
--Сеанс 2:
set autotrace on
select * from t; --видим кол-во LIO
--Сеанс 1:
update t set i=1;
--Сеанс 2:
select * from t; --кол-во LIO возросло
--Сеанс 1:
update t set i=1;
--Сеанс 2:
select * from t; --кол-во LIO возросло
... 

Тема 3: Использование параметра _corrupted_rollback_segments.

--Подготовка:
create table t ( i number );
insert into t values( 1 );
commit;
--Сеанс 1:
update t set i=100;
--Сеанс 2:
select XIDUSN, XIDSLOT, XIDSQN, UBAFIL, UBABLK from v$transaction ;
select * from v$rollname where usn=<XIDUSN> ;
select HEADER_FILE, HEADER_BLOCK from dba_segments where segment_name=<NAME> ;
alter system dump datafile <HEADER_FILE> block <HEADER_BLOCK> ;
alter system dump datafile <HEADER_FILE> block <UBABLK> ;
alter system dump undo block <NAME> xid <XIDUSN> <XIDSLOT> <XIDSQN> ;

!dd if=/u01/oradata/DB11/undotbs01.dbf of=/u01/block.dd bs=8192 skip=<UBABLK> count=1
!dd if=/dev/zero of=/u01/oradata/DB11/undotbs01.dbf bs=8192 seek=<UBABLK> count=1 conv=notrunc

shutdown abort
startup

alter system set "_corrupted_rollback_segments=(<NAME>) scope=spfile;
shutdown immediate
startup
select * from t;