目 录CONTENT

文章目录

Oracle不导出空表解决方案

BKUN
2021-11-13 / 0 评论 / 0 点赞 / 2,453 阅读 / 688 字

🚀 Oracle 导出 DMP 文件:解决不导出空表问题

在 Oracle 数据库中使用 expexpdp 导出 DMP 文件时,默认情况下空表可能不会被导出。本文提供解决方案,确保空表也能包含在导出文件中。让我们一步步解决吧!📜


📝 问题背景

  • Oracle 11g 及以上版本引入了 deferred_segment_creation 参数,默认值为 TRUE
  • 当表为空(无数据)时,若未分配表空间段(segment),导出时会被忽略。

🔧 解决方案

1️⃣ 查询空表

查找当前用户下所有空表,并生成分配空间的 SQL:

select 'alter table ' || table_name || ' allocate extent;' 
from user_tables 
where num_rows = 0;

💡 结果示例

  • alter table EMP allocate extent;
  • alter table DEPT allocate extent;
    说明num_rows 为 0 表示表为空。

2️⃣ 执行分配空间

  • 将步骤 1 查询的结果复制出来。
  • 在 SQL 客户端(如 SQL*Plus 或 PLSQL)逐条执行这些 alter table 语句。

效果:为每个空表分配表空间段,确保导出时被识别。

3️⃣ 修改 deferred_segment_creation 参数

3.1 查看当前参数状态

show parameter deferred_segment_creation;

📌 输出示例
NAME TYPE VALUE
deferred_segment_creation boolean TRUE

3.2 设置参数为 FALSE

默认情况下,新建空表不会分配空间。将其改为 FALSE,让空表自动分配空间:

alter system set deferred_segment_creation = false;

⚠️ 注意

  • 此命令需以 SYS 用户在 CMD 的 SQL*Plus 中执行,PLSQL 中可能无效。
  • 示例命令:
    sqlplus / as sysdba
    alter system set deferred_segment_creation = false;
    

4️⃣ 参数调整效果

  • 默认 (TRUE):空表不分配空间,导出时被跳过。
  • 调整为 FALSE:新建表即使为空也会分配空间,导出时包含空表。

🌟 建议:调整后对现有空表无效,需结合步骤 2 手动分配。


📦 导出验证

完成以上步骤后,使用 expexpdp 命令导出:

  • 传统导出
    exp username/password file=export.dmp
    
  • 数据泵导出
    expdp username/password directory=DATA_PUMP_DIR dumpfile=export.dmp
    

结果:空表将包含在 DMP 文件中。


🔍 使用技巧

  1. 动态生成脚本:步骤 1 可输出到文件,批量执行:
    spool fix_empty_tables.sql
    select 'alter table ' || table_name || ' allocate extent;' 
    from user_tables 
    where num_rows = 0;
    spool off
    @fix_empty_tables.sql
    
  2. 权限要求:修改参数需 DBA 权限,普通用户只能操作自己的表。
  3. 重启影响:参数修改是系统级,数据库重启后仍有效。
0

评论区