创建备份表的时候报空间不足
SQL> create table bak_ts_acc tablespace ts_backup as
2 select * from ts_acc ;
*
ERROR at line 1:
ORA-01652: unable to extend temp segment by 8192 in tablespace TS_BACKUP
一查表空间大小
SELECT a.tablespace_name,
a.bytes/1024/1024 total_m,
b.bytes/1024/1024 used_m,
c.bytes/1024/1024 free_m,
(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
and a.tablespace_name ='TS_BACKUP'
order by (c.bytes * 100) / a.bytes;
共 35个G,还剩余6个G。
查一下要备份的表的数据大小
SELECT OWNER,
A.SEGMENT_TYPE,
A.SEGMENT_NAME,
TRUNC(SUM(A.BYTES) / 1024 / 1024) "SIZE(M)"
FROM DBA_SEGMENTS A
WHERE SEGMENT_TYPE ='TS_ACC'
GROUP BY OWNER, A.SEGMENT_TYPE, A.SEGMENT_NAME
HAVING SUM(A.BYTES) / 1024 / 1024 > 1
ORDER BY 4 DESC, 1;
有22个G,表空间确实不够。
--查看表空间文件属性
select file_name,autoextensible,increment_by from dba_data_files where tablespace_name = 'TS_BACKUP';
发现表空间是自动扩展。 这么说来,理论上不会报空间满,不应该不够啊。
再百度,发现有人说可能是操作系统对单个文件大小有限制, oracle的自动扩展是对单个数据文件的自动扩展,最终大小受限于操作系统对单个文件大小的限制。
这么说就明白了,应该是要再增加一个数据文件。
alter tablespace TS_BACKUP add datafile '+DATA/gdcpa/datafile/ts_backup' size 20G;
扩完后,再执行备份语句,成功!
总结:oracle的表空间自动扩展是针对数据文件而言,而单个数据文件大小又不能超出操作系统对单个文件大小的限制。
可以采用一次多添加几个数据文件,每个数据文件都自动扩展来解决