暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 表空间问题: ORA-01653: 无法为实体化视图日志扩展表X

askTom 2017-03-06
460

问题描述

嗨,团队,

请在下面的问题上提出建议。

我面临ORA-01653: 无法在表空间Z中通过Y扩展表X (此处X为MLOG $ view),同时更新其中一个表中的多行。下面是详细的场景。

1.有一个表空间下面使用和可用空间

已使用的mb FREEMB TotalMB
TablespaceA 6200 5800 12000

2.这个表空间有4个数据文件,低于freespace

文件id MB
1 8
2 40
3 1700.9375
4 2983


3.我们有尺寸为5788mb的表X

现在,当我更新与mlog $ view相关联的表X时,该视图也正在更新。我正在更新表中的每一行,表中大约有15Cr行。更新此时,我面临ORA-01653: 无法扩展表X。

但是如果我们看到,表空间上有5800的自由空间。如果我们假设整个表正在更新,则mlog $将等于或小于5788 MB的表大小。我不明白为什么会出现此错误。




专家解答

当您在带有MV日志的表中插入/更新/删除行时,Oracle数据库将更改写入日志。但这不仅仅是列值。还有一大堆其他元数据捕获:

create table plch_invoices (
  invoice_id int not null primary key,
  customer_id int not null,
  invoice_datetime date not null
);
--
create materialized view log on plch_invoices 
  with rowid, sequence (customer_id, invoice_datetime);

create materialized view plch_invoice_mv
enable query rewrite as
  select count(*)
  from   plch_invoices i;
  
insert into plch_invoices
  select rownum, rownum, sysdate+(rownum/100) from dual
  connect by level <= 10;
  
commit;

select * from mlog$_plch_invoices;

CUSTOMER_ID  INVOICE_DATETIME      M_ROW$$             SEQUENCE$$  SNAPTIME$$            DMLTYPE$$  OLD_NEW$$  CHANGE_VECTOR$$  XID$$                
1            06-MAR-2017 05:41:55  AAAfmdAAdAAAARXAAA  11,001      01-JAN-4000 00:00:00  I          N          FE               281,474,976,718,223  
2            06-MAR-2017 05:56:19  AAAfmdAAdAAAARXAAB  11,002      01-JAN-4000 00:00:00  I          N          FE               281,474,976,718,223  
3            06-MAR-2017 06:10:43  AAAfmdAAdAAAARXAAC  11,003      01-JAN-4000 00:00:00  I          N          FE               281,474,976,718,223  
4            06-MAR-2017 06:25:07  AAAfmdAAdAAAARXAAD  11,004      01-JAN-4000 00:00:00  I          N          FE               281,474,976,718,223  
5            06-MAR-2017 06:39:31  AAAfmdAAdAAAARXAAE  11,005      01-JAN-4000 00:00:00  I          N          FE               281,474,976,718,223  
6            06-MAR-2017 06:53:55  AAAfmdAAdAAAARXAAF  11,006      01-JAN-4000 00:00:00  I          N          FE               281,474,976,718,223  
7            06-MAR-2017 07:08:19  AAAfmdAAdAAAARXAAG  11,007      01-JAN-4000 00:00:00  I          N          FE               281,474,976,718,223  
8            06-MAR-2017 07:22:43  AAAfmdAAdAAAARXAAH  11,008      01-JAN-4000 00:00:00  I          N          FE               281,474,976,718,223  
9            06-MAR-2017 07:37:07  AAAfmdAAdAAAARXAAI  11,009      01-JAN-4000 00:00:00  I          N          FE               281,474,976,718,223  
10           06-MAR-2017 07:51:31  AAAfmdAAdAAAARXAAJ  11,010      01-JAN-4000 00:00:00  I          N          FE               281,474,976,718,223  

复制


如果你有5788Mb的空闲,那就是 (5788*1024) 6,069,157,888字节。我假设15Cr是指150,000,000。如果是这样,这意味着MV日志中每一行的最大大小可以是:

6,069,157,888 / 150,000,000 ~ 40 bytes
复制


存储以上所有内容并不多。您将仅使用rowid,XID,sequence和snaptime就可以接近这一点,更不用说表格列了!所以你得到这个错误对我来说并不奇怪...

如果要更新表中的所有行,则必须在之后有效地完全刷新MV。那么您真的需要进行此操作的MV日志吗?你可以放下它,然后重新创建吗?

或为您的表空间分配更多空间?;)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论