文档 · 2021年3月15日 0

Oracle清理表空间

问题现象:
最近不知道为什么,一个测试系统的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;
打赏