`

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

阅读更多
ORACLE 11g 用exp命令导出库文件备份时,发现只能导出来一部分表而且不提示错误,之前找不到解决方案只能把没导出来的表重新建建立。后来发现是所有的空表都没有导出来。于是想好好查查,因为在以前的10g版本中没有这样的问题。

查资料发现Oracle 11g中有个新特性:新增了一个参数“deferred_segment_creation”含义是段延迟创建,默认是true。

具体是什么意思呢?

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



用下面的SQL语句查询,可以发现没有导出的表其 segment_created 字段值都是 'NO'。

Select segment_created,table_name from user_tables where segment_created = 'NO';


解决方法:

1、最原始最笨的办法(不推荐):insert一行,再rollback或者删除就产生segment了。

该方法是在在空表中插入数据,再删除,则产生segment。导出时则可导出空表。



2、设置deferred_segment_creation 参数:

   设置deferred_segment_creation 参数为FALSE来禁用"段推迟创建"(也就是直接创建segment),无论是空表还是非空表,都分配segment。

   在sqlplus中,执行如下命令:

   SQL>alter system set deferred_segment_creation=false;

   查看:

   SQL>show parameter deferred_segment_creation;

   注意:该值设置后只对后面新增的表产生作用,对之前建立的空表(已经存在的)不起作用,仍不能导出。

   并且要重新启动数据库,让参数生效。



3、使用ALLOCATE EXTENT,可以导出之前已经存在的空表。

   使用ALLOCATE EXTENT可以为数据库对象的每一张表分配Extent(注意针对每一张表,就是说一张表需要一条SQL代码):

   其语法如下:

   -----------

   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 TableName allocate extent

   -----------

   但要是每一张表写一条语句的话太过麻烦,为了方便我们使用SQL命令拼写出每一张表的alter语句。



构建对空表分配空间的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 or num_rows is null(注意:很多教程没有这里,这里是有可能位空的)

   上述代码可产生批量的修改表extent的SQL语句(有多少张空表就产生多少条),我们只需要将其生成的所有sql代码全部执行,就可以给每一张已经存在的表来分配segment,就OK了。



最后:这时再用exp导出就没有问题了。但是:数据库本身的deferred_segment_creation属性还是TRUE,也是就是说如果再创建新表的话,默认还是不分配segment的。所以还是需要更改deferred_segment_creation的参数,以便以后创建的新表自动分配segment。

总结:

    如果你的数据库还没有创建任何数据表,那么直接修改deferred_segment_creation属性,以后创建的表无论是不是为空都会自动分配segment,就不会出现导不出空表的情况。然而如果你的数据库中已经有很多空表,并且需要导出来,那么光修改deferred_segment_creation属性则没有用的,因为它只对之后创建的表有作用。你需要给已存在的空表分配segment以便可以导出存在的空表,就用到上面讲的allocate extent方法,但此方法只针对已经存在的表的segment属性,所以最好就是:先给已存在的空表分配segment,方便其可以直接导出,然后设定deferred_segment_creation参数以便以后每张表无论是否为空都自动分配segment。



附录:有关第三种方法给已经存在的空表分配segment,下面介绍一种生成脚本来执行sql的方法。

SQL>Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 or num_rows is null;

批量输出上述生成的SQL语句并写入到一个.sql的脚本文件中。

如:

1. 创建执行脚本文件:我创建一个E:\sql_script.sql文件。内容如下:

   set heading off;

   set echo off;

   set feedback off;

   set termout on;

   spool E:\sql_allocate.sql;

   Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 or num_rows is null;

   spool off;

   这个脚本的作用就是创建一个E:\sql_allocate.sql脚本文件,将Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 or num_rows is null的执行结果(就是给每张表生成segment的SQL代码)批量输出,存储到一个E:\sql_allocate.sql的脚本文件中。



2. 执行E:\sql_script.sql文件来生成“分配表空间的SQL代码”的脚本文件sql_allocate.sql。

   命令如下:

   SQL>@ E:\sql_script.sql;  (也可写一个批处理文件,命令如下:sqlplus 用户名/密码@数据库 @E:\sql_script.sql)

   执行完毕后,得到E:\sql_allocate.sql脚本文件(里面是给所有空表分配segment的SQL代码)。

   打开该文件会看到,已经得到对所有空表分配空间的SQL语句。



3. 执行E:\sql_allocate.sql文件来对表分配空间。

   命令如下:SQL>@ E:\sql_allocate.sql

   执行完毕,表已更改。之前存在的空表已分配segment空间!



大功告成,此时执行exp命令,即可把包括空表在内的所有表,正常导出
分享到:
评论

相关推荐

    oracle11g不能导出空表的解决方式

    Oracle 11g 导出空表解决方案 Oracle 11g 是一个功能强大且复杂的关系数据库管理系统,它提供了多种方式来导出数据库中的数据。然而,在使用 exp 命令导出 Oracle 11g 数据库时,空表会出现错误,这是因为 Oracle ...

    oracle11G-解决空表导出的问题

    针对空表导出的问题,本教程将深入探讨如何在Oracle 11g中正确执行这一操作,并提供具体的操作步骤。 1. **理解Oracle数据导出工具**: - **exp**: Oracle的传统数据导出工具,基于PL/SQL,适用于小型数据库和简单...

    Oracle11G导入导出(imp和exp)少表解决方法

    Oracle 11G 导入导出(imp 和 exp)少表解决方法 Oracle 11G 是一个功能强大且复杂的数据库管理系统,它提供了多种方式来导入和导出数据。然而,在使用 Oracle 11G 时,用户可能会遇到一些问题,例如无法导出空表...

    解决Oracle 11G空表数据不能导出[程序/源码]

    总的来说,解决Oracle 11G空表数据不能导出的问题,需要理解`expdp`工具的使用、数据库的权限设置、表空间的管理以及可能的触发器和索引影响。通过正确配置和使用这些工具,可以成功导出空表的数据,从而保证数据...

    window下Oracle 11g导出的EXPDP数据导入到linux

    Oracle 11g 是一种关系型数据库管理系统, EXPDP 是 Oracle 11g 中的一种数据导出工具,用于将数据库中的数据导出到一个 dump 文件中,而后可以将该文件导入到另一个数据库中。 在 Windows 下使用 EXPDP 工具导出 ...

    Oracle 11G 本地精简导入和导出(需要配置ORACLE_HOME环境变量)

    Oracle 11G 是Oracle公司推出的一个企业级数据库管理系统,其本地精简导入和导出功能是数据库管理员在日常工作中经常使用的工具,主要用于数据迁移、备份恢复和性能优化。在这个场景下,用户需要一个免安装的版本,...

    Oracle10g导入导出

    ### Oracle 10g 数据导入导出详解 #### 一、概述 Oracle 10g 引入了一项新技术——**数据泵**(Data Pump),它为数据库管理员(DBA)及开发人员提供了一种高效的方式,可以快速地在不同的 Oracle 数据库之间迁移数据...

    PowerDesigner15连接Oracle数据库并导出Oracle的表结构

    "PowerDesigner15连接Oracle数据库并导出Oracle的表结构" 本文主要介绍了使用PowerDesigner连接Oracle数据库,并生成E-R图的详细步骤。 知识点1:PowerDesigner简介 PowerDesigner是一个强大的数据建模工具,能够...

    Oracle11g客户端安装包.zip

    这个压缩包文件“Oracle11g客户端安装包.zip”包含安装客户端所需的所有组件,使得用户能够在本地执行诸如数据导入导出、SQL查询等多种操作。 首先,让我们了解一下Oracle客户端的主要组件。它通常包括网络配置工具...

    oracle11g数据库三种方式导入导出必备的exe文件

    标题中提到的"oracle11g数据库三种方式导入导出必备的exe文件"——exp.exe、imp.exe和sqlplus.exe,是Oracle数据库管理员常用的三个实用程序,它们各自承担着不同的任务。 1. **exp.exe**: EXP是Export的简称,它是...

    Oracle 19c 备份恢复-导入导出

    Oracle 19c 备份恢复-导入导出 Oracle 19c 备份恢复-导入导出是指使用 Oracle 数据库提供的工具 exp 和 imp 实现数据库的备份恢复和数据的导入导出。本文将详细介绍 Oracle 19c 备份恢复-导入导出的基本命令、工作...

    oracle10g-oracle11g的数据库迁移

    Oracle 10g 到 Oracle 11g 数据库迁移 在进行数据库迁移之前,需要对源主机和目标主机进行准备工作。源主机需要新建 Oracle 别名目录,并赋予 oracle 用户读写权限。在目标主机上,需要新建表空间、用户,并赋予...

    Oracle11g_数据库导入导出.pdf

    Oracle 11g 是一款功能强大的关系型数据库管理系统,它提供了多种数据管理工具和服务,支持高可用性、安全性和性能优化等特性。在Oracle 11g 中,数据库的导入导出是一项非常重要的技能,尤其对于数据库管理员(DBA)...

    oracle11g-exp文件

    Oracle 11g是甲骨文公司发布的一款关系数据库管理系统,其强大而高效的数据处理能力在业界享有盛誉。在给定的“oracle11g-exp”文件中,重点涉及了Oracle数据库的数据导出和导入工具,即EXP(Export)和IMP(Import...

    Oracle11g64bit下的bin目录,包含导入导出用的imp.exe以及exp.exe文件,可用于plsql导入导出

    `exp.exe`(Export Utility)则是Oracle Data Pump导出工具,它负责从数据库中提取数据和对象(如表、视图、存储过程等)到一个外部文件,以便备份、迁移或在不同环境中复用。通过`exp.exe`,你可以选择导出特定的表...

    oracle11g 导到 10g

    【标题】:“Oracle11g 导到 10g”这一主题涉及到的是在两个不同版本的Oracle数据库之间迁移数据的过程。Oracle 11g是Oracle数据库的一个较新版本,而Oracle 10g则是其前一个版本。这种迁移可能由于多种原因,如升级...

    oracle11g使用手册

    ### Oracle11g 使用手册:...综上所述,本文档详细介绍了Oracle 11g的安装配置流程、表空间管理、用户管理以及数据库的导入导出操作。通过学习这些内容,可以帮助用户更好地理解和掌握Oracle 11g的核心功能和使用技巧。

    Oracle 11g傻瓜书

    Oracle 11g提供了一整套完整的数据存储、管理、安全和备份恢复解决方案。 2. **安装与配置**:书中会详细介绍如何在不同操作系统上安装Oracle 11g,包括Windows、Linux和Unix环境。还会讲解配置数据库实例、创建...

    Oracle导出程序Exp的使用

    Oracle的导出程序Exp是数据库管理系统中的一个重要工具,它用于从数据库中提取数据并将其存储到操作系统文件中,便于备份、迁移或者恢复数据。Exp的使用涵盖了多种场景,包括整个数据库、特定用户的数据、单个或多个...

    Navicat12,15 连接oracle11g的插件包

    总的来说,"Navicat12,15 连接oracle11g的插件包"是为那些需要通过Navicat管理Oracle 11g数据库的用户提供的一套便捷的解决方案,它简化了客户端的安装和配置,使得数据库管理和开发工作更为高效。

Global site tag (gtag.js) - Google Analytics