位置: 文档库 > 数据库 > Oracle教程:EXP-00091 Exporting questionable statistics错误

Oracle教程:EXP-00091 Exporting questionable statistics错误

宁桓宇 上传于 2023-01-21 08:19

《Oracle教程:EXP-00091 Exporting questionable statistics错误解析与解决方案》

在Oracle数据库的导出(Export)操作中,EXP-00091错误(Exporting questionable statistics)是一个常见但容易被忽视的问题。该错误通常出现在使用传统EXP工具(而非数据泵Data Pump)执行导出任务时,表明系统在收集或导出统计信息过程中遇到了异常。本文将深入探讨该错误的成因、影响及解决方案,帮助数据库管理员(DBA)高效处理此类问题。

一、错误背景与表现

EXP-00091错误的核心提示为“Exporting questionable statistics”,其完整错误信息可能包含以下内容:

EXP-00091: Exporting questionable statistics.
EXP-00000: Export terminated unsuccessfully

该错误通常发生在以下场景:

  • 使用EXP工具导出包含统计信息的表或索引
  • 数据库版本与EXP工具版本不兼容
  • 统计信息收集过程中存在异常(如权限不足、表空间问题等)
  • 导出参数中显式或隐式启用了统计信息导出(如STATISTICS选项)

二、错误成因分析

EXP-00091错误的根本原因通常与统计信息的收集和导出机制有关,具体可分为以下几类:

1. 统计信息收集异常

Oracle在导出时会尝试收集对象的统计信息(如表、索引的行数、块数等)。若以下情况发生,可能导致统计信息不可靠:

  • 用户缺乏DBMS_STATS包或V$视图(如V$SEGMENT_STATISTICS)的查询权限
  • 表空间或数据文件处于离线状态,导致无法获取准确的存储信息
  • 统计信息过旧或被手动锁定(如通过DBMS_STATS.LOCK_TABLE_STATS)

2. 工具版本不兼容

EXP工具是Oracle 9i及之前版本的主要导出工具,而后续版本推荐使用数据泵(expdp)。若在高版本数据库中使用旧版EXP工具,可能因统计信息格式变化导致导出失败。例如:

# 错误示例:在Oracle 19c中使用Oracle 10g的EXP工具
$ exp username/password@19c_db file=export.dmp statistics=ALL

3. 参数配置问题

EXP工具的STATISTICS参数控制统计信息的导出行为,其可选值包括:

  • NONE:不导出统计信息(默认值)
  • TYPICAL:导出基本统计信息(推荐)
  • ALL:导出所有统计信息(可能触发EXP-00091)

若显式设置STATISTICS=ALL且数据库环境存在问题,则极易触发错误。

4. 数据库对象状态异常

以下对象状态可能导致统计信息收集失败:

  • 表处于只读模式(READ ONLY)
  • 索引处于无效状态(UNUSABLE)
  • 分区表的部分分区不可访问

三、解决方案与最佳实践

针对EXP-00091错误,可采取以下措施进行排查和修复:

1. 调整STATISTICS参数

最直接的解决方案是修改EXP命令的STATISTICS参数,避免导出全部统计信息:

# 推荐方案:使用TYPICAL(默认)或NONE
exp username/password@db file=export.dmp statistics=TYPICAL

若必须导出统计信息,可尝试分步操作:先以STATISTICS=NONE导出数据,再通过DBMS_STATS单独收集统计信息。

2. 验证用户权限

确保执行导出的用户具备以下权限:

  • EXP_FULL_DATABASE角色(全库导出)
  • SELECT权限于DBMS_STATS相关视图
  • 对目标表的SELECT、INDEX、TABLE等权限

可通过以下SQL验证权限:

SELECT * FROM dba_sys_privs WHERE grantee = 'USERNAME';
SELECT * FROM dba_role_privs WHERE grantee = 'USERNAME';

3. 检查数据库对象状态

执行导出前,需确认所有相关对象处于正常状态:

-- 检查无效索引
SELECT owner, index_name, status FROM dba_indexes WHERE status != 'VALID';

-- 检查只读表
SELECT owner, table_name FROM dba_tables WHERE read_only = 'YES';

对于无效索引,可通过重建索引修复:

ALTER INDEX owner.index_name REBUILD;

4. 使用数据泵替代EXP

Oracle官方已停止维护EXP工具,推荐使用数据泵(expdp)进行导出。数据泵对统计信息的处理更稳定,且支持并行操作:

expdp username/password@db directory=DATA_PUMP_DIR dumpfile=export.dmp 
       statistics=ALL logfile=export.log

