ORA-01653: 表xxx.xxx 无法通过 8 (在表空间xxx中)扩展 问题

背景

今天发现系统异常,无法新增数据了,检查了下系统日志,有如下报错:

1
ORA-01653: 表xxx.xxx 无法通过 8 (在表空间xxx中)扩展

直接登录数据库,手工插入一条数据,果然报错一样。

解决办法

既然有oracle问题编号,直接百度,解决过程如下:

  • 查看表空间使用情况:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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;

    查询结果如下:

    image-20190522182518734

    可是问题出现了,在log中报错的表空间并不存在,直接下一步。

  • 查询表空间是否可扩展

    1
    2
    3
    4
    5
    SELECT T.TABLESPACE_NAME,D.FILE_NAME,   
    D.AUTOEXTENSIBLE,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;

    查询结果如下:

    image-20190522182834814

    发现都是不可扩展的,MAXBYTES为0,问题应该就在这儿了。

  • 将表空间改为可扩展

    1
    2
    3
    ALTER DATABASE  
    DATAFILE 'xxxDAT1.DBF' AUTOEXTEND
    ON NEXT 100M MAXSIZE UNLIMITED

    改完之后再次查询是否可扩展(上一步),结果如下:

    image-20190522183127500

  • 再次尝试插入数据,已经成功了。

扩展

由于有oracle的问题号,所以问题定位比较明确。虽然在查询表空间大小的时候查询不到,但是如果我们直接搜索所有表空间:

1
SELECT T.TABLESPACE_NAME FROM DBA_TABLESPACES T

还是可以搜索到的,所以不必怀疑。

另外需要注意的是,在第三步,将表空间改为可扩展。是需要sys用户的,普通用户会提示权限不够。

1
ORA-01031: insufficient privileges