ORA-01659 无法分配超出5(XXX)的MINEXTENTS
oracle在迁移大量数据的时候,如果是老项目或者DB管理者的疏忽,会把数据库的表空间设定成小表空间结构;
这就很蛋疼了,导入数据导了一上午,如果爆出ORA-01659,就意味一上午的劳动付之流水,所以以后再迁移数据时,记得查看表空间的数据:
#查看表空间的使用情况
SELECT SUM(bytes) / (1024 * 1024) AS free_space, tablespace_name
FROM dba_free_space
GROUP BY tablespace_name;
SELECT a.tablespace_name,
a.bytes total,
b.bytes used,
c.bytes free,
(b.bytes * 100) / a.bytes "% USED ",
(c.bytes * 100) / a.bytes "% FREE "
FROM sys.sm$ts_avail a, sys.sm$ts_used b, sys.sm$ts_free c
WHERE a.tablespace_name = b.tablespace_name
AND a.tablespace_name = c.tablespace_name;
如果大小不够,先估算一下,扩容再导入;
扩容这里也有一些坑点,我百度查到的扩容方法大抵有俩种,对
表空间进行扩容操作,或者直接对表空间的DBF文件进行操作:
#对表空间扩容,直接不限大小,最大大小不限,步进100m
alter tablespace XXX(表空间id) autoextend on next 100m maxsize unlimited;
#对表空间扩容,最大大小为xxm
alter tablespace xxx(表空间id) autoextend on maxsize xxm;
#对dbf文件进行操作,扩展dbf文件的最大大小为不限大小,步进100m
alter database datafile '表文件dbf文件路径' autoextend on next 100m maxsize unlimited
#对dbf文件进行操作,修改dbf文件大小为xxm
alter database datafile 'dbf文件路径' resize xxm;
但是直接操作dbf文件对小表空间来说,是无效的,至少在11.2上;sqlplus工具会提示表空间已修改,但是实际上你再尝试迁移数据,会发现依旧不会扩容!
因此,最好直接操作表空间,而不是dbf文件,如果直接操作表空间,在尝试修改表空间大小的时候便会提示此表空间为小表空间,操作失效;
我个人尝试过几次,最好给表空间添加新的dbf文件,最保险
#添加新的dbf文件以保存数据
alter tablespace add datafile='新的dbf文件路径' size 10m autoextend on next 100m maxsize 500m;