同一数据库下有两个用户A和B,
要求两者的schema完全一样,现在A中也有数据,而B用户刚刚建立,里面什么都没有
我的做法是将A的所有对象全导出来,但不导数据和索引
然后再导出来的文件导入B用户下,这样两者的schema就保持一样具体如下:1、导出A的所有对象,参数文件如下:userid=aa/aa@aaoa3
owner=A
rows=n
indexes=n
constraints=y
grants=n
log= D:\aaOA\导出\oa_exp.log
file=D:\aaOA\导出\oa_exp.dmp
direct=y
compress=n 生成的oa_exp.dmp文件有1.08M
2、导入到B对象,参数文件如下:userid=aa/aa@aaoa3
fromuser=A
touser=B
rows=y
indexes=y
constraints=y
grants=y
log= D:\aaOA\导入\oa_imp.log
file=D:\aaOA\导出\oa_exp.dmp
ignore=y
RECALCULATE_STATISTICS=y导入成功,但发现表空间增长了一倍,后来仔细发现1M多的文件,到数据库后成了825M,和A用户所有对象所耗的表空间相当,不知道为什么,请高手指点,谢谢!

解决方案 »

  1.   

    因为你导入的时候,.dmp文件包含创建和a相同的表空间的语句!
      

  2.   

    to hdkkk(diablo2):
       首先谢谢你答复,不过我还是有些不明白。  表空间的创建是由系统完成的,它不属于某个用户,导出用户的对象,会将创建表空间的语句也导出来么?
       “你可以尝试compress=y”,压缩有什么好处?
      

  3.   

    导入成功,但发现表空间增长了一倍,后来仔细发现1M多的文件,到数据库后成了825M,和A用户所有对象所耗的表空间相当, 当然会这样了,因为你从A用户导出的建立表的脚本,这个脚本里面的STORAGE分配空间
    的数额是A用户表的数额,所有,在导进B用户时候,建立表的时候ORACLE会分别这么大的空间
    来建立表。你用记事本打开备份 .dmp文件就可以清楚的知道了
      

  4.   

    你可以尝试compress=y可以这种方法可用于整理数据库碎片,但不能改变
    STORAGE的大小。方法也是要修改STORAGE的大小,或是从新用脚本建立表。
    我的方法就是修改。DMP文件的STORAGE参数。
      

  5.   

    compress之后,能否起到不创建和A用户一样的表空间大小呢?如果不是的话,也没什么用嘛
      

  6.   

    to  LGQDUCKY(飘) :建表时STORAGE分配空间一开始好像都不是很大,比如我取出B用户下某表的建表语句-- Create table
    create table BBS_LB
    (
      BIANH   CHAR(14) not null,
      KANWLBM CHAR(50),
      SHUOM   CHAR(200)
    )
    tablespace TS_DATA
      pctfree 10
      pctused 40
      initrans 1
      maxtrans 255
      storage
      (
        initial 64K
        next 1M
        minextents 1
        maxextents unlimited
        pctincrease 0
      );
    -- Create/Recreate primary, unique and foreign key constraints 
    alter table BBS_LB
      add constraint PK_BBS_LB primary key (BIANH)
      using index 
      tablespace TS_INDEX
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 64K
        next 1M
        minextents 1
        maxextents unlimited
        pctincrease 0
      );这是B用户的建表语句,这个语句是A用户导入后形成的,由PL/SQL Developer工具拉出来
    其中storage参数分配也不是很多呀,怎么会一下子耗掉了那么多空间?是不是还有些参数,上面的语句中没有写出来。请再解释一下,谢谢!
      

  7.   

    据我的理解,建表时storage参数的含义是:
      先预分配空间,也就initial参数所指定的大小,也就是64K
      接着根据minextents和next值来,分配随后的空间消耗,也就是1x1M,
    也就是说一开始建表时,分配的空间也就是1M+64K不知对不对?
      

  8.   

    是的,如果没有设置STORAGE参数,将采用所在表空间的参数。
      

  9.   

    哦,谢谢!我好像明白为什么了,A用户对象下一共有622个表,每个表一开始就要消耗1M多的空间(我看建表语句,都是一样的,storage参数全是默认的),除此之外,很多表有主键,主键索引初始所耗的空间也是1M多,这样算来,一开始耗掉800多M也就不足为奇了!