在web项目往数据库表中新增数据时,插入失败,报错信息如下:Oracle解决ora-01653 无法通过1024扩展
首先看到这个问题,理解的是这个表数据量太大,存不下了,但是并不知道是在哪里存的,于是网上百度了一下:
一、查看表-->属性中所属的表空间,在system表中间中。
二、查看数据库有哪些表空间及使用情况:
方法1:
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;
方法2:
--获取数据文件dbf路径 select tablespace_name, file_id,file_name, round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name;
第一种解决方案:
可以看到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; --没试过,不知道效果
我用的第一种方案,第二种也试了一下可以。
解决后效果
我用的第一种解决方案,增加了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大小。
注意事项及所有用到的SQL
1、在上面的第一种解决方案里,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;
---查询数据文件以及数据文件大小 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字段大小:
--大SQL,表本身大小。 --比如,索引有3个,然后汇总100M,然后表本身20M,最后的总数就是120,索引100M select OWNER FD_OWNER,COLUMN_NAME FD_COLUMN_NAME,TABLE_NAME FD_TABLE_NAME, case segment_name||'-' when '-' then table_name else segment_name end as FD_SEGMENT_NAME , SEGMENT_TYPE FD_SEGMENT_TYPE,FD_BYTES,FD_MAX_SIZE, ROUND(FD_BYTES / 1024 / 1024) FD_MB, ROUND(sum(FD_BYTES) over(partition by segment_type) / 1024 / 1024) FD_SEGTYPE_TOTAL_MB, ROUND(sum(FD_BYTES) over(partition by table_name ) / 1024 / 1024) FD_TOTAL_MB from ( --第一部分,表本身大小 select b.owner, null column_name,b.segment_name as table_name,b.partition_name as segment_name, b.segment_type,sum(b.BYTES) FD_BYTES,sum(b.MAX_SIZE) FD_MAX_SIZE from dba_segments b where b.owner = 'COGLINK' group by b.owner, b.segment_name, partition_name, b.segment_type UNION ALL --第二部分,表的索引大小 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 from dba_indexes a, dba_segments b where a.OWNER = b.owner and a.OWNER = 'COGLINK' and a.index_name = b.segment_name group by a.owner, a.table_name, b.segment_name, b.segment_type UNION ALL --第三部分,如果表有LOB类型,LOB是单独存放的,包括数据和索引都分开 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 from dba_lobs a, dba_segments b where a.segment_name = b.segment_name and a.owner = 'COGLINK' UNION ALL 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 from dba_lobs a, dba_segments b where a.index_name = b.segment_name and a.owner = 'COGLINK' ) f order by segment_type, FD_BYTES desc
文本来源:https://www.bbsmax.com/A/obzb70RjJE/
用来记录和学习,如有侵权,请联系删除。
分类:
Oracle
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2021-06-10 ORA-28001: the password has expired(密码超时)解决方法