sql - 撤消表空间问题
问题描述
我正在尝试从多个表中执行删除操作。我正在从近 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。
我考虑过的事情,
调整撤消表空间的大小
alter DATABASE datafile 'D:\ORADATA\MBSA\MBSA\DATAFILE\O1_MF_UNDOTBS1_xxx_.DBF' autoextend on next 1G maxsize 32000M;
以 10k 计数添加提交,使用我遇到的这种方法
ORA-01555: snapshot too old: rollback segment number string with name "string" too small
尝试添加额外的撤消数据文件,但从未考虑过。
增加撤消保留:没有影响
我什至尝试将撤消表空间设置为大文件,但它损坏了数据库。
有没有办法克服这个问题?请帮忙。谢谢!
Oracle 版本是 19c。
撤消保留设置是:
temp_undo_enabled boolean FALSE
undo_management string AUTO
undo_retention integer 1800
undo_tablespace string UNDOTBS1
解决方案
这不是最佳选择,因为您将无法进行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;
推荐阅读
- django - Django密码重置没有反向匹配
- mime - HEIC文件签名
- sql - 使用空值/限制对空列进行排序时,Postgresql 的奇怪行为
- google-app-maker - 将来自两个数据源的数据合并到一个表中
- r - ggplot2:创建一个带有单独观察的箱须图
- typescript - 打字稿不能转换为泛型类型变量
- apache-kafka - 使用卡夫卡流将数据从输入主题写入输出主题时卡夫卡消费者出错
- python - 在 Anaconda 中安装 py2exe 时出现无法满足的错误
- javascript - 如何在 Bootstrap 4 手风琴示例中折叠边框?
- android - 如何在 android 的工作管理器中传递 POJO 类?