我的机器上的磁盘有c:、d:、e:
数据库的默认表空间df_space建在d:和e:两个盘上,
表空间df_space含2个数据文件,d上1个数据文件,e上1个数据文件。
我的表和索引都建在这个默认表空间df_space上。因为d:相对比较小,e:比较大
d就快满了,e还有很大的未用空间。
问题:
如果有一天d真满了,但e还有很大的未用空间
1、这种情况下还能在这表空间df_space上继续建其他表吗
 或者往表里添数据吗?
2、我在e上又建了个表空间new_space,而后将数据库的默认表空间改为new_space,
   那我有个大表t且是个分区表,是在默认表空间上的,每天都会往里面增加新数据,
  还能正常工作吗?若不能怎么解决?

解决方案 »

  1.   

    一、能的,当然你肯定不希望D盘真的100%,那太恶心人了,所以楼上的方法很好,把在D盘的这个数据文件alter下它的最大值,控制它比现在大一点就行了,这样,oracle就不会再往这个里面插数据了。
    当然还有一种好方法,就是把这个数据文件移动到E盘,1、关闭oracle,把数据文件拷到E盘
    2、将表空间 offline 
    alter tablespace users offline;
    3、 alter tablespace users rename datafile '/opt/oracle/oradata/conner/users01.dbf'    to '/opt/oracle/oradata/users01.dbf';4、将表空间online
     alter tablespace users online; 5、select name from v$datafile; 查询数据文件目前位置二、能正常工作,当然还是用原来的表空间,而且和你新建的这个表空间没任何瓜葛。默认是什么意思!意思就是默认取这个值,意思是缺省值,就是当初建表时缺省它的存放表空间是XXXX,但是一旦建表后,那自然就固定了。你糊涂了!
      

  2.   


    数据库的默认表空间df_space建在d:和e:两个盘上-- 把在D 盘的数据文件移到e 盘去。  注意监控表空间的大小。 最好设置自增长的。 具体怎么移动,参考我的blog, 方法写的很详细。 
    Oracle 移动数据文件的操作方法 
    http://blog.csdn.net/tianlesoftware/archive/2009/11/30/4899172.aspx
    不知道楼主为什么把数据文件放在2个盘符下。 个人不建议这么做。 因为这样在规避风险上没有太大作用。 反而增加了维护的难度。 一般我们把所有的数据文件都是放在Oradata 这个目录下。 之前也看过相关的文章,说把数据文件放在多个目录下能防止意外发生。 但是现在硬件技术已经有很大的进步。 硬盘也不容易坏。 还有就是生产环境下,数据文件都是放在存储上面的,都做了RAID 冗余,所以也没有必要这样的拉放数据文件。 如果是测试的话,也没必要这么折腾了...------------------------------------------------------------------------------ 
    Blog: http://blog.csdn.net/tianlesoftware 
    网上资源: http://tianlesoftware.download.csdn.net 
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx 
    DBA1 群:62697716(满); DBA2 群:62697977
      

  3.   

    楼上说的很好,肯定会过去的,不过将一张盘的空间弄到100%的确挺恶心的。我也简单说下,希望可以参考:如果我没有猜错的话,你的在d盘的那个数据文件应当是自动增长的,或者设置的非常大,除非它达到磁盘控制或者文件头限制(理论最大值为32G)才会说明这个文件排满。对于问题1:
    如果需要将数据文件移植到E盘,楼上已经有很明确的方法,稍加修改参数即可完成;若需要将数据立即不在D盘写入,而直接写入E盘的那个文件,因为是同一个表空间,所以只需要将D盘的数据文件属性设置为不可自动增长即可,设置resize其大小或者设置数据文件最大值,并控制其大小,但是它不会低于已经存在的数据所存储的大小(当然也不会低于一个指定的最小值128K,这是8个保留块和8个应用块的基本要求,当然你的问题肯定不是这种情况了,不过只要内部有那么多的数据,它不允许降低到比已经存在的数据块所占用的空间更小的位置)。对于问题2:
    新创建的表空间,对于原有对象无效,即使将用户默认表空间设置为新创建的表空间,只是代表在登录用户下用户使用CREATE TABLE|INDEX对象的时候若不指定TABLESPACE的名字,自动使用用户默认的表空间,但是并不是说以前的对象也转移了,表空间按照段管理对象,若为分区表和分区索引,可以对每一个分区指定表空间,此时可以将新创建的分区信息指定到新的表空间中即可,如果你要将历史表移植到新的表空间需要手工MOVE移植方可。下面我将一些相关的可能用到的语法给你,希望可以帮助:
    将数据文件移植到另一个磁盘楼上已经说明,我这不必多说,我这里只是稍微在扩展一点点:
    1、查看表空间的数据文件,以及其是否自动增长(字段autoextensible为YES则为自动增长,NO为不自动增长):
    SELECT f.file_name,f.tablespace_name,f.autoextensible,f.maxbytes 
    FROM dba_data_files f
    WHERE f.tablespace_name=upper('<表空间名称>');2、将数据文件设置为不可自动增长(修改后再用上面SQL查询是否自动增长):
    ALTER DATABASE DATAFILE '<数据文件磁盘路径>' AUTOEXTEND OFF;3、修改数据文件大小(不可低于已经存在数据块和索引块已经占用的大小,否则报错,不过它会提示你,使用上也不必担心,若一定要缩小,须将部分表和索引信息移植到其它表空间中,下面会有语法请参考):
    ALTER DATABASE DATAFILE '<数据文件磁盘路径>' RESIZE 2048m;--设置为你规定的大小4、将某表移植从一个表空间移植到另一个表空间(索引同理):
    ALTER TABLE <表名称> MOVE TABLESPACE <新创建的表空间名称>;5、查看表所在的表空间(索引为user_indexes视图):
    SELECT t.table_name,t.tablespace_name FROM user_tables t
    WHERE t.table_name=upper('<表名称>');参考
      

  4.   

    我说的将数据文件移到步骤可能有问题,最好是  先offline,后copy到E盘(应该不用关闭oralce就行)
      

  5.   

    关于表空间的 问题 
       数据文件在数据库中可以任意增加 理论文件数最好不大于 1024个文件 直接使用oem工具增加文件即可 ,将新加的文件放置 E: ,如果没有工具 ,请直接google搜索之 嘿嘿
      二、表空间的管理 
      表空间中文件最好不要设置成自动增长,缺少文件时,手工增加,不要偷这个懒。