度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 3767|回复: 16
打印 上一主题 下一主题

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

[复制链接]

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
跳转到指定楼层
楼主
发表于 2020-6-30 17:58:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Oracle 11g中有个新特性:新增了一个参数“deferred_segment_creation”含义是段延迟创建,默认是true。

具体是什么意思呢?
如果这个参数设置为true,你新建了一个表Table1,并且没有向其中插入数据,那么这个表不会立即分配extent,也就是不占数据空间,即表也不分配 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了。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
沙发
发表于 2020-6-30 23:02:09 | 只看该作者
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
板凳
发表于 2020-6-30 23:02:39 | 只看该作者
收藏了

点评

恩不错,值得表扬  详情 回复 发表于 2020-7-1 17:37
回复

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
地板
 楼主| 发表于 2020-7-1 17:37:22 | 只看该作者

恩不错,值得表扬

点评

呵呵  详情 回复 发表于 2020-7-1 23:14
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
5#
发表于 2020-7-1 23:14:06 | 只看该作者
张兴康 发表于 2016-9-1 17:37
恩不错,值得表扬

呵呵
回复 支持 反对

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
6#
 楼主| 发表于 2020-7-3 09:54:21 | 只看该作者
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
7#
发表于 2020-7-3 20:44:51 | 只看该作者
回复 支持 反对

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
8#
 楼主| 发表于 2020-7-5 17:56:22 | 只看该作者
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
9#
发表于 2020-7-6 23:25:59 | 只看该作者

点评

一大一小两个表情啥意思???  详情 回复 发表于 2020-7-7 16:47
回复 支持 反对

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
10#
 楼主| 发表于 2020-7-7 16:47:17 | 只看该作者

一大一小两个表情啥意思???

点评

要有创新呀  详情 回复 发表于 2020-7-8 16:20
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-11-24 10:29 , Processed in 0.135760 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表