zoukankan      html  css  js  c++  java
  • oracle 11g导出少了空表,原因分析

    oracle 11g导出少了空表

    使用exp命令的时候,会出现少表的情况,是因为在11g版本中如果一个表里面是空的,为了节省空间,默认是不会给这个表分配空间的,在导出的时候也就不会将空表导出的,自然导入到另一个库里的时候会出现少表的情况。但缺少的表虽然里面没有数据,但有时候还是会影响到应用程序的执行,所以得把所有表都得导出来。

    所以在正常导出表时,请一定要注意。

    原因分析:
    由于oracle 11g新增了一个参数: "deferred_segment_creation" "段延迟创建",默认值为true。

    什么是段:
    段(segment)是一种在数据库中消耗物理存储空间的任何实体(一个段可能存在于多个数据文件中,因为物理的数据文件是组成逻辑表空间的基本物理存储单位)。简单点说可以把segment当作占据物理存储空间的一个单位。

    deferred_segment_creation:
    如果这个参数设置为true,当你新建一个表table1时,并且没有向其中插入数据,那么这个表不会立即分配extent,也就是不占数据空间,即表也不分配segment以节省空间,所以这些表也没能导出来。在系统表user_tables中也可以看到segment_created的字段里是“NO”或者“YES”说明了某张表是否分配了segment。说白了是为了可以节省少量的空间。

    sql语句:

    • 查看deferred_segment_creation 参数的值:
    SQL> show parameter deferred_segment_creation;
    
    • 设置 deferred_segment_creation 参数为FALSE来禁用"段推迟创建,也就是直接创建segment,无论是空表还是非空表,都分配segment"(得拥有权限)。修改参数只会对以后创建的表生效,并不会对之前的表生效。
    SQL> alter system set deferred_segment_creation=false;
    
    • 查找用户下所有表中是否有 segment_created 字段值是“NO”的表:
    SQL> Select segment_created,table_name from user_tables where segment_created = 'NO';
    

    解决办法:

    • 查询该用户下所有空表,并生成将空表生成物理空间的语句输出来。拿着输出的语句,跑一遍。
    SQL> select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
    

    执行过后,就可以使用命令导出用户下的所有表了。

  • 相关阅读:

    模块
    18 安装kali系统
    17 部署靶机环境下
    16 部署靶机环境上
    15 部署win2003和IIS服务
    Spring详解(十一)----Bean 的作用域
    Spring详解(十)----使用@Configuration与@Bean注解装配Bean
    Spring详解(九)----Spring Bean的自动装配(基于注解的方式【推荐】)
    Spring详解(八)----Spring Bean的装配(基于注解的方式【推荐】)
  • 原文地址:https://www.cnblogs.com/dance-walter/p/9425163.html
Copyright © 2011-2022 走看看