一次因Oracle服务器磁盘空间紧张,通过收缩表空间释放空间延续业务的记录

  1. 问题:
    业务反应客户的系统无法使用,页面报错提示表空间无法扩展。
  2. 原因:
    登进系统查看alter日志,果然不停的提示表空间无法扩展,立刻扩展表空间:
-- 获取表空间数据文件的位置和名称
select file_name from dba_data_files where tablespace_name = 'XXX'
-- 进行扩充
alter tablespace "XXX" add datafile '/oradata/ORCL/XXX42.dbf' size 256M autoextend on next 128M maxsize 32767M;

扩充后观察磁盘空间仅剩几十MB!这才是根本原因!
3. 对策:
查找磁盘无用的日志、安装包等各种无用文件进行删除(可惜都没有,原运维已经清理的很干净了)
查看系统表空间,发现没有业务的USER表空间、TEMP表空间的空余度都很大,立刻进行表空间收缩,释放空间。
4. 操作:

-- 统计USER表空间有哪些表
select t.owner,t.table_name from dba_tables t where t.tablespace_name = 'USERS'
-- 表使能移动
alter table XXX.XXX enable row movement ; 
-- 表shrink
alter table XXX.XXX shrink space cascade; 
-- 重建索引
alter index XXX.XXX rebuild;
-- 查看USER表空间各数据文件可释放大小
select a.TABLESPACE_NAME, a.FILE_NAME,
       (a.BYTES / 1024 / 1024) as "FILE_SIZE(MB)",
       b.tb_size as "TABLESPACE_SIZE(MB)",
       ((a.BYTES / 1024 / 1024) - b.tb_size) as "RELEASE_SIZE"
  from dba_data_files a,
       (select TABLESPACE_NAME, file_id,
                round(max(BLOCK_ID) * 8 / 1024) tb_size
           from dba_extents
          group by TABLESPACE_NAME, file_id) b
 where a.TABLESPACE_NAME = b.TABLESPACE_NAME
   and a.file_id = b.file_id
   and a.TABLESPACE_NAME = 'USERS'
 order by a.FILE_ID;
 -- 释放空间
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/XXX.dbf' RESIZE TABLESPACE_SIZEXX;

整个过程并不是空间释放的最优操作(最大化释放空间,最好使用move操作)。
5. 思考:
1. 下医治已病,上医治未病……
2. 治病嫌贵,养生嫌烦……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值