oracle exp不能导出空表,怎样才能导出空表的结构呢?imp怎么导入空表结构?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle exp不能导出空表,怎样才能导出空表的结构呢?imp怎么导入空表结构?相关的知识,希望对你有一定的参考价值。

--空表不能导出是因为11g中的不曾插入数据的空表是不分配存储单元的,当前用户下直接执行:select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0,得到的结果是“‘给当前用户下的空表分配空间’的语句”,导出或复制这些语句,直接执行这些语句,然后再次执行导出语句,就能导出所有表(包含空表),直接导入就好了,就会包含所有空表 参考技术A E:\Temp>exp -help

关键字 说明(默认) 关键字 说明(默认)
------------------------------------------------------------------------
USERID 用户名/口令 FULL 导出整个文件 (N)
BUFFER 数据缓冲区大小 OWNER 所有者用户名列表
FILE 输出文件 (EXPDAT.DMP) TABLES 表名称列表
COMPRESS 导入到一个区 (Y) RECORDLENGTH IO 记录的长度
GRANTS 导出权限 (Y) INCTYPE 增量导出类型
INDEXES 导出索引 (Y) RECORD 跟踪增量导出 (Y)
DIRECT 直接路径 (N) TRIGGERS 导出触发器 (Y)
LOG 屏幕输出的日志文件 STATISTICS 分析对象 (ESTIMATE)
ROWS 导出数据行 (Y)

你尝试 exp 的时候, 增加一个 ROWS=N 的参数看看?追问

可是我导入不了空表结构

参考技术B 在导出和导入的时候使用参数 ROWS=N就可以了。追问

导出时生成了dmp文件,但是显示这个表不存在
我再将这个dmp导入到另外一个数据库,也没有导入成功

追答

11g么?这个表没有数据吧?
11g有一个情况,有一个参数默认如果一张表没有数据,就不给它分配空间,那么导出的时候就不导出这张表。
复杂的处理办法是修改参数,然后重启数据库,然后重新建立这张表。
简单的办法就是往这个表里面插入一条数据,然后提交,再把这条数据删除了,在提交。
参数的名字是:deferred_segment_creation 可以查询一下。

追问

好像是的 我往表里插入一条数据就可以导入导出了 ,嘿嘿,谢谢你哈

本回答被提问者采纳
参考技术C 导出时加一个参数rows=n就导出表结构,不导数据 参考技术D 把所有的空表
alter table 表名 allocate extent;
改了后,再导出,用的是oracle 11g吧

oracle 11g不能导出空表的解决方法

在oracle 11g r2中,发现传统的exp居然不能导出空的表,然后查询一下, 
发现需要如下的步骤去搞,笔记之。 
 
oracle 11g 新增了一个参数:deferred_segment_creation,含义是段延迟创建,默认是true。具体是什么意思呢? 
 
如果这个参数设置为true,你新建了一个表T1,并且没有向其中插入数据,那么这个表不会立即分配extent,也就是不占数据空间,只有当你insert数据后才分配空间。这样可以节省少量的空间。 
 
解决办法 
 
1 设置deferred_segment_creation 参数为FALSE后,无论是空表还是非空表,都分配segment。 
 
   在sqlplus中,执行如下命令: 
 
   SQL>alter system set deferred_segment_creation=false; 
 
   查看: 
   SQL>show parameter deferred_segment_creation; 
 
   该值设置后只对后面新增的表产生作用,对之前建立的空表不起作用。 
 
   注意并且要重新启动数据库,让参数生效 
 
2  使用ALLOCATE EXTENT的说明 
 
   使用ALLOCATE EXTENT可以为数据库对象分配Extent。其语法如下: 
 
   ----------- 
   ALLOCATE EXTENT { SIZE integer [K | M] | DATAFILE ‘filename‘ | INSTANCE integer } 
   ----------- 
 
   可以针对数据表、索引、物化视图等手工分配Extent。 
 
   ALLOCATE EXTENT使用样例: 
 
    ALLOCATE EXTENT 
    ALLOCATE EXTENT(SIZE integer [K | M]) 
    ALLOCATE EXTENT(DATAFILE ‘filename‘) 
    ALLOCATE EXTENT(INSTANCE integer)  www.2cto.com
    ALLOCATE EXTENT(SIZE integer [K | M]   DATAFILE ‘filename‘) 
    ALLOCATE EXTENT(SIZE integer [K | M]   INSTANCE integer) 
   
    针对数据表操作的完整语法如下: 
 
   ----------- 
    ALTER TABLE [schema.]table_name ALLOCATE EXTENT [({ SIZE integer [K | M] | DATAFILE ‘filename‘ | INSTANCE integer})] 
   ----------- 
 
    故,需要构建如下样子简单的SQL命令: 
 
   ----------- 
   alter table aTabelName allocate extent 
   ----------- 
 
3.2 构建对空表分配空间的SQL命令, 
 
    查询当前用户下的所有空表(一个用户最好对应一个默认表空间)。命令如下: 
 
   ----------- 
   SQL>select table_name from user_tables where NUM_ROWS=0; 
   ----------- 
 
   根据上述查询,可以构建针对空表分配空间的命令语句,如下: 
 
   ----------- 
   SQL>Select ‘alter table ‘||table_name||‘ allocate extent;‘ from user_tables where num_rows=0 
   ----------- 
 
   批量输出上述生成的SQL语句,建立C:\createsql.sql,其内容如下: 
 
   ----------- 
   set heading off; 
   set echo off; 
   set feedback off; 
   set termout on; 
   spool C:\allocate.sql; 
   Select ‘alter table ‘||table_name||‘ allocate extent;‘ from user_tables where num_rows=0; 
   spool off;  www.2cto.com
   ----------- 
 
   执行C:\createsql.sql,命令如下: 
   ----------- 
   SQL>@ C:\createsql.sql; 
   ----------- 
 
   执行完毕后,得到C:\allocate.sql文件。 
 
   打开该文件会看到,已经得到对所有空表分配空间的命令SQL语句。 
 
3.4 执行SQL命令,对空表分配空间: 
 
   执行C:\allocate.sql,命令如下: 
   ----------- 
   SQL>@ C:\allocate.sql; 
   ----------- 
  
   执行完毕,表已更改。 
 
3.4 此时执行exp命令,即可把包括空表在内的所有表,正常导出。
 

以上是关于oracle exp不能导出空表,怎样才能导出空表的结构呢?imp怎么导入空表结构?的主要内容,如果未能解决你的问题,请参考以下文章

处理Oracle 11g在用EXP导出时,空表不能导出

轻松解决oracle11g 空表不能exp导出的问题。

oracle 11g使用exp导出空表问题解决办法

[转]轻松解决oracle11g 空表不能exp导出的问题

oracle EXP 导出空表的方法

oracle空表导出的问题