09-ORA-01653表空间不足

09-ORA-01653表空间不足
ORA-01653表空间不足——自动扩展满了怎么办操作员突然报数据库写不进去了。查日志——ORA-01653表空间满了。打开自动扩展也满了因为数据文件踢到了上限。这篇文章讲表空间扩容的三种方式和如何预防再次塞满。文章目录ORA-01653表空间不足——自动扩展满了怎么办一、ORA-01653 什么意思二、快速诊断三、三种扩容方式四、社保系统的扩容经历五、预防——表空间监控脚本六、其他可能满的表空间一、ORA-01653 什么意思ORA-01653: unable to extend table PAYMENT_HISTORY by 128 in tablespace TS_DATA表空间TS_DATA没有足够空间给PAYMENT_HISTORY表扩展128个块。可能的原因表空间数据文件满了且没有开自动扩展开了自动扩展但达到了MAXSIZE上限数据文件所在磁盘满了二、快速诊断-- 查哪些表空间快满了SELECTA.TABLESPACE_NAME,ROUND(A.BYTES/1024/1024,2)ASTOTAL_MB,ROUND(B.FREE/1024/1024,2)ASFREE_MB,ROUND((A.BYTES-B.FREE)/A.BYTES*100,2)ASUSED_PCTFROM(SELECTTABLESPACE_NAME,SUM(BYTES)ASBYTESFROMDBA_DATA_FILESGROUPBYTABLESPACE_NAME)A,(SELECTTABLESPACE_NAME,SUM(BYTES)ASFREEFROMDBA_FREE_SPACEGROUPBYTABLESPACE_NAME)BWHEREA.TABLESPACE_NAMEB.TABLESPACE_NAMEORDERBYUSED_PCTDESC;-- 查数据文件列表和自动扩展设置SELECTFILE_NAME,TABLESPACE_NAME,ROUND(BYTES/1024/1024,2)ASMB,ROUND(MAXBYTES/1024/1024,2)ASMAX_MB,AUTOEXTENSIBLEFROMDBA_DATA_FILESWHERETABLESPACE_NAMETS_DATA;-- 查磁盘剩余空间-- 在SQL*Plus里用 host 命令HOST df-h/u01/app/oracle/oradata/三、三种扩容方式方式一打开自动扩展ALTERDATABASEDATAFILE/u01/app/oracle/oradata/orcl/TS_DATA01.dbfAUTOEXTENDONNEXT512M MAXSIZE32G;NEXT 512M每次自动扩展512MB。MAXSIZE 32G单文件最大32GBLinux ext3/xfs无上限旧的ext3有2GB限制已过时。方式二增加数据文件ALTERTABLESPACETS_DATAADDDATAFILE/u01/app/oracle/oradata/orcl/TS_DATA02.dbfSIZE16G AUTOEXTENDONNEXT512M MAXSIZE32G;好处不修改现有文件新增一个16GB的数据文件分担IO。方式三扩容现有文件ALTERDATABASEDATAFILE/u01/app/oracle/oradata/orcl/TS_DATA01.dbfRESIZE32G;如果MAXSIZE设了上限先改上限再 RESIZEALTERDATABASEDATAFILE/u01/app/oracle/oradata/orcl/TS_DATA01.dbfAUTOEXTENDONMAXSIZE UNLIMITED;ALTERDATABASEDATAFILE/u01/app/oracle/oradata/orcl/TS_DATA01.dbfRESIZE32G;四、社保系统的扩容经历有一次PAYMENT_HISTORY的 insert 操作报 ORA-01653。查原因是表空间TS_DATA只有1个数据文件20GB开了AUTOEXTEND但MAXSIZE设了20GB年底集中补录缴费数据表空间涨到19.8GB自动扩展触碰到MAXSIZE上限不允许再扩修法新增一个数据文件分担压力ALTERTABLESPACETS_DATAADDDATAFILE/u01/app/oracle/oradata/orcl/TS_DATA02.dbfSIZE10G AUTOEXTENDONNEXT1G MAXSIZE32G;同时把老文件的 MAXSIZE 也放宽ALTERDATABASEDATAFILE/u01/app/oracle/oradata/orcl/TS_DATA01.dbfAUTOEXTENDONNEXT1G MAXSIZE32G;五、预防——表空间监控脚本-- 当使用率超过80%时告警CREATEORREPLACEPROCEDUREcheck_tablespaceASv_pct NUMBER;BEGINFORrecIN(SELECTTABLESPACE_NAME,ROUND((SUM(BYTES)-SUM(FREE))/SUM(BYTES)*100,2)ASUSED_PCTFROM(SELECTTABLESPACE_NAME,SUM(BYTES)ASBYTESFROMDBA_DATA_FILESGROUPBYTABLESPACE_NAME)A,(SELECTTABLESPACE_NAME,SUM(BYTES)ASFREEFROMDBA_FREE_SPACEGROUPBYTABLESPACE_NAME)BWHEREA.TABLESPACE_NAMEB.TABLESPACE_NAMEANDA.TABLESPACE_NAMENOTLIKE%UNDO%GROUPBYA.TABLESPACE_NAME)LOOPIFrec.USED_PCT80THENDBMS_OUTPUT.PUT_LINE(告警: ||rec.TABLESPACE_NAME|| 使用率 ||rec.USED_PCT||%);ENDIF;ENDLOOP;END;/放到定时任务里——每天凌晨跑一次。Oracle scheduler 版本BEGINDBMS_SCHEDULER.CREATE_JOB(job_nameCHECK_TBS_USAGE,job_typePLSQL_BLOCK,job_actionBEGIN check_tablespace; END;,start_dateSYSTIMESTAMP,repeat_intervalFREQDAILY; BYHOUR2,enabledTRUE);END;/六、其他可能满的表空间表空间满了导致预防SYSTEM / SYSAUX数据库无法启动、AWR收集失败监控审计表AUD$UNDOORA-01555或事务失败undo_retention 担保TEMPORA-01652排序失败大查询加/* PARALLEL */用更小的内存排序归档日志目录ORA-00257数据库挂起RMANDELETE ARCHIVELOG crontab脚本✅ 亮点从实际表空间满的故障排除出发给出扩容三种方式、监控脚本和容易忽略的其他表空间归档、UNDO、TEMP。扩展方向大表空间的数据文件移动offlinerename、ASM磁盘组扩容。