- 问题:
业务反应客户的系统无法使用,页面报错提示表空间无法扩展。 - 原因:
登进系统查看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. 治病嫌贵,养生嫌烦……