重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 436|回复: 0
打印 上一主题 下一主题

[Oracle] oracle导出备份文件迁移缺失表解决办法

[复制链接]
跳转到指定楼层
楼主
发表于 2025-10-26 22:12:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 mahan 于 2025-10-26 22:18 编辑

在 Oracle 数据库中,导出时遇到 "缺失表" 且提示 "可能未分配 segment" 的问题,通常是因为这些表属于 "空表"(没有数据且未分配存储空间)导致的。以下是具体解决方法:

原因分析
Oracle 对于从未存储过数据的空表,默认不会分配 segment(存储空间),这类工具(如 exp/expdp)导出时可能会忽略这些表。

解决方法
1. 为单个空表分配 segment

-- 为指定空表分配segment
ALTER TABLE 表名 ALLOCATE EXTENT;

2. 批量为所有空表分配 segment

-- 查询所有未分配segment的空表
SELECT 'ALTER TABLE ' || table_name || ' ALLOCATE EXTENT;'
FROM user_tables
WHERE num_rows = 0 OR num_rows IS NULL
AND segment_created = 'NO';

-- 执行查询结果中的所有ALTER语句

--如果有要剔除的临时表会话表,可以微调
select 'alter table '||table_name||' allocate extent;'
from user_tables a
where (num_rows=0 or num_rows is null  ) and (table_name not like 'SESSION%') and tablespace_name is not null and not exists(
      select 1 from user_part_tables b where a.TABLE_NAME=b.table_name
)


3. 修改数据库参数(适用于 11g 及以上版本)

-- 临时修改(立即生效,重启后失效)
ALTER SYSTEM SET deferred_segment_creation=FALSE;

-- 永久修改(需要重启数据库)
ALTER SYSTEM SET deferred_segment_creation=FALSE SCOPE=SPFILE;

该参数控制是否延迟为表分配 segment,设置为 FALSE 后,新建表会立即分配 segment。

4. 导出时的特殊处理
如果使用 expdp 导出,可以添加INCLUDE=TABLE参数强制导出所有表:

expdp 用户名/密码@数据库名 DIRECTORY=数据泵目录
      DUMPFILE=导出文件名.dmp
      SCHEMAS= schema名
      INCLUDE=TABLE


操作建议
先执行查询语句确认空表清单
批量为这些空表分配 segment
重新执行导出操作


处理完成后,空表就能正常被导出工具识别并包含在导出文件中了。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-4-17 18:29 , Processed in 0.275567 second(s), 21 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

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