你可以查询到你system数据文件中的高水位的位置 通过dba_extents 表 select max(block_id)*8/1024 'M size'from dba_extents where tablespace_name='SYSTEM'
一般最好不要把自己创建的对象放到system表空间的,一旦把system表空间撑满是比较麻烦的
你先用shrink命令对表进行缩小,降低HWM。 select ds.tablespace_name,'alter table '||ds.owner||'.'||ds.segment_name||' shrink space;' from dba_segments ds where ds.tablespace_name='system(你的表空间名为system)' and ds.owner='system(这里是你的用户名)' and ds.segment_type = 'TABLE'; 查询后你可以看到自己那些表是自己当初建的可以用此命令 alter table 你的表名字 shrink space;来降低此表的HWM,之后便可通过resize命令来缩小你的表空间,把文件从1g缩小到600M。 也可以在shrink后用我这段代码来实现自动缩小表空间的脚本: SET SERVEROUTPUT ON; declare e VARCHAR(500); d int; f int; g VARCHAR(200); cursor c_logfile is select a.file_name, a.filesize,c.hwmsize from ( select file_id,file_name,round(bytes/1024/1024) filesize from dba_data_files ) a, ( select file_id,round(max(block_id)*8/1024) HWMsize from dba_extents group by file_id) c where a.file_id = c.file_id and a.filesize - c.hwmsize > 100;begin open c_logfile; LOOP fetch c_logfile into e,d,f; Exit when c_logfile%NOTFOUND; g:= ('alter database datafile '||'''' ||e||'''' || ' resize '||round(d-(d-f-100)*0.95)||'M'); dbms_output.put_line(g); execute immediate(g); end loop; close c_logfile; end; / 我也是开始学oracle 这些问题我都遇到过,自己也是查过好多资料才实现的,祝你成功
最后再resize
而比较头痛的是,system表空间,有许多系统表,全部迁移到另一表空间、再迁移回来的方式,可能会遇到些问题。建议,先对所有表进行一次整理,再试下resize。
所以,你把所有非系统的表drop掉后,然后测试的resize数据文件,你这数据文件有30G
你可以先resize 到15G,如果可以执行,在resize 到10G,直到提示不能resize。
如果最终还是太大,你就要考虑重新建库了,通过exp/imp导出用户数据,重新建库后在imp数据。
通过dba_extents 表
select max(block_id)*8/1024 'M size'from dba_extents where tablespace_name='SYSTEM'
select ds.tablespace_name,'alter table '||ds.owner||'.'||ds.segment_name||' shrink space;'
from dba_segments ds
where ds.tablespace_name='system(你的表空间名为system)' and ds.owner='system(这里是你的用户名)'
and ds.segment_type = 'TABLE';
查询后你可以看到自己那些表是自己当初建的可以用此命令
alter table 你的表名字 shrink space;来降低此表的HWM,之后便可通过resize命令来缩小你的表空间,把文件从1g缩小到600M。
也可以在shrink后用我这段代码来实现自动缩小表空间的脚本:
SET SERVEROUTPUT ON;
declare
e VARCHAR(500);
d int;
f int;
g VARCHAR(200);
cursor c_logfile is
select
a.file_name,
a.filesize,c.hwmsize
from
(
select file_id,file_name,round(bytes/1024/1024) filesize from dba_data_files
) a,
(
select file_id,round(max(block_id)*8/1024) HWMsize from dba_extents
group by file_id) c
where a.file_id = c.file_id
and a.filesize - c.hwmsize > 100;begin
open c_logfile;
LOOP
fetch c_logfile into e,d,f;
Exit when c_logfile%NOTFOUND;
g:= ('alter database datafile '||'''' ||e||'''' || ' resize '||round(d-(d-f-100)*0.95)||'M');
dbms_output.put_line(g);
execute immediate(g);
end loop;
close c_logfile;
end;
/
我也是开始学oracle 这些问题我都遇到过,自己也是查过好多资料才实现的,祝你成功