前言
今天某项目的一个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; - 扩展到最大30G文件无法继续扩展,可增加数据文件:
alter tablespace users add datafile 'users02.dbf' size 1024m autoextend on next 1024m maxsize 30G; - truncate删除无用表释放空间,假如未释放,对TEST表进行收缩shrink,执行下面三个语句:
讯享网-- 启用行迁移: alter table TEST enable row movement; -- shrink表test: alter TABLE TEST shrink SPACE; -- 关闭行迁移: alter table TEST DISABLE row movement;
Oracle “高水位”
数据被删除后(无论是 delete 还是 truncate table),数据文件大小不一定会缩小, 是Oracle"高水位"所致,想要降低数据文件大小需降低高水位的正确做法是先降低HWM,再确定实际占有大小,再resize数据文件,执行如下4个语句:
- 查询表空间文件编号:
select file#, name from v$datafile; - 根据文件 ID 查询这个数据文件最大数据块(data block)的编号:
select max(block_id) from dba_extents where file_id=4; - 计算该表空间实际占用的空间,先查询数据块大小,默认是8192:
select value from v$parameter where name='db_block_size' - 计算实际占用磁盘大小:
select 65673*8/1024 from dual; - 把数据文件大小resize到比实际占用磁盘大小大一些就行了,这样数据文件大小就变小了,节约空间 :
alter database datafile '/oracle/oradata/dba/users01.dbf' resize 600m; - 需要使用的表,修改表空间
alter table xxx move tablespace new_tablespace,建表时需养成习惯,指定好表空间.
更多详情可以参考 <<Oracle官方Changing Datafile Size>>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/36158.html