关于oracle 表空间满32G了怎么处理的问题

最近客户反馈线上服务报错,无法使用,查看日志内容:

Caused by: org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [insert into equip_temp_data (col_code, col_date, col_type, col_value, em_code, gid) values (?, ?, ?, ?, ?, ?)/** NST **/]; SQL state [72000]; error code [1653]; Could not execute JDBC batch update; nested exception is org.hibernate.QueryTimeoutException: Could not execute JDBC batch update
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:651)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:105)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:523)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:475)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:270)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
    at com.epichust.service.erp.ErpService$$EnhancerByCGLIB$$cad9d843.dealWithEquipTempData(<generated>)
    ... 7 more
Caused by: org.hibernate.QueryTimeoutException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:124)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1222)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:389)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:519)
    ... 17 more
Caused by: java.sql.BatchUpdateException: ORA-01653: 表 UNIMAX_JSDJ_CS.EQUIP_TEMP_DATA 无法通过 1024 (在表空间 MESTAR_DATA 中) 扩展

    at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10345)
    at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:230)
    at com.alibaba.druid.filter.FilterChainImpl.statement_executeBatch(FilterChainImpl.java:2596)
    at com.alibaba.druid.filter.FilterAdapter.statement_executeBatch(FilterAdapter.java:2474)
    at com.alibaba.druid.filter.FilterEventAdapter.statement_executeBatch(FilterEventAdapter.java:279)
    at com.alibaba.druid.filter.FilterChainImpl.statement_executeBatch(FilterChainImpl.java:2594)
    at com.alibaba.druid.proxy.jdbc.StatementProxyImpl.executeBatch(StatementProxyImpl.java:192)
    at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeBatch(DruidPooledPreparedStatement.java:559)
    at net.sf.log4jdbc.StatementSpy.executeBatch(StatementSpy.java:523)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
    ... 26 more

查看Oracle错误代码,是因为Oracle表空间不足导致的,用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
    4 DESC;

发现表空间使用率100%,只剩下1.25M空间可用了,难怪,但是我设置了表空间自动扩容啊,查看表空间是否自动扩容:

SELECT
    t.tablespace_name,
    d.file_name,
    d.autoextensible,
    d.increment_by,
    d.bytes,
    d.maxbytes,
    d.status 
FROM
    dba_tablespaces t,
    dba_data_files d 
WHERE
    t.tablespace_name = d.tablespace_name 
ORDER BY
    tablespace_name,
    file_name;

表空间确实是自动扩容的,但是到了32G就不扩容了,后来百度知道Oracle单个表空间文件最大就到32G,那到了32G就不能再扩容了吗?有方法,再追加表空间文件就可以:

ALTER TABLESPACE TABLESPACE_NAME ADD DATAFILE 'E:\ORACLE_DB\TABLESPACE_EX1.DBF' SIZE 1000M AUTOEXTEND ON NEXT 500M;

其实扩展表空间大小有两种方式:1.追加表空间文件; 2.创建 bigfile 大表空间文件;第二种方式会操作原来的表空间数据,对于线上环境来说,能不改动是最好的,所以我选择了第一种方式,追加表空间文件。

推荐阅读:关于oracle 表空间满32G了怎么处理的问题

posted @ 2022-04-27 21:40  尘世间迷茫的小书童  阅读(1260)  评论(0编辑  收藏  举报