今天发现服务器空间满了,系统上该清的东西都清完了,但是可以用空间
还是只有20G,800多G的服务器,装了一些产品信息应该不至于那么多,后
来仔细看了下数据库里面的数据,把大表抓出来分析,发现有一个表大小就是
90G,上面还有好几个索引,和开发确认了下,他们说那个表的数据可以删除,
truncate表以后,resize表空间,不能回收报错
Error: ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据
后来仔细研究了下
找到文件对应的文件号
select file#,name from v$datafile
看下找到文件中最大的块号
select max(block_id) from dba_extents where file_id=5;
--查看数据库块大小
SQL>show parameter db_block_size
db_block_size integer 8192
QL> select max(block_id) from dba_extents where file_id=30;
MAX(BLOCK_ID)
-------------
1222665
SQL> select 1222665*8/1024/1024 from dual;
1222665*8/1024/1024
-------------------
9.32819366
这个数据文件本来就是10g,怎么清还是有9.4G,可是现在这个文件的使用率
只有23%
现在就只能把data这个表空间上的数据表给移表空间或者exp/imp,或者把只移动block_id很大的表
select segment_name,segment_type,tablespace_name,extent_id,bytes,blocks from dba_extents where file_id=30 and block_id='1222665';
后者会影响到我现在的应用,所以采用了方法一
具体实施过程
大概了解下情况
select owner,table_name,tablespace_name from dba_tables where tablespace_name='DATA';
新建新的表空间
cms_data
CREATE TABLESPACE cms_data DATAFILE
'/data/oracle/oradata/ora10g/cms_data01.dbf' SIZE 20480M AUTOEXTEND OFF
LOGGING
PERMANENT
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;
整理好mv表的脚本
select 'alter table '||table_name||' move tablespace cms_data;' from dba_tables where tablespace_name='DATA';
整理好相关表的索引重建脚本
select 'alter index '||index_name||' REBUILD TABLESPACE INDX;' from dba_indexes where table_name in(select table_name from dba_tables where tablespace_name='DATA');
脚本跑完以后,发现data表空间还有东西,看来除了表,索引以外的还有别的东西在里面
SELECT OWNER,SEGMENT_NAME,SUM(BYTES/1024/1024) from DBA_SEGMENTS where TABLESPACE_NAME='DATA' GROUP BY OWNER,SEGMENT_NAME
发现确实还有,继续将查出来的东西给move到别的表空间
alter user xx default tablespace cms_data
drop tablespace data;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/16719800/viewspace-662726/
,如需转载,请注明出处,否则将追究法律责任。