美文网首页
Oracle 收缩表空间一例

Oracle 收缩表空间一例

作者: 只是甲 | 来源:发表于2022-04-25 16:03 被阅读0次

备注:
Oracle 11.2.0.4

一. 需求

近期有一个日志库,占用了比较多的空间,需要将历史的清理,然后收缩空间。

如下图所示,4T的空间已经差不多用完。


image.png

二. 解决方案

首先想到的是清理掉超过半年的数据,然后resize 表空间。

2.1 清理过期数据

因为业务的表是 tablename_yearmonth格式,例如 log_202204,每个月一个表,所以直接进行truncate即可。

找到大表:

select t.segment_name,t.BYTES/1024/1024/1024 GB,t.segment_type
from user_segments t
where t.segment_type in ('TABLE','TABLE PARTITION')
order by nvl(t.BYTES/1024/1024/1024,0) desc;
image.png

truncate 大表:

select  'truncate table '|| t.TABLE_NAME ||';'
  from user_tables t
 where t.TABLE_NAME  like 'LOG%';

2.2 收缩表空间

select a.tablespace_name,
a.file_name,
a.totalsize as totalsize_MB,
b.freesize as freesize_MB,
'ALTER DATABASE DATAFILE ''' || a.file_name || ''' RESIZE ' ||
round((a.totalsize - b.freesize) + 200) || 'M;' as "alter datafile"
from (select a.file_name,
a.file_id,
a.tablespace_name,
a.bytes / 1024 / 1024 as totalsize
from dba_data_files a) a,
(select b.tablespace_name,
b.file_id,
sum(b.bytes / 1024 / 1024) as freesize
from dba_free_space b
group by b.tablespace_name, b.file_id) b
where a.file_id = b.file_id
and b.freesize > 100
and a.tablespace_name  in ('TBS_LOG_DATA')
order by a.tablespace_name
image.png

将上一步的 alter datafile语句拷贝出来执行:
有部分报错:
ORA-03297: file contains used data beyond requested RESIZE value

image.png

2.3 清理表碎片

因为我使用的是truncate,理论上不会受高水位的影响,在网上找了几个博客,也是说要降低表的高水位,清理表碎片。

select 'alter table '||t.TABLE_NAME||' enable row movement;',
       'alter table '||t.TABLE_NAME||' shrink space cascade;'
  from user_tables t
 where t.TABLE_NAME like 'LOG%';

清理完碎片之后,重新执行,依旧报错。

2.4 直接把相关的表drop掉

select  'drop table '|| t.TABLE_NAME ||'purge;'
  from user_tables t
 where t.TABLE_NAME  like 'LOG%';

drop掉表之后,重新执行,依旧报错。

2.5 把该表空间下其它的表移出此表空间

万能的itpub上有个博客:
http://blog.itpub.net/15747463/viewspace-767555/

如果空闲的extent如果在文件的中间,此时无法进行resize ,必须把尾部的object drop 然后重建 再resize datafile。

也就是说同时期该用户下其它表的写入,也在这个数据文件下,那么就不能进行resize。

把其它表移动到users表空间:

select 'alter index '||index_NAME||' rebuild tablespace users;' from user_indexes where TABLE_NAME not like 'LOG_%';
select 'alter table '||TABLE_NAME||' move tablespace users;' from user_tables where TABLE_NAME not like 'LOG_%';

再次运行压缩空间,成功


image.png

2.6 查看压缩的空间

可以看到一下子多出了2.1T 的空间


image.png

收缩空间运行速度还不错,50多个数据文件,几分钟就压缩完成。

相关文章

  • Oracle 收缩表空间一例

    备注:Oracle 11.2.0.4 一. 需求 近期有一个日志库,占用了比较多的空间,需要将历史的清理,然后收...

  • oracle之创建用户、表空间,用户授权及指定表空间

    参考链接 Oracle建立表空间和用户oracle创建删除表空间、用户、数据导入导出等常用sql语句 oracle...

  • 北京纬创

    1、Oracle常见表空间及其作用 system表空间:含数据字典信息sysaux表空间:存储各种oracle应用...

  • Oracle基础总结

    Oracle开发基础重点 Oracle一般操作 表空间 用户 表 表数据 Oracle 查询操作 单表查询 多表查...

  • Oracle中查询tablespace下所有表名

    Oracle中查询表空间下所有表名 Oracle中查询表的comments Oracle中查询表中字段的comments

  • [轉]ORACLE 收缩表空间的数据文件

    方法一:在实际的应用中经常会遇到TRUNCATE或者DELETE表中的数据后发现表空间并没有将空间进行释放,磁盘空...

  • 2018-08-28-Oracle学习第二天

    1、创建表空间 --创建表空间 create tablespace cz datafile 'D:\Oracle...

  • Oracle表空间

    今天又是充满希望的一天 oracle学习 oracle中常用Scott用户中的几张表 emp 薪资表 dept ...

  • Oracle表空间

    数据库、数据库实例、表空间、用户 完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例。 数据...

  • Oracle 表空间

    1.登录用户scott用户默认是锁定的 ,所以下面这条语句来启用alter user username(这里启用的...

网友评论

      本文标题:Oracle 收缩表空间一例

      本文链接:https://www.haomeiwen.com/subject/itefyrtx.html