发布网友 发布时间:2022-04-23 15:26
共2个回答
热心网友 时间:2022-05-05 19:26
首先 :system01.dbf对应的应该是system表空间(系统表空间),这个表空间存放着系统关键数据、视图等,这个表空间无论什么情况下也不能删,否则oracle就over了
sysaux01.dbf对应的应该是sysaux表空间(辅助表空间),这个表空间存放的是oracle的各种功能工具等,如果损坏,将导致oracle很多功能无法使用。
出于对IO性能和数据安全、等需求,一般每一个用户(也叫方案)在新建的时候,都会指定一个表空间和相应的数据文件(dbf文件),根据你的描述,应该是设置了自动增长(当然,本人并不推荐使用自动增长,这将使数据文件变得不可控,带来管理上的问题),数据文件在指定后,不管有没有存放数据,都将占用相应的磁盘空间(自动增长,也是只增不减)。
自动增长,是表空间不足的时候,自动增加数据文件的大小,这时oracle会把相应大小的磁盘分配给表空间,每次增加的大小由dba建立数据文件时的命令来指定。
删除数据,并不能改变数据文件的大小,要更改数据文件大小,可以用以下命令
ALTER DATABASE DATAFILE 'D:\ORADATA\ECSS20' RESIZE 206M(这里写你想改成的大小)
但是必须注意,oracle的块大小一般为8K,你首先要查看当前数据文件用到的最大数据块号为多少,有个案例如下 :
1. 查询oracle数据文件及其编号。SQL语句如下
select file#,name from v$datafile;
查询出数据库的所有数据文件,其中包含如下,正是达到20多G的数据文件
FILE# NAME
------------------------------------------------------------------------------------------
6 D:\ORADATA\ECSS20
2. 查找该数据文件的最大块号。语句如下:
select max(block_id) from dba_extents where file_id=6;
查询结果如下:
MAX(BLOCK_ID)
-------------
534785
3. 计算该表空间目前实际占用的空间(不是物理文件的大小)
显示每个数据块的大小。语句如下:
show parameter db_block_size;
结果为8192,就是8K。
然后计算所有数据块占用的物理空间(拿计算器计算也一样)
select 534785*8/1024 from al;
结果为4178.00781M,就是4G多
4. 然后我们知道目前用了4G多,我们就可以把数据文件大小Resize到4G多一点
ALTER DATABASE DATAFILE 'D:\ORADATA\ECSS20' RESIZE 4200M;
数据库已更改。正常。
到此为止,实际数据文件的大小就由20多G到4G多了。
5. 继续往下走,因为我们实际数据占用了几十M,但数据文件还有4G多,还是我们把之前的表truncate掉后才能得到的。现在查一下占用最大块(segment 534785)的是什么。语句如下:
select distinct owner, segment_name, segment_type,tablespace_name from dba_extents where file_id =6 and block_id=534785; www.2cto.com
查到的结果如下:
OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------------------------------------------------------------------------------------
AJITA BIZTALKINGINFO TABLE ECSS
说明目前占用最大块的对象是表BIZTALKINGINFO
6. 把表挪动一下,把表从当前表空间转移到了另外一个表空间(要已经存在的),语句如下:
alter table biztalkinginfo move tablespace ECSS_LUCIFER;
再次查询物理文件中的最大块号(步骤2),本次查询结果为534761,结果已经变小了,再查询该块的数据时BizTalkingInfo的主键。
7. 分析可知,在我们数据表已经插入大量数据后,才建表BizTalkingInfo,然后该表占用的块就偏大。然后我们resize数据文件时就不能小于该块。最简单的办法是删掉该表相关的东西,然后重建即可。当然也有比较复杂的办法可以办到。
8. 有一个结论就是:建表一般要放在数据表初始化之前进行,最好不要再初始化了大量数据,尤其是日志数据后再建表。
(以上案例内容为转载)
注意:无论如何,也不要更改systemt、sysaux这两个表空间
热心网友 时间:2022-05-05 20:44
truncate 表只能回收了表占用的空间,表空间是不会变的
你确实要补补oracle的基础概念追问这个我也已经验证出来了
但那几个表空间具体有什么作用?
还有怎么回收表空间?