ORA-18008: cannot find OUTLN schema

本文提供了一个脚本,用于在Oracle 10.2环境中重新创建被意外删除的OUTLN用户及其相关表。此脚本必须由SYSDBA执行,并确保OUTLN账号被锁定。

今天在10g中不小心把OUTLN schema刪除了﹐導致不能執行SQL語句。錯誤如下

ERROR:
ORA-18008: cannot find OUTLN schema


Error accessing package DBMS_APPLICATION_INFO
SP2-0575: Use of Oracle SQL feature not in SQL92 Entry Level.

 

Script. to create user OUTLN in 10.2 [ID 422983.1]

 修改时间 24-NOV-2009     类型 SCRIPT     状态 PUBLISHED 

In this Document
  Purpose
  Software Requirements/Prerequisites
  Configuring the Script
  Running the Script
  Caution
  Script
  Script. Output
  References


Applies to:

Oracle Server - Enterprise Edition - Version: 10.2.0.1
Information in this document applies to any platform.
The scope of this document is for RDBMS release 10.2.X only.

Purpose

This script. is to create the OUTLN user in Oracle 10.2 if accidently dropped with CASCADE option.

See also note 240478.1 script. to create user OUTLN in 9i  for comparision, for Oracle 10.2, we add a new column hint_string clob to outln.ol$hints table  (this does not apply to 10.1) and NODE_NAME VARCHAR2(64) to OL$NODES.
 

Software Requirements/Prerequisites

Oracle 10.2

Configuring the Script

This script. MUST be run when connected AS SYSDBA. Make sure to lock the OUTLN account also.

Running the Script

Run the script.

Caution

This script. is provided for educational purposes only and not supported by Oracle Support Services. It has been tested internally, however, and works as documented. We do not guarantee that it will work for you, so be sure to test it in your environment before relying on it.

Proofread this script. before using it! Due to the differences in the way text editors, e-mail packages and operating systems handle text formatting (spaces, tabs and carriage returns), this script. may not be in an executable state when you first receive it. Check over the script. to ensure that errors of this type are corrected.

Script

set serveroutput on

DECLARE
user_exists EXCEPTION;
outln_user number;
outln_tables number;
extra_outln_tables number;
DDL_CURSOR integer;
BEGIN
select count(*) into outln_user from user$ where name='OUTLN';

