2016-07-27 54 views
0

我運行已下列PL/SQL塊cron作業: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'。增加表格是否是這個問題的唯一解決方案,以及如何做到這一點? 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不會填滿你的文件系統。爲防止數據文件超過10g,您可以說: 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

它適用於我,同時增加表空間並使其自動延伸。我不這麼認爲交易是真正的問題。 – Andrew

+1

@Andrew是的,你的UNDO TBS真的很小。但要小心這種巨大的刪除,他們可能會增加你的UNDO。 – vercelli