2016-07-27 10 views
0

Я бегу хрон, которые следующий/SQL блок PL:ORA-30036: не удалось расширить сегмент на 8 в отмен табличного 'UNDOTBS'

declare 
    begin 
--insert into DB_LOGS_TEMP table from DB_LOGS table 
INSERT INTO DB_LOGS_TEMP SELECT * FROM DB_LOGS WHERE DB_LOG_ID NOT IN(SELECT DB_LOG_ID from DB_LOGS_TEMP); 
--keep the lat 10 records and delete other records 
DELETE DB_LOGS where rowid in ( 
select rid from ( 
select t.rowid rid, 
     row_number() over(partition by T.DB_LOG_ID order by T.TIMESTAMP desc) as rn 
from DB_LOGS t) 
where rn > 10); 
end; 

Таблица DB_LOGS имеет 10247302 строки. Когда задание cron запускается, он выдает ошибку как ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS'. Увеличивает ли tablepce единственное решение этой проблемы и как это сделать? UNDOTBS имеет 524288000 байт.

+0

Возможно, вы удалите многие записи без фиксации. Может быть, вам нужно чаще прокручивать стол, выдавая фиксации. Можете ли вы сделать это или должны быть в одной транзакции? – vercelli

ответ

1

Это работает для меня в то время как увеличение табличного и делает AUTOEXTEND дальше.

ALTER DATABASE DATAFILE '/vg01lv11/oracle//data/undotbs_d1_O2P00R11.dbf' AUTOEXTEND ON; 

ALTER DATABASE DATAFILE '/vg01lv11/oracle//data/undotbs_d1_O2P00R11.dbf' 
     RESIZE 1000M; 
+1

Будьте осторожны; вы также можете установить maxsize, поэтому Oracle не будет заполнять вашу файловую систему. Чтобы файл данных не превышал 10 г, вы можете сказать: ALTER DATABASE DATAFILE '/vg01lv11/oracle//data/undotbs_d1_O2P00R11.dbf' AUTOEXTEND ON MAXSIZE 10g; –

+0

Я сделаю это изменение @Mark – Andrew

1

Если вы можете позволить себе удаление в различных операций:

DECLARE 
    i PLS_INTEGER; 
BEGIN 
    --insert into DB_LOGS_TEMP table from DB_LOGS table 
    INSERT INTO DB_LOGS_TEMP 
    SELECT * 
    FROM DB_LOGS 
    WHERE DB_LOG_ID NOT IN 
    (SELECT DB_LOG_ID FROM DB_LOGS_TEMP 
    ); 
    COMMIT; 
    i:=50; 
    --keep the lat 10 records and delete other records 
    WHILE i>=10 
    LOOP 
    DELETE DB_LOGS 
    WHERE rowid IN 
     (SELECT rid 
     FROM 
     (SELECT t.rowid rid, 
      row_number() over(partition BY T.DB_LOG_ID order by T.TIMESTAMP DESC) AS rn 
     FROM DB_LOGS t 
     ) 
     WHERE rn > i 
    ); 
    COMMIT; 
    i:=i-5; 
    END LOOP; 
END; 
+0

он работает для меня, увеличивая табличное пространство и делая autoextend включенным. Я не думаю, что сделка была актуальной проблемой. – Andrew

+1

@ Андре да, ваш UNDO TBS был очень маленьким. Но будьте осторожны с этими огромными удалениями, они могут развить ваш UNDO. – vercelli