oracle11g数据库导出表不全问题解决

版权声明:本人原创文章,如需转载,还请注明出处。 https://blog.csdn.net/jin_tk/article/details/88219400

oracle11g空表未导出

oracle11g有个新特性就是,当表无数据时,不分配segment,以节省空间 。这里简单介绍下关于数据库的几个字段组成。

  1. tablespace: 一个数据库划分为一个或多个逻辑单位,该逻辑单位成为表空间;每一个表空间可能包含一个或多个 Segment;
  2. Segments: Segment指在tablespace中为特定逻辑存储结构分配的空间。每一个段是由一个或多个extent组成。包括数据段、索引段、回滚段和临时段。
  3. Extents: 一个 extent 由一系列连续的 Oracle blocks 组成.ORACLE 为通过extent 来给segment分配空间。
  4. Data Blocks:Oracle 数据库最小的I/O存储单位,一个 data block 对应一个或多个分配给data file 的操作系统块。
    table 创建时,默认创建了一个data segment,每个data segment含有min extents 指定的extents 数,每个extent 据据表空间的存储参数分配一定数量的blocks。
解决办法
  • 表为空时不分配segment,所以可以通过使表产生,即可在空表插入数据,再删除可以产生,实际操作当中,不太切合实际,不建议。
  • 设置deferred_segment_creation(延迟段创建)参数,它是在11g中才有的参数。创建一个表,在没有插入数据时是否分配空间,为true。但是sys用户除外。它会自动分配空间,普通用户不会自动创建。
    关于它的详细介绍可以参考:http://www.cnblogs.com/ningvsban/p/3603897.html
    1、先在dos窗口下登录数据库。
    在这里插入图片描述
    2、查询并更改参数。
    查询并更改
    更改后
    注意:此种方法只是针对后来新建的空表起作用,之前的空表还是无法正常导出的,除非你挨个把之前所有的空表都分配到segment,那就太麻烦了,所以还有种方法,算不上简单,算是前两种方法的延伸。
  • 第三种其实就是把所有的空表都产生segment,只是通过sql的方法来实现。
--查询所有的空表
select table_name from user_tables where NUM_ROWS=0;
--拼接sql为这些sql批量生成修改语句
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0

生成效果图如下:
在这里插入图片描述
然后复制或者导出这些sql执行下就完事了。就可以利用原来的导出命令导出所欲的数据了。
总结:前两种方法其实算是在阐述原因,第三种方法才是解决办法,虽然有点麻烦,但是搞清楚原因才能解决问题不是,知其然,所以然。

猜你喜欢

转载自blog.csdn.net/jin_tk/article/details/88219400