【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%。还有大量的释放余地,但暂时不让删。编写了脚本给客户。

然后登录系统,打开表单,保存一条数据,已恢复正常。

问题得到解决,希望对大家有所帮助! 

posted @ 2022-07-13 15:21  泠雨0702  阅读(1355)  评论(0编辑  收藏  举报