[转载]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命令,即可把包括空表在内的所有表,正常导出。
[转载]oracle 11g不能导出空表的多种解决方法的更多相关文章
- 解决 Oracle 11g 不能导出空表的问题
--解决 Oracle 11g 不能导出空表的问题 --执行下面语句,查询数据库中的空表,同时产生分配空间.把生成的结果复制出来并执行. select 'alter table '||table_na ...
- oracle 11G 导出空表失败的解决方法
一.问题原因: 11G中有个新特性,当表无数据时,不分配segment,以节省空间 1.insert一行,再rollback就产生segment了. 该方法是在在空表中插入数据,再删除 ...
- Oracle 11G无法导出空表的解决办法
11G中有个新特性,当表无数据时,不分配segment,以节省空间解决方法:1.insert一行,再rollback就产生segment了.该方法是在在空表中插入数据,再删除,则产生segment.导 ...
- ORACLE 11G EXP导出空表方法
EXP在导出11G的库的时候,与过去10G,9I的版本有很大的差别. 就是没有数据的表是不会分配空间的. 从Oracle 11.2.0.1版本开始,Oracle又提供了一种新的空间分配方法: Crea ...
- oracle 11g不能导出空表的解决方法
在oracle 11g r2中,发现传统的exp居然不能导出空的表,然后查询一下, 发现需要如下的步骤去搞,笔记之. oracle 11g 新增了一个参数:deferred_segment_c ...
- oracle exp 无法导出空表
oracle exp 无法导出空表 select 'alter table '|| a.table_name ||' allocate extent;' from user_tables a wh ...
- Oracle11g在使用exp导出时不导出空表问题的解决办法
11G中有个新特性,当表无数据时,不分配segment,以节省空间 解决方法: 1.insert一行,再rollback就产生segment了. 该方法是在在空表中插入数据,再删除,则产生segmen ...
- oracle 11g设置打开空表extent储存块
sql>alter system set deferred_segment_creation=false; sql>show parameter deferred_segment_crea ...
- Oracle 数据库 Only 导出空表的方法
1. 之前因为oracle11.2.0.1 的bug(deferred_segment_creation) 引起无法将空表导出. 有时给同事解释上半个小时他们也不知道 如何处理 或者是 他们不会用ex ...
随机推荐
- weblogic热部署问题
最近部署的项目在weblogic10上面.按说10已经支持热部署了,但是为什么我每次修改的jsp,不生效,必须重启服务器呢?这样太耽误时间了,后来发现我的weblogic.xml里的servlet-r ...
- [CSS]三层嵌套的滑动门
原理: 最外层放水平平铺的背景,第二层放左边,第三层放右边,注意这个做法背景图不能透明 结构: <div class="module-title"> <span ...
- wp8.1 Study11:APP里文件读写和使用XML和Json序列化
一.文件读写 1.基本操作(使用FileIO API) 这个方法在上一个stduy已经学过,那么贴出来复习下,代码如下: private async void writeTextToLocalStor ...
- centos7 学习1 KDE配置中文
安装kde桌面后没有中文,可以用以下方法配置中文 #yum list kde*chinese 会显示可以安装的包,我的显示如下 kde-l10n-Chinese.noarch -.fc14 @upda ...
- Rhel7的基本使用
1.修改主机名 [root@localhost ~]# cat /etc/hostname localhost.localdomain[root@localhost ~]# hostnamectl s ...
- C/C++遍历Windows文件夹下的所有文件
因为文件夹中往往包含文件和文件夹.想要遍历所有的文件,必须遍历文件夹中所有的文件夹.很显然,这个描述满足递归的两个要素:(1)问题的规模在不断的缩小,且新问题的模式与旧问题相同.很显然文件夹中含有子文 ...
- Add project to working sets
最近换了个电脑,重新搭建了开发环境,但是在新建项目的过程中发现有Add project to working sets这一个选项,一开始也不明白是什么意思,百度了一下,不少网友说是把项目存到物理空间, ...
- Tengine安装配置
为了加快网站的大流量访问速度,公司要求把Nginx更换为Tengine,下面记录下整个安装配置过程: #安装必要依赖 yum install -y pcre pcre-devel zlib zlib- ...
- Logger.getLogger()和 LogFactory.getLog()
Logger.getLogger()和LogFactory.getLog()的区别: 1.Logger.getLogger()是使用log4j的方式记录日志:2.LogFactory.getLo ...
- 重拾java系列一java基础(3)
这一章主要复习下以前所接触的算法, (1)选择排序法:在要排序的一组数中,选出最小的一个数与第一个位置的数交换:然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较 ...