EXP-00003 ORA-01455 EXP导出报错

本文介绍了解决Oracle导出时遇到的EXP-0003错误的方法,包括调整系统参数、查找未分配段的表及分区,并提供即时分配空间的策略。


最近客户那边自己自己用工具导出的时候,报错EXP-00003.

11g的一个新特性,在新建表的是,不会马上分配segment。 在exp导出时,未分配空间的表不会被导出。(此问题在oracle 11.0.2.0版本及以上已经得到修复)


1. alter system deferred_segment_creation=false ,并重启数据库才能生效。

这个参数默认的是true,英文字面意思大家都能理解。


2。第一步只是设置以后的表会建立segment ,现在需要找到以前已经建立同时也没有分配segment的表。


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


此外还要找到如果是分区表中的,没有分配segment的那个分区名。


select 'alter table '||table_name||' modify partition '||partition_name||' allocate extent;' from usr_tab_partitions;


3.同时也可以创建的时候 直接  create table XX segment creation immediate,强制分配空间。

<think>我们正在解决impdp导入时出现的ORA-39083错误。根据引用[1][2][3],该错误通常表示在创建对象时失败,可能由多种原因引起,如用户不存在、权限不足或对象引用问题等。下面将详细分析并给出解决方案。 ### 错误原因分析 ORA-39083错误通常伴随一个具体的底层错误(如ORA-01917、ORA-00942等),这些底层错误才是解决问题的关键。常见的根本原因包括: 1. **目标用户不存在**(如引用[2]中出现的ORA-01917错误) 2. **权限不足**(如缺少CREATE ANY INDEX等权限) 3. **对象引用问题**(如引用[3]中提到的模式引用错误) 4. **表空间不存在或配额不足** 5. **对象已存在且未指定覆盖选项** ### 解决方案步骤 #### 1. 检查日志确定具体错误 ORA-39083是一个通用错误,必须查看其后的具体错误代码(如ORA-01917)才能定位问题。在impdp日志中查找类似以下内容: ```log ORA-39083: Object type SYSTEM_GRANT failed to create with error: ORA-01917: user or role 'C##DCPS' does not exist ``` #### 2. 根据具体错误代码处理 **情况1:用户不存在(ORA-01917)** - 在目标库创建缺失用户: ```sql CREATE USER c##dcps IDENTIFIED BY <password>; GRANT CONNECT, RESOURCE TO c##dcps; ``` - 如果不需要该用户,可跳过相关对象导入: ```bash impdp ... EXCLUDE=SYSTEM_GRANT ``` **情况2:权限不足(如ORA-01031)** - 授予所需权限(需DBA执行): ```sql GRANT IMP_FULL_DATABASE TO imp_user; -- 推荐 -- 或单独授权 GRANT CREATE ANY INDEX, CREATE ANY TRIGGER TO imp_user; ``` **情况3:对象引用问题(如ORA-00942)** - 使用`REMAP_SCHEMA`重映射引用: ```bash impdp ... REMAP_SCHEMA=old_user:new_user ``` - 若引用对象不在导入范围内,需先在目标库创建 **情况4:表空间问题** - 创建缺失表空间: ```sql CREATE TABLESPACE tbs_data DATAFILE '/path/to/file.dbf' SIZE 1G; ``` - 授予用户配额: ```sql ALTER USER target_user QUOTA UNLIMITED ON tbs_data; ``` **情况5:对象已存在** - 添加覆盖选项: ```bash impdp ... TABLE_EXISTS_ACTION=REPLACE # 或TRUNCATE/APPEND ``` #### 3. 分阶段导入(复杂情况) 当错误较多时,建议分阶段导入: ```bash # 阶段1:仅导入元数据并生成SQL impdp system/pwd DIRECTORY=dpump DUMPFILE=exp.dmp SQLFILE=ddl.sql CONTENT=METADATA_ONLY # 手动修改ddl.sql中的问题语句 # 阶段2:执行修正后的DDL sqlplus target_user/pwd @ddl.sql # 阶段3:仅导入数据 impdp system/pwd DIRECTORY=dpump DUMPFILE=exp.dmp CONTENT=DATA_ONLY ``` #### 4. 使用EXCLUDE/INCLUDE过滤对象 若某些对象非必需,可跳过: ```bash # 跳过系统权限导入 impdp ... EXCLUDE=SYSTEM_GRANT # 跳过特定表 impdp ... EXCLUDE=TABLE:\"IN \(\'EMP\',\'DEPT\'\)\" ``` ### 完整示例命令 ```bash impdp system/oracle@pdborcl \ DIRECTORY=dpump_dir \ DUMPFILE=full_db.dmp \ LOGFILE=imp_full.log \ REMAP_SCHEMA=src_user:tgt_user \ REMAP_TABLESPACE=src_tbs:tgt_tbs \ TABLE_EXISTS_ACTION=REPLACE \ EXCLUDE=STATISTICS \ TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y \ PARALLEL=4 ``` > **关键提示**:若引用[3]中提到的模式重映射问题无法解决,可尝试使用`METADATA_TRANSFORM`参数自动修改DDL中的schema引用(需12c以上版本): > ```bash > impdp ... METADATA_TRANSFORM=REMAP_SCHEMA:old:new > ``` §§相关问题§§ 1. 如何批量创建impdp日志中报错的缺失用户? 2. 如何安全跳过impdp中的所有权限导入? 3. 分阶段导入时如何确保数据一致性? 4. Oracle 12c的`METADATA_TRANSFORM`参数有哪些高级用法? [^1]: ORA-39083与权限问题的关联分析 [^2]: 用户不存在错误的典型处理流程 [^3]: 复杂模式映射的解决方案</think>### 解决 impdp ORA-39083 错误的完整方案 #### 错误本质分析 ORA-39083 表示对象创建失败,**核心问题在于底层错误**(如 ORA-01917、ORA-00942 等)。根据引用[1][2][3],常见原因包括: 1. **用户/角色不存在**(ORA-01917) 2. **权限不足**(如缺少 CREATE ANY INDEX 权限) 3. **对象引用问题**(如跨 schema 依赖) 4. **表空间配额不足** 5. **对象已存在但未处理** --- ### 分步解决方案 #### 1. 定位根本原因(关键步骤) 在 impdp 日志中查找 **ORA-39083 后的具体错误代码**: ```log ORA-39083: Object type SYSTEM_GRANT failed to create with error: ORA-01917: user or role 'C##DCPS' does not exist <-- 这才是真实原因 ``` #### 2. 按错误类型处理 **场景1:用户/角色不存在(ORA-01917)** ```sql -- 创建缺失用户(引用[2]案例) CREATE USER c##dcps IDENTIFIED BY <password>; GRANT CONNECT, RESOURCE TO c##dcps; -- 或跳过无关对象 impdp ... EXCLUDE=SYSTEM_GRANT ``` **场景2:权限不足** ```sql -- 授予完整权限包(推荐) GRANT IMP_FULL_DATABASE TO 导入用户; -- 或单独授权 GRANT CREATE ANY INDEX, CREATE ANY TRIGGER TO 导入用户; ``` **场景3:跨 schema 依赖(引用[3])** ```bash # 先导出DDL检查依赖 impdp system/pwd DIRECTORY=dpump DUMPFILE=exp.dmp SQLFILE=ddl.sql # 手动修改ddl.sql中的schema引用后执行 sqlplus /nolog @ddl.sql ``` **场景4:表空间问题** ```sql -- 检查配额 SELECT * FROM dba_ts_quotas WHERE username='目标用户'; -- 授予配额 ALTER USER 目标用户 QUOTA UNLIMITED ON 表空间名; ``` **场景5:对象已存在** ```bash impdp ... TABLE_EXISTS_ACTION=REPLACE # 覆盖 impdp ... TABLE_EXISTS_ACTION=APPEND # 追加数据 ``` #### 3. 高级处理技巧 **方法1:元数据重映射(12c+)** ```bash impdp ... METADATA_TRANSFORM=REMAP_SCHEMA:old_user:new_user ``` **方法2:分阶段导入** ```bash # 先导结构 impdp ... CONTENT=METADATA_ONLY # 修复错误后导数据 impdp ... CONTENT=DATA_ONLY ``` **方法3:排除问题对象** ```bash impdp ... EXCLUDE=OBJECT_GRANT,INDEX_STATISTICS ``` --- ### 完整修复命令示例 ```bash impdp system/oracle@orcl \ DIRECTORY=DPUMP_DIR \ DUMPFILE=exp_full.dmp \ LOGFILE=imp_repair.log \ REMAP_SCHEMA=SRC_USER:TGT_USER \ TABLE_EXISTS_ACTION=REPLACE \ EXCLUDE=SYSTEM_GRANT \ PARALLEL=4 \ METADATA_TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y ``` > **关键提示**: > - 99% 的 ORA-39083 需通过日志定位**次级错误代码**解决 > - 使用 `TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y` 可加速导入[^1] > - 生产环境建议先做 `SQLFILE=ddl.sql` 预检查[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方-phantom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值