【Oracle错误处理】java操作Oracle数据库写数据时提示内部错误(500),ORA-01654:索引xxxx无法通过1024(在表空间xxx_data中)扩展
问题描述:
线上环境,客户反应,所有模块保存表单时提示内部错误(500),ORA-01654:索引xxxx无法通过1024(在表空间xxx_data中)扩展,具体如下图
错误基本一样,只是不同的模块索引字段不一样。
原因分析:
1 分析个锤子,绝对是Oracle的问题,正式环境数据库大半年都没动过了
问题排查:
1 步骤一.查看当前实例ORCL的存储文件块大小 2 步骤二.使用sql查看表空间占用情况 3 步骤三.查找数据库中数据量比较大的表,如日志表之类的
排查步骤一
进入线上服务器oracle安装目录,找到当前实例的存储文件,目录为D:\app\Administrator\oradata\orcl,查看文件大小,永久表空间存储文件xxx_DATA.ORA与临时表空间都为31G多,猜测为存储已到达上限
排查步骤二
打开PLSQL执行查询命令,查看表空间占用(命令来源:https://www.likecs.com/show-204187860.html)
1 SELECT Upper(F.TABLESPACE_NAME) "表空间名", 2 D.TOT_GROOTTE_MB "表空间大小(M)", 3 D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)", 4 To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99') 5 || '%' "使用比", 6 F.TOTAL_BYTES "空闲空间(M)", 7 F.MAX_BYTES "最大块(M)" 8 FROM (SELECT TABLESPACE_NAME, 9 Round(Sum(BYTES) / ( 1024 * 1024 ), 2) TOTAL_BYTES, 10 Round(Max(BYTES) / ( 1024 * 1024 ), 2) MAX_BYTES 11 FROM SYS.DBA_FREE_SPACE 12 GROUP BY TABLESPACE_NAME) F, 13 (SELECT DD.TABLESPACE_NAME, 14 Round(Sum(DD.BYTES) / ( 1024 * 1024 ), 2) TOT_GROOTTE_MB 15 FROM SYS.DBA_DATA_FILES DD 16 GROUP BY DD.TABLESPACE_NAME) D 17 WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME 18 ORDER BY 1
执行结果如下(本地环境),线上服务器永久表空间占用已超过99%,存储块满了
查询资料,得知Oracle的表空间文件大小是有限制的,当前环境的上限为32G(能否继续扩展未尝试,因为当前环境数据库本身设置的为自动扩展,看来不行了)
1 Oracle表空间数据文件大小的限制 2 由于Oracle的Rowid使用22位来代表数据块号,因此Oracle表空间数据文件每个数据文件最多只能包含2^22个数据块。 3 也因此数据库表空间的数据文件不是无限增长的,例如: 4 在数据块为8k的情况下,单个数据文件的最大容量为8K*2^22 = 32G 5 同理, 6 数据块为2K,数据文件最大约8G 7 数据块为32,数据文件最大约16*8G 8 故若达到这个最大容量之后,则即便是设置了自增长,也不是无限自增长,此时则需要为这个表空间添加数据文件
排查步骤三
寻找当前数据库中数据量大的表
select count(0) from 表名;
查看结果,其中两张日志表为70w条左右,一张5w条,一张1700w条,一张日志备份表750w条,查了下几张重要的业务表数据均不到2w条,
尴尬,感情31G表空间全部存了日志
于是找客户负责人协商,同意删除750w条的日志备份表,其他暂时不动。
问题到此已确认。
问题处理
一.导出日志表到本地
使用导出命令,将日志导出为dmp文件,采用数据泵方式导出
expdp 用户名/密码@orcl dumpfile=log_20220713.dmp directory=DATA_PUMP tables = 日志表1,日志表2 logfile=export_log_20220713.log
到oracle安装目录D:\app\Administrator\admin\orcl\dpdump下,找到导出的文件,复制到特定备份目录
二.清理日志表
1 方式1:delete from 表名;//执行完需手动提交事务 2 方式2:truncate table 表名;
执行完truncate table 日志备份表后,释放大概5.5G的空间,再次执行查看表空间占用情况sql,占用情况为76%。还有大量的释放余地,但暂时不让删。编写了脚本给客户。
然后登录系统,打开表单,保存一条数据,已恢复正常。
问题得到解决,希望对大家有所帮助!
本文来自博客园,作者:泠雨0702,转载请注明原文链接:https://www.cnblogs.com/lingyu0702/p/16474001.html