Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 526|回复: 0

oracle数据库报错ora-01653表空间扩展失败解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-9-4 11:01:01 | 显示全部楼层 |阅读模式

    1)ora-01653错误截图:

     可以看到有两张表的insert受到了影响,都是在USERS表空间里。用以下SQL查看表空间使用情况:

    SELECT a.tablespace_name "表空间名",a.bytes / 1024 / 1024 "表空间大小(M)",(a.bytes - b.bytes) / 1024 / 1024 "已使用空间(M)",
    b.bytes / 1024 / 1024 "空闲空间(M)",round(((a.bytes - b.bytes) / a.bytes) * 100, 2) "使用比"
    FROM (SELECT tablespace_name, sum(bytes) bytes
    FROM dba_data_files GROUP BY tablespace_name) a,
    (  SELECT tablespace_name, sum(bytes) bytes, max(bytes) largest
       FROM dba_free_space
       GROUP BY tablespace_name  
    ) b
    WHERE a.tablespace_name = b.tablespace_name
    ORDER BY ((a.bytes - b.bytes) / a.bytes) DESC;

    可以看到USERS表空间已经使用了99.99%!马上就100%,再也没有地方存储数据了!正式环境啊!情况危急!

     2)解决办法

    --获取数据文件dbf路径
    select tablespace_name, file_id,file_name, round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name;

    以下两种方案都需要获取/home目录下实际物理大小,我登录到linux数据库服务器后,使用du -sh命令查看了/home目录大小为250GB。

    第一种解决方案:

    可以看到USERS表空间总共有3个dbf(此时我已经增加了04.dbf),复制其中一个dbf路径 /home/oracle/oradata/users01.dbf,覆盖下面的datafile参数:

    --新增加一个dbf文件,指定该dbf文件大小为32GB左右,并使其每次自动扩展1GB,并且没有最大限制
    alter tablespace users add datafile '/home/oracle/oradata/users04.dbf' size 32760m autoextend on next 1024m maxsize unlimited; 
    --segment space management auto extent management local; 据说可以连接上一句一起执行(把上一句分号去掉即可),没执行,不知道执行效果,谨慎期间,慎用。

    第二种解决方案:

    --把原有的dbf数据文件大小调整(扩大)
    alter database  datafile '/home/oracle/oradata/users01.dbf' resize  61440M; --没试过,不知道效果

    我用的是第一种解决方案,第二种没试过,不知道效果如何。

    3)解决后效果

    我用的第一种解决方案,增加了04.dbf,再次使用SQL查看表空间使用情况:

    SELECT a.tablespace_name "表空间名",a.bytes / 1024 / 1024 "表空间大小(M)",(a.bytes - b.bytes) / 1024 / 1024 "已使用空间(M)",
    b.bytes / 1024 / 1024 "空闲空间(M)",round(((a.bytes - b.bytes) / a.bytes) * 100, 2) "使用比"
    FROM (SELECT tablespace_name, sum(bytes) bytes
    FROM dba_data_files GROUP BY tablespace_name) a,
    (  SELECT tablespace_name, sum(bytes) bytes, max(bytes) largest
       FROM dba_free_space
       GROUP BY tablespace_name  
    ) b
    WHERE a.tablespace_name = b.tablespace_name
    ORDER BY ((a.bytes - b.bytes) / a.bytes) DESC;

    使用比已经从99.99%降低到69.42%,说明效果明显,方案可用。

    再去查看/home,使用du -sh命令查看了/home目录大小为282GB。原来增加一个dbf文件会使得/home目录实际也增加32GB大小。

    4)注意事项及所有用到的SQL

    在上面的第一种解决方案里,32760m 约等于 32GB,根据最大块来算的,块计算SQL:
    SELECT UPPER(F.TABLESPACE_NAME) "表空间名",D.TOT_GROOTTE_MB "表空间大小(M)",D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
      TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比",
      F.TOTAL_BYTES "空闲空间(M)",F.MAX_BYTES "最大块(M)" 
      FROM (SELECT TABLESPACE_NAME,
      ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
      ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
      FROM SYS.DBA_FREE_SPACE
      GROUP BY TABLESPACE_NAME) F,
      (SELECT DD.TABLESPACE_NAME,
       ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
      FROM SYS.DBA_DATA_FILES DD
      GROUP BY DD.TABLESPACE_NAME) D
      WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
      ORDER BY 1;

    其它SQL语句完整贴上来如下:

    ---查询数据文件以及数据文件大小
    select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name;
    select username, default_tablespace, temporary_tablespace from dba_users;
    --获取数据文件路径
    select tablespace_name, file_id,file_name, round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name;
    --让数据文件自动扩展
    alter tablespace users add datafile '/home/oracle/oradata/users04.dbf' size 32760m autoextend on next 1024m maxsize unlimited; 
    --segment space management auto extent management local; 据说可以连接上一句一起执行(把上一句分号去掉即可),没执行,不知道执行效果,谨慎期间,慎用。
    --把数据文件大小调整
    alter database  datafile '/home/oracle/oradata/users01.dbf'  resize  61440M; --没试过,不知道效果

    大SQL, 表本身大小,表的索引大小,表的LOB字段大小:

     1 --大SQL,表本身大小。
     2 --比如,索引有3个,然后汇总100M,然后表本身20M,最后的总数就是120,索引100M
     3 select OWNER FD_OWNER,COLUMN_NAME FD_COLUMN_NAME,TABLE_NAME FD_TABLE_NAME,
     4 case segment_name||'-' when '-' then table_name else segment_name end as FD_SEGMENT_NAME , 
     5 SEGMENT_TYPE FD_SEGMENT_TYPE,FD_BYTES,FD_MAX_SIZE,
     6 ROUND(FD_BYTES / 1024 / 1024) FD_MB,
     7 ROUND(sum(FD_BYTES) over(partition by segment_type) / 1024 / 1024) FD_SEGTYPE_TOTAL_MB,
     8 ROUND(sum(FD_BYTES) over(partition by table_name ) / 1024 / 1024)  FD_TOTAL_MB  
     9 from ( 
    10 --第一部分,表本身大小
    11     select b.owner, null column_name,b.segment_name as table_name,b.partition_name as segment_name, 
    12     b.segment_type,sum(b.BYTES) FD_BYTES,sum(b.MAX_SIZE) FD_MAX_SIZE
    13     from dba_segments b  
    14     where b.owner = 'COGLINK' 
    15     group by b.owner, b.segment_name, partition_name, b.segment_type  
    16 UNION ALL 
    17 --第二部分,表的索引大小    
    18     select a.owner, null column_name,a.table_name, b.segment_name,b.segment_type,sum(b.BYTES) FD_BYTES,sum(b.MAX_SIZE) FD_MAX_SIZE
    19     from dba_indexes a, dba_segments b 
    20     where a.OWNER = b.owner and a.OWNER = 'COGLINK' 
    21     and a.index_name = b.segment_name group by a.owner, a.table_name, b.segment_name, b.segment_type 
    22 UNION ALL 
    23 --第三部分,如果表有LOB类型,LOB是单独存放的,包括数据和索引都分开        
    24     select a.owner,a.column_name,a.table_name,b.segment_name,b.segment_type,b.BYTES FD_BYTES,b.MAX_SIZE FD_MAX_SIZE 
    25     from dba_lobs a, dba_segments b 
    26     where a.segment_name = b.segment_name 
    27     and a.owner = 'COGLINK' 
    28 UNION ALL 
    29     select a.owner,a.column_name,a.table_name,b.segment_name,b.segment_type,b.BYTES FD_BYTES,b.MAX_SIZE FD_MAX_SIZE
    30     from dba_lobs a, dba_segments b 
    31     where a.index_name = b.segment_name 
    32     and a.owner = 'COGLINK'  
    33 ) f order by segment_type, FD_BYTES desc
    34  

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-1 08:03 , Processed in 0.062118 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表