数据泵的优势包括:

  • 更好的兼容性(支持11g及以上版本)
  • 更高效的统计信息处理
  • 支持网络导出(无需本地文件系统)

5. 收集并分析跟踪文件

若错误持续出现,可启用EXP工具的跟踪功能生成详细日志:

exp username/password@db file=export.dmp trace=TRACE_FILE.trc

跟踪文件中可能包含以下关键信息:

  • ORA-开头的数据库错误(如ORA-01555、ORA-00942)
  • 统计信息收集过程中的具体失败对象
  • 权限检查失败的详细记录

6. 临时禁用统计信息导出

在紧急情况下,可通过以下方式完全禁用统计信息导出

  • 设置STATISTICS=NONE
  • 使用参数文件(parfile)指定参数,避免命令行直接暴露敏感信息

示例参数文件(export.par):

userid=username/password@db
file=export.dmp
statistics=NONE
log=export.log

执行命令:

exp parfile=export.par

四、预防措施与长期建议

为避免EXP-00091错误的重复出现,建议采取以下预防措施:

1. 迁移至数据泵

彻底淘汰EXP工具,使用数据泵(expdp/impdp)作为默认的导出导入方案。数据泵的架构更现代,且Oracle持续提供技术支持。

2. 定期更新统计信息

通过DBMS_STATS包定期收集统计信息,避免导出时临时收集导致的性能问题:

BEGIN
  DBMS_STATS.GATHER_SCHEMA_STATS(
    ownname          => 'SCHEMA_NAME',
    estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
    method_opt       => 'FOR ALL COLUMNS SIZE AUTO',
    degree           => DBMS_STATS.AUTO_DEGREE
  );
END;

3. 建立标准化导出流程

制定企业级的导出规范,明确以下内容:

  • 使用的工具版本(如仅允许数据泵)
  • 参数配置模板(如默认STATISTICS=TYPICAL)
  • 异常处理流程(如跟踪文件分析步骤)

4. 监控数据库对象状态

通过定时任务检查数据库中的无效对象或只读表,并设置告警机制。示例监控脚本:

-- 每日检查无效索引
SELECT owner, index_name, table_name 
FROM dba_indexes 
WHERE status != 'VALID' AND owner NOT IN ('SYS','SYSTEM');

-- 每周检查只读表
SELECT owner, table_name 
FROM dba_tables 
WHERE read_only = 'YES' AND temporary = 'N';

五、案例分析:真实场景中的EXP-00091

以下是一个典型案例的复现与解决过程:

案例背景

某金融企业使用Oracle 12c数据库,需导出HR模式下的所有对象。DBA执行以下命令:

exp hr/hr@orcl file=hr_export.dmp owner=HR statistics=ALL

导出过程中报错:

EXP-00091: Exporting questionable statistics.
EXP-00000: Export terminated unsuccessfully

排查步骤

1. 检查跟踪文件(exp_hr.trc),发现以下错误:

ORA-00942: table or view does not exist
ORA-06512: at "SYS.DBMS_STATS", line 12345

2. 验证HR用户权限,发现其缺乏对SYS.DBMS_STATS包的EXECUTE权限。

解决方案

1. 授予HR用户必要权限:

GRANT EXECUTE ON DBMS_STATS TO hr;

2. 修改导出命令,降低统计信息级别:

exp hr/hr@orcl file=hr_export.dmp owner=HR statistics=TYPICAL

3. 替代方案:使用数据泵完成导出:

expdp hr/hr@orcl directory=DATA_PUMP_DIR dumpfile=hr_export.dmp 
       schemas=HR statistics=ALL

六、总结与展望

EXP-00091错误本质上是Oracle传统导出工具在统计信息处理上的局限性体现。随着数据库版本的演进,该问题的最佳解决方案是全面迁移至数据泵。对于仍需使用EXP工具的环境,通过调整参数、验证权限和监控对象状态可有效降低错误发生率。

未来,随着Oracle自动化管理工具(如Oracle Autonomous Database)的普及,手动导出操作将进一步减少。但理解EXP-00091等经典错误的成因与解决方案,仍有助于DBA深入掌握Oracle的统计信息机制与导出导入原理。

关键词:Oracle、EXP-00091错误、统计信息导出、EXP工具、数据泵、DBMS_STATS、权限管理、数据库对象状态

简介:本文详细解析Oracle导出过程中EXP-00091错误的成因,包括统计信息收集异常、工具版本不兼容、参数配置问题等,提供调整参数、验证权限、使用数据泵等解决方案,并给出预防措施与真实案例分析,帮助DBA高效处理此类问题。