表空间不足的解决方法(<ORA-01653:表 XXX 无法通过128(在表空间TS_ODS中)扩展>)
一、出现原因:表空间不够
1、查看有哪些表空间及特定表空间所包含的表
SELECT * FROM DBA_TABLESPACES; --查看有哪些表空间
SELECT * FROM DBA_TABLES WHERE TABLESPACE_NAME='CHENMU'; --查看CHENMU表空间有哪些表
SELECT USERNAME,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE FROM DBA_USERS; --查看用户所属的默认表空间、临时表空间
基本的表空间有SYSTEM、SYSAUX(辅助表空间)、USERS、UNDOTBS1(回滚表空间)、TEMP(临时表空间,保存数据库排序,分组时产生的临时数据)
2、查看数据文件以及所属表空间的相关信息
SELECT * FROM DBA_DATA_FILES; --查看数据文件信息 SELECT * FROM DBA_TEMP_FILES; --查看临时数据文件信息
SELECT * FROM DBA_FREE_SPACE; --查看表空间剩余空间,每段剩余空间都会有一条记录,如果一个表空间记录过多说明碎片过多
--DBA_DATA_FILES
FILE_NAME 数据文件的名称,物理文件存放地址
TABLESPACE_NAME 数据文件所属的表空间
BYTES 文件的字节大小
BLOCKS 文件的块大小
STATUS 文件的状态,有效或无效
AUTOEXTENSIBLE 是否自动扩展
MAXBYTES 最大自动扩展字节数
MAXBLOCKS 最大自动扩展块数
INCREMENT_BY 默认自动增量
USER_BYTES 有用的字节大小
USER_BLOCKS 有用的块大小
3、查询表空间使用情况
select b.tablespace_name --表空间名 ,b.m_bytes --表空间大小 ,b.m_bytes-nvl(a.mbytes_free,0) used --已使用空间 ,nvl(a.mbytes_free,0) free --剩余空间 ,round(((b.m_bytes-nvl(a.mbytes_free,0))/b.m_bytes),2)*100||'%' pct_used --使用率 from (select sum(bytes)/(1024*1024) mbytes_free,max(bytes)/(1024*1024) largest,tablespace_name from sys.dba_free_space group by tablespace_name)a, (select sum(bytes)/(1024*1024) m_bytes,sum(maxbytes)/(1024*1024) mbytes_max,tablespace_name from sys.dba_data_files group by tablespace_name union all select sum(bytes)/(1024*1024) m_bytes,sum(maxbytes)/(1024*1024) mbytes_max,tablespace_name from sys.dba_temp_files group by tablespace_name)b where a.tablespace_name (+)= b.tablespace_name order by a.tablespace_name asc
二、解决方法:增加表空间或收缩对象
1、给表空间增加数据文件并自动增长
ALTER TABLESPACE TEST ADD DATAFILE '/u01/app/oracle/oradata/CHENMU/TEST02.DBF' SIZE 50M AUTOEXTEND ON;
2、允许已存在的数据文件自动增长
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/CHENMU/TEST.DBF' AUTOEXTEND ON;
3、修改数据文件大小
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/CHENMU/TEST.dbf' RESIZE 200M;
4、收缩对象
段的收缩:高位线下移,返回空间给表空间(压缩没有返回),将数据迁移到段后面空闲的地方,所以需要行迁移。提高性能和空间使用率,保留索引,无触发器触发。
select table_name,row_movement from user_tables; //检查行迁移功能是否开启 alter table employees enable row movement; //打开行迁移
alter table employees shrink space compact; //将比较空的数据放在同一块,但是水位线不变 alter table employees shrink space; //将比较空的数据放在同一块,但是水位线改变
表的压缩(表超过255列不建议使用):basic compression,基本压缩,将行里面的空格去掉,适用于Direct-Path insert(绕过数据缓存,通过组织块直接存),压缩10倍左右,用在DSS;advanced row compression常用在DML,压缩在2-4倍,用在OLTP、DSS,不是插入一行就压缩一行,而是数据快到pctfree临界点时触发压缩机制。HWM(High water mark)标记历史用过了多少块,不一定有数据,但是每次扫描表的时候都是从高水位线开始往下扫描。Direct-Path insert每次插入数据不查找高水位线下面空闲的块,而是直接从高水位线上面插入。
三、创建表空间
CREATE TABLESPACE TEST DATAFILE '/u01/app/oracle/oradata/TEST.DBF' SIZE 100M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ONLINE;
四、表空间其他操作
1、迁移数据文件
ALTER DATABASE MOVE DATAFILE '/u01/app/oracle/oradata/TEST.DBF' TO '/u01/app/oracle/oradata/CHENMU/test.dbf'; //把没在CHENMU里的数据文件迁移到该文件夹下,在12c以前迁移数据文件要先offline,12c以后可以move
2、重命名表空间
ALTER TABLESPACE hr_temp RENAME TO test_temp;
3、删除表空间
drop tablespace test; //这样删除表空间,数据文件还是存在,如果以后创建同名的表空间,该数据文件自动归类到该表空间里 drop tablespace test including contents; //删除表空间和表空间里的对象,经过创建默认表空间和临时表空间并指定给用户test,在里面创建一个表后执行该语句,test用户还存在也还可以连接,但是创建的表不存在了,也不能创建表了 drop tablespace test including contents and datafiles; //删除表空间、对象以及数据文件