我这情况,是不是该回收oracle表空间?

首先,本人是程序员一枚,不是DBA,所以虽然用了oracle两年,对其一些细节还是一知半解~~~

回正题,在oracle里面,我们创建一个数据库,再在里面建用户,建表,是有默认的表空间的。当然也可以对用户指定表空间
现在,我就用安装oracle的时候默认创建的数据库ORCL来说,在%oracle_home%\oradata\oracl下面,有好几个DBF文件,我想知道他们的作用分别是什么!!!

现在我创建了一个用户叫SALE,给它指定一个叫saledate的表空间,接着用sale登录插入了一大堆数据,之后我看%oracle_home%\oradata\oracl下面的SALEDATE.DBF已经增大到600多M了,再看SYSAUX01.DBF跟SYSTEM01.DBF分级是500多M跟700多M。

1、SALEDATE.DBF应该就是对应SALE的表空间文件,对吧?那么SYSAUX01.DBF跟SYSTEM01.DBF又是什么表空间文件呢?我看网上有人SYSAUX01.DBF没有了能否恢复数据,难道SYSAUX01.DBF是一个数据备份的表空间么?还有SYSTEM01.DBF是什么表空间?请明确说出他们的具体作用

在公司有一台测试的服务器,装的是oracle10g,里面增量地存了很多数据,现在数据都占用了好几百G硬盘空间了,他们都用一个叫report的数据库,里面有很多表空间,对应一个用户一个指定的表空间,里面记录了我国各个省份的业务数据,具体表空间命名为XXDATA,XX为省名字拼音首字母,例如广东省的数据:GDDATA。
现在数据已经占用了几百G硬盘空间了,为了挪出空间,经理把很多省份的数据表都truncate一遍,数据没有了,但查看硬盘空间并没有减少。他也搞不懂,按道理,应该删除数据,空间就会减少~~~就问了我这样一个问题,我看了一下各张数据表的建表语句,好像表空间的上限都是unlimited,可惜但我也搞不懂怎么数据没了表空间文件还占用那么多硬盘空间!所以才问这样一个问题,我在网上也查找了一下,看见好像删除数据之后,还得回收表空间
2、那么现在我已经把表都truncate掉了,该怎么写回收表空间的语句,具体语句是什么?当然不能直接drop表空间,因为那些表的结构还得保留

请就以上两点,分别回答,谢了~

首先 :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 dual;
结果为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这两个表空间
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-15
truncate 表只能回收了表占用的空间,表空间是不会变的
你确实要补补oracle的基础概念追问

这个我也已经验证出来了
但那几个表空间具体有什么作用?
还有怎么回收表空间?