解决方法:insert一行,再rollback就产生segment了。该方法是在在空表中插入数据,再删除,则产生segment。导出时则可导出空表。
设置deferred_segment_creation 参数,该参数值默认是TRUE,当改为FALSE时,无论是空表还是非空表,都分配segment。修改SQL语句:
alter system set deferred_segment_creation=false scope=both;需注意的是:该值设置后对以前导入的空表不产生作用,仍不能导出,只能对后面新增的表产生作用。如需导出之前的空表,只能用第一种方法。可以构建针对空表分配空间的命令语句select 'alter table '||table_name||' allocate extent' from user_tables where num_rows=0;
把查询结果导出,执行导出的语句,强行修改segment值,然后再导出即可导出空表,注意: 数据库插入数据前,修改11g_R2参数可以导出空表
查找空表select table_name from user_tables where NUM_ROWS=0;, Oracle 10g以后增加了expdp和impdp工具,用此工具也可以导出空的表
oracle expdp/impdp 用法详解创建逻辑目录,该命令不会在操作 系统创建真正的目录,最好以system等管理员创建。
create directory db_bak as 'd:\test\dump';查看管理理员目录(同时查看操作系统是否存在,因为Oracle并不关心该目录是否存在,如果不存在,则出错)select * from dba_directories;
给system用户赋予在指定目录的操作权限,最好以system等管理员赋予。grant read,write on directory db_bak to system;
3.10 REMAP_TABLESPACE 将源表空间的所有对象导入到目标表空间中,我们将dave表空间下的对象导入到bl表空间下。
为了把用户按表空间归类,需要把用户所有的当前数据转移到另一个表空间里,那么可以使用impdp的remap_tablespace参数。下面就这一内容进行实验。
$ expdp 'test5/test3@book' directory=backup dumpfile=tbs.dmp logfile=tbs.log tablespaces=dave
$ impdp 'test5/test3@book' directory=backup dumpfile=user.dmp logfile=user.log remap_tablespace=test1:test3 table_exists_action=replace
3.9 REMAP_SCHEMA 该选项用于将源方案的所有对象装载到目标方案中. 我们导出dave 用户下的表,然后把它导入bl用户下。
【IMPDP】实现不同用户之间的数据迁移——REMAP_SCHEMA参数
$ expdp 'test5/test3@book' directory=backup dumpfile=user.dmp logfile=user.log schemas=dave
$ impdp 'test5/test3@book' directory=backup dumpfile=user.dmp logfile=user.log remap_schema=dave:bl
3.12 TRANSPORT_DATAFILES该选项表示的是表空间的传输。用于指定搬移空间时要被导入到目标数据库的数据文件。
这种方法的操作步骤如下:
(2)按transport 方式导出表空间。注意:这步操作只把metadata,即元数据,只有定义,没有data导入了dump文件。 实际的data 我们在第一步已经copy 过去了。
(3)import 我们的数据。(4)将表空间改成read write:
元数据(metadata)从我们的dump文件导入,Data Pump将实际的data从我们指定的workers.dat 导入。 这里必须写绝对路劲。我们看个实例:
1.先对表空间Dave 添加一个数据文件:SQL> alter tablespace test4 add datafile 'd:\test44.dbf' size 10m;
2.copy 到其他实例的对应位置,在移动之前先将表空间改成read only 状态:SQL> alter tablespace test4 read only;
将表空间下的所有数据文件移动到其他的实例上。可以进行重命令。 我这里是同一个实例。 因为我这里是一个实例。 我将我们刚才添加的数据文件test44.dbf 移动到'e:\test44.dbf'下。 待expdp 完成后,我们将表空间drop掉,在import进来。$ cp d:\test44.dbf e:\test44.dbf 将dave01.dbf 复制成bl03.dbf. 等会删除表空间,不然会被删除掉。
3.expdp 导出元数据:$expdp 'test4/test3@book' directory=backup dumpfile=test4.dmp transport_tablespaces=test4
4.import 数据:先把表空间drop掉在import:SQL> drop tablespace test4 including contents and datafiles;
$ impdp 'test4/test3@book' directory=backup dumpfile=test4.dmp transport_datafiles='d:\test4.dbf', 'e:\test44.dbf'
注意一点:这里transport 的表空间,在另一个实例上是不可以存在的。 不然不能导入。如果文件很多,也可以写入个配置文件里。 导入时通过PARFILE参数来指定。
(5)将表空间改成read write模式:
SQL> alter tablespace test4 read write;
SQL> select tablespace_name,status from dba_tablespaces;
transport_datafiles 注意的几点:
(1)表空间所有的数据文件都要copy到目标库。copy d:\test_test.dbf e:\test_test1.dbf;copy
(2)copy 之间,将表空间改成read only 状态。alter tablespace test_test read only;
(3)copy之后可以对数据文件进行重命名。 所以,transport_datafiles 也可以用来对数据文件进行重命名和移动位置。drop tablespace test_test including contents and datafiles;
(4)transport_datafiles 完成之后,不要忘记将表空间改成读写模式。im