我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Oracle缩表空间问题如何解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Oracle缩表空间问题如何解决

这篇文章主要介绍“Oracle缩表空间问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Oracle缩表空间问题如何解决”文章能帮助大家解决问题。

    备注:

    Oracle 11.2.0.4

    一. 需求

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

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

    Oracle缩表空间问题如何解决

    二. 解决方案

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

    2.1 清理过期数据

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

    找到大表:

    select t.segment_name,t.BYTES/1024/1024/1024 GB,t.segment_typefrom user_segments twhere t.segment_type in ('TABLE','TABLE PARTITION')order by nvl(t.BYTES/1024/1024/1024,0) desc;

    Oracle缩表空间问题如何解决

    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 totalsizefrom dba_data_files a) a,(select b.tablespace_name,b.file_id,sum(b.bytes / 1024 / 1024) as freesizefrom dba_free_space bgroup by b.tablespace_name, b.file_id) bwhere a.file_id = b.file_idand b.freesize > 100and a.tablespace_name  in ('TBS_LOG_DATA')order by a.tablespace_name

    Oracle缩表空间问题如何解决

    将上一步的 alter datafile语句拷贝出来执行:

    有部分报错:

    ORA-03297: file contains used data beyond requested RESIZE value

    Oracle缩表空间问题如何解决

    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上有个博客:

    Truncate table 或者 drop table 收缩数据文件,经常遇到ORA-03297: file contains used data beyond requested RESIZE value 查询dba_free_space 也有空闲空间。经过查询MOS(Doc ID 1029252.6)得知

    If you have a large extent in the middle of a datafile, and some object taking up room at the end of the datafile, you can use the query FINDEXT.SQL below to find this object. If you export this object, then drop it, you should then free up contiguous space at the end of your datafile so you will be able to resize it smaller.

    Make sure you leave enough room in the datafile for importing the object back into the tablespace.

    意思是说如果空闲的extent如果在文件的中间,此时无法进行resize ,必须把尾部的object drop 然后重建 再resize datafile。以下是本人做的测试;

     [oracle@bogon ~]$ sqlplus / as sysdbaSQL*Plus: Release 10.2.0.1.0 - Production on Wed Jul 31 11:10:41 2013Copyright (c) 1982, 2005, Oracle.  All rights reserved.Connected to:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP and Data Mining optionsSQL> create tablespace test2 datafile '/u01/app/oracle/oradata/orcl/test2.dbf' size 10M autoextend on next 1M;Tablespace created.SQL> create table tab1 tablespace test2 as select * from dba_objects;Table created.SQL> select file#,name,bytes/1024/1024 bytes from v$datafile where name like '%test2%';FILE# NAME                                                         BYTES----- ------------------------------------------------------------ -----   23 /u01/app/oracle/oradata/orcl/test2.dbf                          11SQL> create table tab2 tablespace test2 as select * from dba_objects;Table created.SQL> select file#,name,bytes/1024/1024 bytes from v$datafile where name like '%test2%';FILE# NAME                                                         BYTES----- ------------------------------------------------------------ -----   23 /u01/app/oracle/oradata/orcl/test2.dbf                          21SQL> select SEGMENT_NAME,FILE_ID,EXTENT_ID,BLOCK_ID,blocks from dba_extents where file_id=23 order by BLOCK_ID;SEGMENT_NA    FILE_ID  EXTENT_ID   BLOCK_ID     BLOCKS---------- ---------- ---------- ---------- ----------TAB1               23          0          9          8TAB1               23          1         17          8TAB1               23          2         25          8TAB1               23          3         33          8TAB1               23          4         41          8TAB1               23          5         49          8TAB1               23          6         57          8TAB1               23          7         65          8TAB1               23          8         73          8TAB1               23          9         81          8TAB1               23         10         89          8SEGMENT_NA    FILE_ID  EXTENT_ID   BLOCK_ID     BLOCKS---------- ---------- ---------- ---------- ----------TAB1               23         11         97          8TAB1               23         12        105          8TAB1               23         13        113          8TAB1               23         14        121          8TAB1               23         15        129          8TAB1               23         16        137        128TAB1               23         17        265        128TAB1               23         18        393        128TAB1               23         19        521        128TAB1               23         20        649        128TAB1               23         21        777        128SEGMENT_NA    FILE_ID  EXTENT_ID   BLOCK_ID     BLOCKS---------- ---------- ---------- ---------- ----------TAB1               23         22        905        128TAB1               23         23       1033        128TAB1               23         24       1161        128TAB2               23          0       1289          8TAB2               23          1       1297          8TAB2               23          2       1305          8TAB2               23          3       1313          8TAB2               23          4       1321          8TAB2               23          5       1329          8TAB2               23          6       1337          8TAB2               23          7       1345          8SEGMENT_NA    FILE_ID  EXTENT_ID   BLOCK_ID     BLOCKS---------- ---------- ---------- ---------- ----------TAB2               23          8       1353          8TAB2               23          9       1361          8TAB2               23         10       1369          8TAB2               23         11       1377          8TAB2               23         12       1385          8TAB2               23         13       1393          8TAB2               23         14       1401          8TAB2               23         15       1409          8TAB2               23         16       1417        128TAB2               23         17       1545        128TAB2               23         18       1673        128SEGMENT_NA    FILE_ID  EXTENT_ID   BLOCK_ID     BLOCKS---------- ---------- ---------- ---------- ----------TAB2               23         19       1801        128TAB2               23         20       1929        128TAB2               23         21       2057        128TAB2               23         22       2185        128TAB2               23         23       2313        128TAB2               23         24       2441        128

    50 rows selected.

    Block_id 是连续的

    SQL> truncate table tab1  2  ;Table truncated.SQL> select * from dba_free_space where file_id=23;TABLESPACE_NAME         FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO-------------------- ---------- ---------- ---------- ---------- ------------TEST2                        23         17 ##########       1272           23TEST2                        23       2569 ##########        120           23

    有原来tab1 的free blocks 1272

    SQL> alter database datafile '/u01/app/oracle/oradata/orcl/test2.dbf' resize 12M;alter database datafile '/u01/app/oracle/oradata/orcl/test2.dbf' resize 12M*ERROR at line 1:ORA-03297: file contains used data beyond requested RESIZE value

    无法进行resize

    下面把tab1 drop 再测试

    SQL> drop table tab1 purge;Table dropped.SQL> alter database datafile '/u01/app/oracle/oradata/orcl/test2.dbf' resize 12M;alter database datafile '/u01/app/oracle/oradata/orcl/test2.dbf' resize 12M*ERROR at line 1:ORA-03297: file contains used data beyond requested RESIZE value

    依然报错

    然后truncate tab2 再进行测试

    SQL> truncate table tab2;Table truncated.SQL> select * from dba_free_space where file_id=23;TABLESPACE_NAME         FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO-------------------- ---------- ---------- ---------- ---------- ------------TEST2                        23          9 ##########       1280           23TEST2                        23       1297 ##########       1392           23SQL> alter database datafile '/u01/app/oracle/oradata/orcl/test2.dbf' resize 12M;Database altered.SQL> alter database datafile '/u01/app/oracle/oradata/orcl/test2.dbf' resize 6M;alter database datafile '/u01/app/oracle/oradata/orcl/test2.dbf' resize 6M*ERROR at line 1:ORA-03297: file contains used data beyond requested RESIZE value

    此时只能收缩 tab2 的空间 但是不能收缩 tab1的空间

    然后再drop tab2

    SQL> drop table tab2 purge  2  ;Table dropped.SQL> alter database datafile '/u01/app/oracle/oradata/orcl/test2.dbf' resize 6M;Database altered.SQL> alter database datafile '/u01/app/oracle/oradata/orcl/test2.dbf' resize 1M;Database altered.

    可以收缩tab1的空间

    note:

    收缩数据文件和两个因素有关

    1 降低高水位

    2 free extent在datafile 的尾部

    本篇文章直接解释了第二个

    如果空闲的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_%';

    再次运行压缩空间,成功

    Oracle缩表空间问题如何解决

    6 查看压缩的空间

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

    Oracle缩表空间问题如何解决

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

    关于“Oracle缩表空间问题如何解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Oracle缩表空间问题如何解决

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Oracle缩表空间问题如何解决

    这篇文章主要介绍“Oracle缩表空间问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Oracle缩表空间问题如何解决”文章能帮助大家解决问题。备注:Oracle 11.2.0.4一. 需
    2023-07-02

    Oracle缩表空间的完整解决实例

    目录备注:一. 需求二. 解决方案2.1 清理过期数据2.2 收缩表空间2.3 清理表碎片2.4 直接把相关的表drop掉2.5 把该表空间下其它的表移出此表空间总结备注:Oracle 11.2.0.4一. 需求近期有一个日志库,占用
    2022-07-05

    如何解决SYSAUX空间问题

    In this Document Purpose Troubleshooting Steps Basic Diagnostics Space Usage Purge Issues Maintenance and Setup Known Issue
    如何解决SYSAUX空间问题
    2021-08-19

    如何解决Oracle空表无法导出的问题

    解决Oracle空表无法导出的问题在使用Oracle数据库时,有时候会遇到空表无法导出的问题。这可能会给数据库管理员带来一些困扰,但是通过一些简单的方法和具体的代码示例,我们可以轻松解决这个问题。问题描述:Oracle中的expdp工
    如何解决Oracle空表无法导出的问题
    2024-03-08

    如何解决Oracle空表无法导出的问题

    解决Oracle空表无法导出的问题在使用Oracle数据库时,有时候会遇到空表无法导出的问题。这可能会给数据库管理员带来一些困扰,但是通过一些简单的方法和具体的代码示例,我们可以轻松解决这个问题。问题描述:Oracle中的expdp工
    如何解决Oracle空表无法导出的问题
    2024-03-08

    oracle数据库解决system表空间已爆满的问题

    有时会发现数据库system表空间增长很快,使用以下语句查看system表空间使用量。也可以使用toad直接看。select b.tablespace_name "表空间", b.bytes / 1024 / 1024 "大小M", (
    oracle数据库解决system表空间已爆满的问题
    2015-11-26

    oracle数据库表空间扩容的问题怎么解决

    本文小编为大家详细介绍“oracle数据库表空间扩容的问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“oracle数据库表空间扩容的问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.查看表
    2023-07-05

    Oracle临时表空间过大如何解决

    本篇内容主要讲解“Oracle临时表空间过大如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle临时表空间过大如何解决”吧!方案一:增加临时表空间的大小1.临时表空间的使用情况题S
    2023-06-27

    MYSQL清空表和截断表问题如何解决

    这篇文章主要介绍“MYSQL清空表和截断表问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MYSQL清空表和截断表问题如何解决”文章能帮助大家解决问题。MYSQL清空表和截断表清空表和截断
    2023-07-05

    oracle临时表空间不释放如何解决

    如果Oracle临时表空间不释放,可以尝试以下方法解决:1. 检查是否有长时间运行的事务或会话占用了临时表空间。可以使用以下查询语句来查找:```SELECT s.sid, s.serial#, p.spid, s.username, s.
    2023-09-15

    Oracle undo表空间异常增大如何解决

    当Oracle undo表空间异常增大时,可以尝试以下解决方法:查找导致undo表空间增大的原因:查询长时间运行的事务或操作是否导致undo段无法回收检查是否有大量的未提交事务占用undo表空间检查undo_retention参数是否设
    Oracle undo表空间异常增大如何解决
    2024-04-09

    oracle创建表空间权限不足如何解决

    要解决Oracle创建表空间权限不足的问题,可以尝试以下方法:1. 确认当前用户是否具有创建表空间的权限。使用管理员账户登录Oracle数据库,执行以下SQL语句查看用户权限:```sqlSELECT *FROM DBA_SYS_PRIVS
    2023-08-23

    oracle导入dmp表空间不存在如何解决

    如果在导入dmp文件时出现表空间不存在的错误,可以通过以下步骤解决问题:1. 确认导入dmp文件时使用的用户名和密码是否正确。使用正确的用户名和密码登录Oracle数据库。2. 查询导入文件中涉及的表空间信息,可以使用以下命令查询:```i
    2023-09-29

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录