在Oracle下在创建表空间时一般没有特殊的需求时都是使用可自动扩展的表空间以便于日常的管理,这样在日常情况下就不用监控表空间大小,在没有使用自动增长的表空间建议在80%左右的时候就要增加新的物理文件已保障其稳定,而在Oracle中使用自动增长的表空间,在使用中其物理文件会随着表空间的增加而增加而在实际情况中可能会因为业务的改变而没有使用那么多的表空间,这时我们就可以通过Oracle下的表空间缩减回收来回收未使用的表空间物理文件所使用的磁盘资源,在Oracle下回收表空间很简单,在Oracle的系统下除了用户自行定义的表空间还有如下几个默认表空间:
表空间说明EXAMPLE 如果在安装时有选择“实例方案”选项,则在Oracle中会有该表空间,如未选择则没有,此表空间中存放的是各样例的数据
SYSAUX SYSTEM表空间的辅助空间。主要用于存储数据字典的其他数据对象,这可以减少SYSTEM表空间的负荷
SYSTEM 存放数据字典,其中包括表、视图、存储过程等等相关数据
TEMP 存放SQL语句处理的表和索引的信息,如:在数据排序时就会占用此表空间
UNDOTBS1 存放撤销数据的表空间
USERS 一般用于存放Oracle的用户数据
而默认的表空间的相关详细信息可以通过sys用户下的DBA_DATA_FILES、DBA_FREE_SPACE、DBA_SEGMENTS这3张字典表查到相关表空间所存放的数据对象、类型及表空间的相关物理文件和拥有者的相关记录,如下用于查询Oracle下表空间的使用详细情况
SELECT
F.TABLESPACE_NAME "表空间名",
D.TOT_GROOTTE_MB "表空间大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比",
F.TOTAL_BYTES "空闲空间(M)",
F.MAX_BYTES "最大块(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
AND F.TABLESPACE_NAME <> 'EXAMPLE'
AND F.TABLESPACE_NAME <> 'SYSAUX'
AND F.TABLESPACE_NAME <> 'SYSTEM'
AND F.TABLESPACE_NAME <> 'UNDOTBS1'
AND F.TABLESPACE_NAME <> 'USERS'
AND F.TABLESPACE_NAME <> 'EXAMPLE'
ORDER BY 1;
而在使用表空间收缩也很简单:
SELECT FILE_NAME FROM SYS.DBA_DATA_FILES WHERE TABLESPACE_NAME = 'TEST';#查询出TEST表空间的物理文件路径
ALTER TABLESPACE TEST COALESCE;#回收表空间碎片
ALTER DATABASE DATAFILE '/usr/local/u01/oracle/oradata/oracle/test.dbf' RESIZE 2M;#回收表空间