今天某项目的一个Repository的正常CRUD操作,发现报错信息ORA-1653:unable to extend table by 1024 in tablespace
,什么意思呢,就是表空间已满,无法扩展
.
USERS表空间是默认用户表空间,在创建一个用户并没有指定此用户使用表空间时,该用户所有信息都会放入到users表空间中,如果有指定则一般是用户名相关的表空.
--查看表空间文件
select file_name t from dba_data_files t where t.tablespace_name='xxxx';
--查看表记录大小
select t.tablespace_name,t.TABLE_NAME,t.NUM_ROWS from all_tables t where t.tablespace_name='xxxx' order by num_rows desc;
--查看表空间大小
select t.file_name,t.tablespace_name,t.bytes/1024/1024 "bytes MB",t.maxbytes/1024/1024 "maxbytes MB" from t.dba_data_files where tablespace_name='xxx';
查询使用xxx表空间的表,按行级降序排序,一般多个表使用相同表空间,存在大量数据导致USER表占满,像刚才查看的这个问题的表,超过一千万条记录.
alter database datafile '/oracle/oradata/dba/users01.dbf' resize 30G;
alter tablespace users add datafile 'users02.dbf' size 1024m autoextend on next 1024m maxsize 30G;
-- 启用行迁移:
alter table TEST enable row movement;
-- shrink表test:
alter TABLE TEST shrink SPACE;
-- 关闭行迁移:
alter table TEST DISABLE row movement;
数据被删除后(无论是 delete 还是 truncate table),数据文件大小不一定会缩小, 是Oracle"高水位"所致
,想要降低数据文件大小需降低高水位的正确做法是先降低HWM,再确定实际占有大小,再resize数据文件,执行如下4个语句:
select file#, name from v$datafile;
select max(block_id) from dba_extents where file_id=4;
select value from v$parameter where name='db_block_size'
select 65673*8/1024 from dual;
alter database datafile '/oracle/oradata/dba/users01.dbf' resize 600m;
alter table xxx move tablespace new_tablespace
,建表时需养成习惯,指定好表空间.更多详情可以参考 <
>