oracle解决表空间不足问题

    技术2025-10-02  7

    ORA-00604: 递归sql级别1出现错误

    ORA-01654:索引SYS.I_COL1 无法通过 128 (在表空间SYSTEM中) 扩展

     

    这种情况是表空间不够需要查看表空间的容量,和表空间所对应的数据文件

    连上数据查看表空间情况:

    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;

     

    通过这条sql可以看出SYSTEM表空间已经使用了99.98,表空间不够了

    SYSTEM表空间不足 查看表空间文件名称和是否自动增长 SELECT FILE_NAME,TABLESPACE_NAME,AUTOEXTENSIBLE FROM dba_data_files;

     

    增加表空间大小 alter database datafile '/opt/app/oracle/oradata/oradb/system01.dbf' resize 64000m;

    同样也报错

     

    然后我选择在原路径上新建一个数据文件

    新增数据文件,并且允许数据文件自动增长 ALTER TABLESPACE app_data ADD DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP04.DBF' SIZE 50M AUTOEXTEND(自动扩展) ON NEXT 5M MAXSIZE 100M(unlimited无限制);

     

    之后发现还是报错,然后我就去看了lunix磁盘情况

    然后发现u01磁盘满了.最后数据文件在data目录下新建了一个,就解决了这个问题(希望对大家有帮助吧)

    注:

    表空间在初始建立的时候最好设置成自动扩展的,如果没有设置成zhi扩展的,则有四种方法可以增加表空间的大小,其中增加数据文件是经常用的一种。四种方法如下:

    ①:给表空间增加数据文件 ALTER TABLESPACE app_data ADD DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP03.DBF' SIZE 50M;

    ②:新增数据文件,并且允许数据文件自动增长 ALTER TABLESPACE app_data ADD DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP04.DBF' SIZE 50M AUTOEXTEND ON NEXT 5M MAXSIZE 100M;

    ③:允许已存在的数据文件自动增长 ALTER DATABASE DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP03.DBF' AUTOEXTEND ON NEXT 5M MAXSIZE 100M;

    ④:手工改变已存在数据文件的大小 ALTER DATABASE DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP02.DBF' RESIZE 100M;

    注:查询临时表空间:select name,status from v$tempfile;

    1 为空间不足的表空间增加数据文件 ALTER TABLESPACE &tablespace_name ADD DATAFILE '&datafile_name' SIZE 2G; 2 如果要为临时表空间扩容,使用下面的语句 ALTER TABLESPACE &tablespace_name ADD TEMPFILE '&datafile_name' SIZE 2G;

    上面那两个其实差不多都是增加数据文件

    --1.查看表空间使用率(包括临时表空间)

    select *   from (Select a.tablespace_name,                to_char(a.bytes / 1024 / 1024, '99,999.999') total_bytes,                to_char(b.bytes / 1024 / 1024, '99,999.999') free_bytes,                to_char(a.bytes / 1024 / 1024 - b.bytes / 1024 / 1024,                        '99,999.999') use_bytes,                to_char((1 - b.bytes / a.bytes) * 100, '99.99') || '%' use           from (select tablespace_name, sum(bytes) bytes                   from dba_data_files                  group by tablespace_name) a,                (select tablespace_name, sum(bytes) bytes                   from dba_free_space                  group by tablespace_name) b          where a.tablespace_name = b.tablespace_name         union all         select c.tablespace_name,                to_char(c.bytes / 1024 / 1024, '99,999.999') total_bytes,                to_char((c.bytes - d.bytes_used) / 1024 / 1024, '99,999.999') free_bytes,                to_char(d.bytes_used / 1024 / 1024, '99,999.999') use_bytes,                to_char(d.bytes_used * 100 / c.bytes, '99.99') || '%' use           from (select tablespace_name, sum(bytes) bytes                   from dba_temp_files                  group by tablespace_name) c,                (select tablespace_name, sum(bytes_cached) bytes_used                   from v$temp_extent_pool                  group by tablespace_name) d          where c.tablespace_name = d.tablespace_name)  order by tablespace_name

    --2.查看文件是否自动扩展 select d.file_name,d.tablespace_name,d.autoextensible from dba_data_files d --如果想查看临时表空间文件是否自动扩展 select d.file_name,d.tablespace_name,d.autoextensible from dba_temp_files d; --3.对临时文件进行扩展。 --1)TOSTEMP表空间使用率接近100%,对它进行扩展。 --SQL> alter database tempfile  'C:xxxxxx\TOSTEMP01.DBF'resize 500M; --2)若是发现 表空间使用率接近100%,且不可扩展修改文件自动可扩展性 --alter database datafile/tempfile 'E:xxxxxxESCALADE.ORA' autoextend on;

    --4.查看临时表空间使用率:

    select c.tablespace_name,

    to_char(c.bytes/1024/1024/1024,'99,999.999') total_gb,

    to_char( (c.bytes-d.bytes_used)/1024/1024/1024,'99,999.999') free_gb,

    to_char(d.bytes_used/1024/1024/1024,'99,999.999') use_gb,

    to_char(d.bytes_used*100/c.bytes,'99.99') || '%'use

    from  (select tablespace_name,sum(bytes) bytes

    from dba_temp_files GROUP by tablespace_name) c,

    (select tablespace_name,sum(bytes_cached) bytes_used

    from v$temp_extent_pool GROUP by tablespace_name) d

    where c.tablespace_name = d.tablespace_name;

    --5.查询那些用户在使用

    select a.username,

           a.sql_id,

           a.SEGTYPE,

           b.BYTES_USED/1024/1024/1024||‘G’,

           b.BYTES_FREE/1024/1024/1024  from   V$TEMPSEG_USAGE  a  join  V$TEMP_SPACE_HEADER b on   a.TABLESPACE=b.tablespace_name; 

            解释username  正在执行sql的用户名

                sql_id    正在执行的sql的的sql_id

                segtype   正在执行的SQL语句做的是什么操作

                BYTES_USED 正在执行sql语句使用的临时表空间的大小

                BYTES_FREE  剩余多少临时表空间

    Processed: 0.008, SQL: 9