首页 > 解决方案 > 撤消表空间问题

问题描述

我正在尝试从多个表中执行删除操作。我正在从近 30 个表中删除 500k 条记录,每个表可能有也可能没有符合删除标准的记录。每个表都相当大,超过 1 GB。

    BEGIN
    ---Criteria for deletion 
    q_query:=' 
     SELECT a,
            b,
            c
     FROM T,
          GTY,
          GRUP,
          GART,
          T_category
      WHERE T.ID      =  GTY.ID
      AND GTY.ID      =  GRUP.ID
      AND GRUP.ID     =  GART.ID
      AND GART.ID     =  T_CATEGORY.ID;
    
     open c_cursor for q_query;
     --looping all the values in cursor for all the 30 tables.  
      loop fetch c_cursor into l_C,l_ID_V,l_ID_F;
      exit when c_cursor %NOTFOUND;
      
      
      begin
      DELETE FROM T_TABLE WHERE ID=L_ID AND ID_F=L_ID_F;
      .
      .
      .
      DELETE FROM T WHERE ID-L_ID AND ID_F=L_ID_F;
      end;
      end loop;
END;

我遇到了撤消表空间问题。ORA-30036: 无法在撤消表空间 'UNDOTBS1' 中将段扩展 8。

我考虑过的事情,

  1. 调整撤消表空间的大小

        alter  DATABASE datafile 'D:\ORADATA\MBSA\MBSA\DATAFILE\O1_MF_UNDOTBS1_xxx_.DBF'  autoextend on next 1G maxsize 32000M;
    
  2. 以 10k 计数添加提交,使用我遇到的这种方法

        ORA-01555: snapshot too old: rollback segment number string with name "string" too small
    
  3. 尝试添加额外的撤消数据文件,但从未考虑过。

  4. 增加撤消保留:没有影响

  5. 我什至尝试将撤消表空间设置为大文件,但它损坏了数据库。

有没有办法克服这个问题?请帮忙。谢谢!

Oracle 版本是 19c。

撤消保留设置是:

temp_undo_enabled boolean FALSE    
undo_management   string  AUTO     
undo_retention    integer 1800     
undo_tablespace   string  UNDOTBS1

标签: sqloracleplsqlundo-redo

解决方案


这不是最佳选择,因为您将无法进行ROLLBACK;更改,但一种解决方案是COMMIT;在循环之前添加 a end loop;

    BEGIN
    ---Criteria for deletion 
    q_query:=' 
     SELECT a,
            b,
            c
     FROM T,
          GTY,
          GRUP,
          GART,
          T_category
      WHERE T.ID      =  GTY.ID
      AND GTY.ID      =  GRUP.ID
      AND GRUP.ID     =  GART.ID
      AND GART.ID     =  T_CATEGORY.ID;
    
     open c_cursor for q_query;
     --looping all the values in cursor for all the 30 tables.  
      loop fetch c_cursor into l_C,l_ID_V,l_ID_F;
      exit when c_cursor %NOTFOUND;
      
      
      begin
      DELETE FROM T_TABLE WHERE ID=L_ID AND ID_F=L_ID_F;
      .
      .
      .
      DELETE FROM T WHERE ID-L_ID AND ID_F=L_ID_F;
      end;
      COMMIT; --> HERE
      end loop;
END;

推荐阅读