ORACLE,IMP 进数据库时,如何才能不让数据导入USER里,关系到权限,先赋DBA. 本人尝试过 :
   myoradb 是自己建的空间名.临时表空间为TEMP.
    revoke unlimited tablespace from myoradb;
   alter user myoradb  quota 0 on users;
   alter user myoradb quote unlimited on myoradb;   ----------查出是否有自己创建的表空间名出现在USER里.
   select * from all_tables where tablespace_name='USERS';
   的确不再导进USER了,但是我一个200多M的DMP文件导入,我空间放大至2G,导入时还是出错.
   进MANGER 查看,自己的空间利用率已经是100%了.直接怀疑其是如何占用空间的.
   其后,换成myoradb空间大小自动增长后,问题解决.但是空间被吃掉了几个G,对此,不能理解.
   请高手来解答.

解决方案 »

  1.   

    等帖子加到120分。我记得是这样的,但不确定。等楼下
    空间几个G,但是空间不会占满的。
    形象点说就是100M占1G空间。
      

  2.   

    一般情况下,用export导出来的dmp文档中,包含表的storage信息,
      
        假如导出的是个很大的表,比如有1000万条记录,则此表的storage默认初始大小已达到上百兆,
      
        这样假如您使用rows=n选项,即使导出来的dmp文档大小只有不到一兆,
      
        导入时,系统会按storage默认初始大小来分配表空间,所以一下就占用了很多的空间,
      
        假如剩余表空间不够,并且没有配置成自动扩展(数据文档),会发生导入错误。
      

  3.   

    在exp时需要加参数compress=n。缺省情况下exp的compress=y,意思是在exp所生成的文件中将表所占用所有的extend合并为init extend。
      

  4.   

    各位:
      首先,先谢谢楼上各位.经本人测试发现原来,本公司的人之前在建数据库的时候就没有注意,将自己建的空间,建在USER上了..CREATE TABLE GROUPMST
    (
      GROUPID    VARCHAR2(12 BYTE)                  NOT NULL,
      GROUPNM    VARCHAR2(32 BYTE)                  NOT NULL,
      UPDATEYMD  CHAR(19 BYTE),
      UPDATEMAN  VARCHAR2(6 BYTE),
      ACTIONFLG  CHAR(1 BYTE)                       NOT NULL,
      TRANSFLG   CHAR(1 BYTE)                       DEFAULT '1'
    )
    TABLESPACE USERS       --<注意这里> 应该是 TABLESPACE (自己的空间名)
    PCTUSED    0
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                MINEXTENTS       1
                MAXEXTENTS       2147483645
                PCTINCREASE      0
                BUFFER_POOL      DEFAULT
               )
    LOGGING 
    NOCOMPRESS 
    NOCACHE
    NOPARALLEL
    MONITORING;
    ALTER TABLE GROUPMST ADD (
      PRIMARY KEY
     (GROUPID)
        USING INDEX 
        TABLESPACE USERS     --<注意这里> 应该是  TABLESPACE (自己的空间名)
        PCTFREE    10
        INITRANS   2
        MAXTRANS   255
        STORAGE    (
                    INITIAL          64K
                    MINEXTENTS       1
                    MAXEXTENTS       2147483645
                    PCTINCREASE      0
                   ));
    所以各位同学应该注意了,这是ORACLE 自己的一个特点.如果你不指定建表在自己的空间上,就会默认成USERS里,如上:
    以上的表是通过TOAD手动建立的.这样建出来的表,就会导致USERS表空间不断增长,而本身自己的空间使用低,如果一个DB上
    有几个空间的话,就会造成结构混乱,分析不明...等等的问题.还会造成.你导出DMP文件,占用空间小,但是恢复出来的时候,发现硬盘的空间已经被吃光了.解决方案:
    首先我们在建立空间用户时,赋给其DBA权限,然后执行下面语句:
     revoke unlimited tablespace from 空间名; 
     alter user 空间名 quote unlimited on 空间名; 
    再用TOAD CREATE 新的表的时候就不会建到USERS上,而是建到自己的空间名上. 
    这样再EXP出来,IMP另外一台DB表空间的时候,按照上面的操作,再IMP进去,也不会IMP至USERS上.
    以上困惑良久.今朝解开. 其实导入至USERS里也有好处,就是EXP出来的DMP文件会很小,便于维护,携带以及恢复.
    这是空间被莫名的吃了..不知所以..哈哈.