生产报错
用户建立的一个2G一个8G的数据文件还是报错
解析:
但是下次ORACLE分配的EXTENT是9G用户建立了一个8G 一个2G的数据文件
任何一个数据文件都不能容纳下这个EXTENT 而我建立了一个10G的数据文件所以可以容纳下,EXTENT不能垮数据文件是最小的分配单元
模拟本错误:
SQL> create table test2
2 (it int)
3 storage(initial 20k next 20k pctincrease 20)
4 tablespace test_dict;
Table created
注意这里是字典管理才会出现这样的问题,并且要建立字典管理表空间,必须要SYSTEM表空间也是字典管理方式,LOCAL管理的方式,EXTENT的方式只有2中一种AUTO,一种固定大小,
AUTO分配的时候方式如下:
0-15 extents 每个大小是64K 合计大小 1M 8 8K
16-79 extents 每个大小是1M 合计大小 63M 128 8k--以上两项大小合计 64M
80-199 extents 每个大小是8M 合计大小 960M 1024 8K --以上三项大小合计 1024M=1G
200-?? extents 每个大小是64M 8192 8k块
在表中定义STORAGE是无效的。
SQL> create table test3
2 (it int)
3 storage(initial 24k next 1000000k pctincrease 24)
4 tablespace test_dict;
Table created
SQL>
SQL> declare
2 i number(10);
3 begin
4 for i in 1..100000
5 loop
6 insert into test3
7 values(i);
8 end loop;
9 end;
10 /
declare
i number(10);
begin
for i in 1..100000
loop
insert into test3
values(i);
end loop;
end;
ORA-01653: unable to extend table SYS.TEST3 by 125000 in tablespace TEST_DICT
ORA-06512: at line 7
可以看到当我们想分配超过DATAFILE剩余空间的EXTENT的时候是不能分配,即使此时你看到剩余空间还有很多。注意一个EXTENT不能跨域数据文件。
所以这个时候我们需要
SQL> alter table TEST3 STORAGE( NEXT 100k PCTINCREASE 10 );
Table altered
SQL>
SQL>
SQL> declare
2 i number(10);
3 begin
4 for i in 1..100000
5 loop
6 insert into test3
7 values(i);
8 end loop;
9 end;
10 /
PL/SQL procedure successfully completed
此时就可以了成功,实际上这里最好别设置增长
所以最好如下
alter table TEST3 STORAGE( NEXT 160k PCTINCREASE 0 );
这个操作指示修改数据字典中的表的定义,对下次分配的EXTENT生效,及下次分配的EXTENT是160K,以后都是160k
相关的定义参考如下:
http://www.blogjava.net/hao446tian/archive/2011/10/28/362218.html