select count(*) into outln_tables from obj$ where name in
('OL$', 'OL$HINTS','OL$NODES') and owner#=
(select user# from user$ where name='OUTLN');

select count(*) into extra_outln_tables from obj$ where name not in
('OL$', 'OL$HINTS','OL$NODES') and type#=2 and owner#=
(select user# from user$ where name='OUTLN');


DDL_CURSOR := dbms_sql.open_cursor;
IF outln_user = 0 THEN
dbms_sql.parse(DDL_CURSOR, 'create user outln identified by outln',
dbms_sql.native);
dbms_sql.parse(DDL_CURSOR,
'grant connect, resource, execute any procedure to outln',
dbms_sql.native);
dbms_sql.parse(DDL_CURSOR, 'create table outln.ol$ ( '||
'ol_name varchar2(30), ' ||
'sql_text long, ' ||
'textlen number, ' ||
'signature raw(16), ' ||
'hash_value number, ' ||
'hash_value2 number, ' ||
'category varchar2(30), ' ||
'version varchar2(64), ' ||
'creator varchar2(30), ' ||
'timestamp date, ' ||
'flags number, ' ||
'hintcount number, ' ||
'spare1 number, ' ||
'spare2 varchar2(1000))', dbms_sql.native);
dbms_sql.parse(DDL_CURSOR, 'create table outln.ol$hints ( '||
'ol_name varchar2(30), '||
'hint# number, '||
'category varchar2(30), '||
'hint_type number, '||
'hint_text varchar2(512), '||
'stage# number, '||
'node# number, '||
'table_name varchar2(30), '||
'table_tin number, '||
'table_pos number, '||
'ref_id number, '||
'user_table_name varchar2(64), '||
'cost FLOAT(126),'||
'cardinality FLOAT(126),'||
'bytes FLOAT(126),'||
'hint_textoff number, '||
'hint_textlen number,'||
'join_pred varchar2(2000),'||
'spare1 number, '||
'spare2 number, '||
'hint_string clob)', dbms_sql.native);
dbms_sql.parse(DDL_CURSOR, 'create table outln.ol$nodes ( '||
'ol_name varchar2(30), '||
'category varchar2(30), '||
'node_id number, '||
'parent_id number, '||
'node_type number, '||
'node_textlen number, '||
'node_textoff number, '||
'node_name varchar2(64))', dbms_sql.native);
dbms_sql.parse(DDL_CURSOR, 'create unique index outln.ol$name '||
'on outln.ol$(ol_name)', dbms_sql.native);
dbms_sql.parse(DDL_CURSOR, 'create unique index outln.ol$signature '||
' on outln.ol$(signature,category)', dbms_sql.native);
dbms_sql.parse(DDL_CURSOR, 'create unique index outln.ol$hnt_num '||
' on outln.ol$hints(ol_name, hint#)', dbms_sql.native);
dbms_output.put_line('OUTLN CREATION SUCCESSFUL');
ELSE
IF outln_tables!=3 or extra_outln_tables!=0 THEN
dbms_output.put_line('ERROR - OUTLN USER ALREADY EXISTS');
RAISE user_exists;
ELSE
dbms_output.put_line('OUTLN CREATION SUCCESSFUL');
END IF;
END IF;

EXCEPTION
WHEN user_exists THEN
RAISE;

END;
/

alter user outln account lock;


 

Script. Output


SQL> @cre_outln102
OUTLN CREATION SUCCESSFUL

PL/SQL procedure successfully completed.

References

NOTE:1071358.6 - What is the OUTLN User?
NOTE:240478.1 - Script. to create user OUTLN in 9i
NOTE:98572.1 - Script. to create user OUTLN in 8i
ORA-04063: view "SYS.USER_OUTLINE_HINTS" has errors

显示相关信息相关的


产品
  • Oracle Database Products > Oracle Database > Oracle Database > Oracle Server - Enterprise Edition
关键字
OUTLN; SYSDBA

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7608831/viewspace-681655/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7608831/viewspace-681655/

<think> 我们正在讨论Oracle Data Pump导入时遇到的错误代码。根据引用内容,用户遇到了ORA-39059和ORA-39246错误。让我们解释这两个错误的含义。 首先,回顾引用内容: - 引用[1]提到:导入多个dmp文件时出现ORA-39002(无效操作)、ORA-39059(转储文件集不完整)和ORA-39246(无法在提供的转储文件中定位主表)。 - 引用[2]提到:ORA-31644(无法定位到转储文件中的特定块号),这可能是文件损坏或读取问题。 - 引用[3]提到:用户尝试列出所有文件(用逗号分隔)来解决ORA-39059。 现在,解释错误代码: 1. **ORA-39059: dump file set is incomplete** 此错误表示Data Pump在导入时无法找到完整的转储文件集。Data Pump在导出时可能生成了多个转储文件(例如使用了`%U`通配符或`FILESIZE`参数分割文件),但在导入时没有提供全部文件。每个转储文件集都有一个主表(Master Table)来记录元数据,如果缺少任何文件,尤其是包含主表的文件,就会导致此错误。 2. **ORA-39246: cannot locate master table within provided dump files** 此错误是ORA-39059的具体原因:Data Pump无法在提供的转储文件中找到主表。主表是导出操作时创建的,存储在转储文件集中(通常位于第一个文件或最后一个文件,取决于导出顺序)。如果该文件缺失或损坏,导入将失败。 ### 原因分析 - **文件缺失**:导入命令未指定所有转储文件(例如,导出时生成了`file1.dmp`, `file2.dmp`,但导入时只指定了`file1.dmp`)。 - **文件损坏**:包含主表的转储文件损坏(如引用[2]的ORA-31644)。 - **路径错误**:`DIRECTORY`对象指向的路径不包含所有转储文件。 - **命名不匹配**:导入命令的`DUMPFILE`参数未正确匹配文件名(例如通配符`%U`未覆盖所有文件)。 ### 解决方法(基于引用[3]的经验) 1. **显式列出所有文件**:在`impdp`命令中用逗号分隔所有转储文件: ```sql impdp ... dumpfile=file1.dmp,file2.dmp,file3.dmp ... ``` 2. **检查文件完整性**: - 验证所有文件大小是否与导出时一致(引用[3]提到用户检查了文件大小和数量)。 - 使用`expdp`的`VALIDATE_DUMPFILE`选项(Oracle 12c+)检查损坏。 3. **确认目录权限**:确保`DIRECTORY`对象有读取权限。 4. **重新导出**:若文件损坏,需重新导出数据。 > **注意**:主表通常位于最后一个转储文件(除非使用`PARALLEL`导出,此时可能分散)。确保提供完整的文件集是解决ORA-39059/ORA-39246的关键[^1][^3]。 ### 相关问题 1. 如何正确导出Oracle Data Pump多文件集? 2. 导入时如何指定转储文件的通配符? 3. ORA-31644(转储文件块定位失败)如何修复? </think> ### ORA-39059 和 ORA-39246 错误详解 #### **1. ORA-39059: dump file set is incomplete(转储文件集不完整)** **含义**: 此错误表示 Oracle Data Pump(`impdp`)在导入时无法识别完整的转储文件集合。Data Pump 导出(`expdp`)时如果使用了多文件分割(如 `%U` 通配符或 `FILESIZE` 参数),所有文件必须作为一个**逻辑整体**被导入。错误通常发生在: - 缺少部分转储文件(如导出时生成 5 个文件但导入时只指定了 4 个) - 文件命名不规范导致自动匹配失败(如通配符 `%U` 无法覆盖所有文件) - 文件顺序错乱或元数据损坏(如主表文件丢失) **根本原因**: Data Pump 依赖**主表(Master Table)**记录所有文件的元数据和依赖关系。如果文件集不完整,主表无法构建完整的导入逻辑链[^1][^3]。 --- #### **2. ORA-39246: cannot locate master table within provided dump files(无法定位主表)** **含义**: 此错误是 ORA-39059 的子集,明确指示**主表文件缺失或损坏**。主表是 Data Pump 导出时自动创建的元数据表(存储在转储文件中),包含: - 所有对象的结构定义 - 文件分割信息 - 并行操作的协调数据 **触发场景**: 1. 未包含包含主表的文件(通常是导出时的第一个或最后一个文件) 2. 主表文件损坏(如传输中断、磁盘故障) 3. 跨平台导入时字节序不兼容(如 Linux 导出到 Windows 导入) > 数学关系:设转储文件集为 $F = \\{f_1, f_2, \dots, f_n\\}$,主表文件为 $f_m \in F$。若 $f_m \notin F_{\text{import}}$,则抛出 ORA-39246[^1]。 --- ### 解决方案总结(基于引用内容) 1. **显式列出所有文件**(引用[3]方案) 替换通配符为逗号分隔的完整文件列表: ```sql -- 错误方式(易触发ORA-39059) impdp ... dumpfile=card_trade_detail%U.dmpdp -- 正确方式 impdp ... dumpfile=file1.dmp,file2.dmp,file3.dmp ``` 2. **验证文件完整性** - 检查文件大小和数量是否与导出时一致(引用[3]) - 使用 `DBMS_DATAPUMP.GET_DUMPFILE_INFO` 验证元数据 3. **处理文件损坏**(引用[2]) 若报错 `ORA-31644: unable to position to block number...`,需重新导出损坏文件。 4. **确保目录权限** 确认 `DIRECTORY` 对象有权限读取**所有**文件: ```sql GRANT READ, WRITE ON DIRECTORY expdp_dir TO system; ``` --- ### 技术原理图解 ``` 导出过程: 导入过程: [expdp] → 生成主表 → 分割文件 [impdp] → 读取主表 → 重组数据 ↗ f1.dmp (含主表) ↗ 需所有文件 ↘ f2.dmp ↘ 缺失则报错 ``` > 主表(Master Table)是文件集的"索引",缺失则无法解析数据逻辑[^1][^3]。 --- ### 相关问题 1. 如何避免导出时生成不完整的转储文件集? 2. ORA-31644(转储文件块定位失败)如何修复? 3. Data Pump 多文件导入的最佳实践有哪些? 4. 主表损坏后能否手动重建? [^1]: 引用[1]和[3]描述了文件集不完整和主表丢失的场景 [^2]: 引用[2]展示了文件块损坏导致的类似错误 [^3]: 引用[3]提供显式列出文件的解决方案
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值