问题现象:
最近不知道为什么,一个测试系统的oracle 11g r2 表空间总是使用的很快,不到一个月就把增加的32G用完了。目前已经增加到160G,这么一味的增加表空间不是办法,于是决定清理一下。也看看具体是哪个表引起的从而更方便的定位问题。
解决办法:
1.清理释放当前的表空间。
--查询表空间使用情况 select a.a1 表空间名称, c.c2 类型, c.c3 区管理, b.b2/1024/1024/1024 表空间大小G, (b.b2-a.a2)/1024/1024/1024 已使用G, substr((b.b2-a.a2)/b.b2*100,1,5) 利用率 from (select tablespace_name a1, sum(nvl(bytes,0)) a2 from dba_free_space group by tablespace_name) a, (select tablespace_name b1,sum(bytes) b2 from dba_data_files group by tablespace_name) b, (select tablespace_name c1,contents c2,extent_management c3 from dba_tablespaces) c where a.a1=b.b1 and c.c1=b.b1; --查看表空间数据文件位置 select b.file_name 物理文件名, b.tablespace_name 表空间, b.bytes/1024/1024/1024 大小G, (b.bytes-sum(nvl(a.bytes,0)))/1024/1024 已使用M, substr((b.bytes-sum(nvl(a.bytes,0)))/(b.bytes)*100,1,5) 利用率 from dba_free_space a,dba_data_files b where a.file_id=b.file_id group by b.tablespace_name,b.file_name,b.bytes order by b.tablespace_name; --查询lob(大对象) SELECT owner 所属用户, segment_name 对象名字, segment_type 对象类型, ( bytes / 1024 / 1024 / 1024) 大小GB FROM dba_segments ORDER BY bytes DESC; --根据lob名字查询对应的表 SELECT owner 用户, table_name 表名字, column_name 列名, segment_name 对象名字 FROM dba_lobs WHERE segment_name = 'SYS_LOB0000152046C00007$$(对象名字)'; --先备份 --先备份 --先备份 --重要的话说三遍 --删除并重建这个张表表空间就释放了(记得备份) --DROP TABLE 表名
2.增加表空间数据文件。
参考:表空间创建及增加
扩展:
--查看某个表大小 SELECT round( sum( BYTES ) / 1024 / 1024, 2 ) 数据大小mb FROM dba_segments WHERE segment_name = '表名'; --查看某个用户下所有表的大小 SELECT owner, segment_name, round( sum( bytes / 1024 / 1024 ), 2 ) mb_size FROM dba_segments WHERE owner = '用户名' AND segment_type = 'TABLE' -- 如果是分区表, 则 segment_type = 'TABLE PARTITION' GROUP BY owner, segment_name ORDER BY 3 DESC;