Skip to content

Oracle 常见错误码解析

生产场景案例

电商平台 ORA-01555 快照过旧问题

背景:某电商平台在夜间执行报表查询时,经常遇到 ORA-01555 快照过旧错误,导致报表生成失败,影响业务决策。

诊断过程

  1. 检查 undo 表空间使用情况,发现使用率经常达到 100%
  2. 查看 v$undostat 视图,发现 undo 保留时间设置为 900 秒,但报表查询需要 30 分钟以上
  3. 分析应用负载,发现夜间同时有大量批处理作业执行高并发 DML 操作

解决方案

  1. 增加 undo 表空间大小至 200GB
  2. 将 undo_retention 设置为 3600 秒(1 小时)
  3. 调整报表查询时间,避开批处理作业高峰期
  4. 优化报表查询,减少查询时间

结果:报表查询不再出现 ORA-01555 错误,生成时间从 45 分钟缩短至 15 分钟

金融系统 ORA-00060 死锁问题

背景:某金融系统在交易高峰期经常出现 ORA-00060 死锁错误,导致交易失败率上升,影响客户体验。

诊断过程

  1. 查看告警日志,发现死锁涉及两张核心交易表
  2. 分析 v$locked_object 和 v$session 视图,确定死锁的会话和 SQL
  3. 检查应用代码,发现两个不同的交易流程访问表的顺序不一致

解决方案

  1. 调整应用代码,确保所有交易流程访问表的顺序一致
  2. 为经常更新的列添加索引,减少锁持有时间
  3. 实现乐观锁机制,减少悲观锁的使用
  4. 配置死锁监控告警,及时发现和处理死锁

结果:死锁错误从每天 50+ 次减少至几乎为零,交易成功率提升至 99.99%

错误码分析方法论

错误诊断步骤

  1. 快速定位:从错误信息中提取关键信息,确定错误类型和影响范围
  2. 深入分析:使用 Oracle 诊断工具获取详细信息
  3. 根因定位:结合业务场景和系统状态,确定错误的根本原因
  4. 解决方案制定:根据根因制定针对性的解决方案
  5. 验证修复:实施解决方案后,验证错误是否彻底解决
  6. 预防措施:制定预防措施,避免类似错误再次发生

常用诊断工具

  • 告警日志:记录数据库的重要事件和错误信息
  • 跟踪文件:详细记录特定会话或进程的活动
  • ADRCI:管理和分析诊断数据
  • 动态性能视图:实时监控数据库状态
  • AWR/ASH 报告:分析数据库性能趋势和会话活动

常见错误码解析

ORA-00600:内部错误

错误描述:Oracle 数据库内部错误,通常表示数据库遇到了意外情况,是 Oracle 数据库中最严重的错误之一。

生产场景触发条件

  • 执行复杂的 SQL 语句或存储过程
  • 数据库软件存在缺陷
  • 硬件故障导致数据损坏
  • 内存配置不当或内存泄漏

详细诊断方法

  1. 查看告警日志获取完整的错误信息和跟踪文件路径
  2. 使用 ADRCI 工具查看相关事件和问题:
    bash
    adrci> SHOW INCIDENT
    adrci> SHOW PROBLEM
    adrci> SHOW TRACEFILES -PATTERN "ora_00600"
  3. 分析跟踪文件,记录错误代码和参数
  4. 使用 Oracle MOS 搜索匹配的错误模式和解决方案

解决方案

  • 应用最新的补丁集或 PSU
  • 恢复损坏的数据文件或表空间
  • 调整内存配置参数
  • 修正错误的 SQL 语句或存储过程
  • 如果问题持续,联系 Oracle 技术支持并提供诊断包

Oracle 19c vs 21c 差异

  • Oracle 19c:需要手动收集诊断信息并提交给 Oracle 支持
  • Oracle 21c:增强了自动诊断功能,能够自动收集错误信息并提供初步解决方案

ORA-01555:快照过旧

错误描述:查询无法在 undo 表空间中找到所需的旧版本数据,通常发生在长时间运行的查询中。

生产场景触发条件

  • 长时间运行的报表查询或批处理作业
  • 高并发 DML 操作
  • Undo 表空间不足或 undo_retention 设置过小

详细诊断方法

sql
-- 检查 undo 表空间大小和使用率
SELECT tablespace_name, 
       ROUND(SUM(bytes)/1024/1024, 2) total_mb, 
       ROUND(SUM(maxbytes)/1024/1024, 2) max_mb,
       ROUND((SUM(bytes)-SUM(free_bytes))/1024/1024, 2) used_mb,
       ROUND(SUM(free_bytes)/1024/1024, 2) free_mb
FROM (
  SELECT tablespace_name, bytes, maxbytes, 0 free_bytes
  FROM dba_data_files WHERE tablespace_name LIKE '%UNDO%'
  UNION ALL
  SELECT tablespace_name, 0 bytes, 0 maxbytes, bytes free_bytes
  FROM dba_free_space WHERE tablespace_name LIKE '%UNDO%'
) GROUP BY tablespace_name;

-- 检查 undo 保留时间和实际使用情况
SHOW PARAMETER undo_retention;
SELECT * FROM v$undostat WHERE end_time > SYSDATE - 1 ORDER BY end_time DESC;

-- 计算最佳 undo_retention 值
SELECT ROUND(MAX(maxquerylen) * 1.5) AS recommended_undo_retention FROM v$undostat;

解决方案

  1. 增加 undo 表空间大小

    sql
    ALTER TABLESPACE UNDOTBS1 ADD DATAFILE '/u01/app/oracle/oradata/ORCL/undotbs102.dbf' SIZE 50G AUTOEXTEND ON NEXT 10G MAXSIZE 200G;
  2. 调整 undo_retention 参数

    sql
    ALTER SYSTEM SET undo_retention = 3600 SCOPE=BOTH;
  3. 优化查询

    • 减少查询返回的行数
    • 使用并行查询
    • 优化执行计划
  4. 分离负载

    • 调整查询时间,避开高并发 DML 操作期
    • 考虑使用只读副本执行报表查询

Oracle 19c vs 21c 差异

  • Oracle 19c:需要手动计算和调整 undo_retention
  • Oracle 21c:新增了自动调整 undo_retention 的功能,能够根据实际负载动态调整

ORA-00060:死锁检测

错误描述:两个或多个事务相互等待对方持有的锁,导致事务无法继续执行。

生产场景触发条件

  • 应用程序设计不当,事务访问资源的顺序不一致
  • 缺少索引导致全表扫描,锁范围过大
  • 事务持有锁的时间过长
  • 高并发访问同一资源

详细诊断方法

  1. 实时查看死锁信息

    sql
    -- 查看当前阻塞会话
    SELECT sid, serial#, blocking_session, event, wait_class, seconds_in_wait
    FROM v$session WHERE blocking_session IS NOT NULL;
    
    -- 查看被锁对象
    SELECT l.session_id, s.serial#, s.username, s.program, o.object_name, l.locked_mode
    FROM v$locked_object l
    JOIN dba_objects o ON l.object_id = o.object_id
    JOIN v$session s ON l.session_id = s.sid;
  2. 分析死锁历史

    sql
    -- 查看死锁历史记录
    SELECT * FROM dba_hist_active_sess_history 
    WHERE event = 'enq: TX - row lock contention' 
    ORDER BY sample_time DESC;
  3. 生成死锁报告

    bash
    adrci> SHOW ALERT -PATTERN "Deadlock"
    adrci> SHOW TRACEFILES -PATTERN "deadlock"

解决方案

  1. 优化应用程序设计

    • 确保所有事务访问资源的顺序一致
    • 减少事务的粒度,缩短事务持有锁的时间
    • 使用 NOWAIT 或 WAIT 子句避免长时间等待
  2. 优化数据库设计

    • 为经常更新的列添加索引,减少锁范围
    • 考虑使用分区表,减少锁冲突
    • 实现乐观锁机制,减少悲观锁的使用
  3. 监控和告警

    • 配置死锁监控告警,及时发现和处理死锁
    • 定期分析死锁日志,找出频繁发生死锁的业务流程

Oracle 19c vs 21c 差异

  • Oracle 19c:死锁信息主要记录在告警日志和跟踪文件中
  • Oracle 21c:增强了死锁诊断功能,能够提供更详细的死锁信息和解决方案建议

ORA-04030:PGA 内存不足

错误描述:进程全局区 (PGA) 内存不足,无法分配所需的内存,通常发生在大型排序、哈希操作或并行查询中。

生产场景触发条件

  • PGA_AGGREGATE_TARGET 设置过小
  • 执行大型排序或哈希操作
  • 大量并行查询
  • 内存泄漏

详细诊断方法

  1. 检查 PGA 配置和使用情况

    sql
    SHOW PARAMETER pga_aggregate_target;
    SELECT * FROM v$pgastat;
  2. 查看当前使用大量 PGA 的会话

    sql
    SELECT sid, serial#, username, machine, program, 
           pga_used_mem/1024/1024 pga_used_mb, 
           pga_alloc_mem/1024/1024 pga_alloc_mb
    FROM v$process p
    JOIN v$session s ON p.addr = s.paddr
    WHERE pga_used_mem > 100*1024*1024 -- 大于 100MB
    ORDER BY pga_used_mb DESC;
  3. 分析导致 PGA 不足的 SQL

    sql
    SELECT sql_id, plan_hash_value, executions, 
           buffer_gets, disk_reads, cpu_time, elapsed_time,
           sorts, rows_processed
    FROM v$sql 
    WHERE buffer_gets > 1000000 
    ORDER BY sorts DESC;

解决方案

  1. 增加 PGA_AGGREGATE_TARGET 参数

    sql
    ALTER SYSTEM SET pga_aggregate_target = 4G SCOPE=BOTH;
  2. 优化查询

    • 减少排序和哈希操作
    • 优化执行计划
    • 减少并行度
  3. 监控和调优

    • 定期监控 PGA 使用情况
    • 识别和优化消耗大量 PGA 的 SQL
    • 考虑使用自动 PGA 管理

Oracle 19c vs 21c 差异

  • Oracle 19c:PGA 管理相对简单,主要依赖 PGA_AGGREGATE_TARGET
  • Oracle 21c:增强了 PGA 管理功能,能够更精细地控制和监控 PGA 使用

ORA-01652:临时表空间不足

错误描述:临时表空间不足,无法完成排序或哈希操作,通常发生在大型查询或并行操作中。

生产场景触发条件

  • 临时表空间太小
  • 执行大型排序或哈希操作
  • 大量并行查询
  • 临时段未释放

详细诊断方法

  1. 检查临时表空间大小和使用率

    sql
    SELECT tablespace_name, 
           ROUND(SUM(bytes)/1024/1024, 2) total_mb, 
           ROUND(SUM(maxbytes)/1024/1024, 2) max_mb
    FROM dba_temp_files 
    GROUP BY tablespace_name;
    
    SELECT * FROM v$temp_space_header;
  2. 查看当前使用临时表空间的会话

    sql
    SELECT s.sid, s.serial#, s.sql_id, s.username, s.machine, 
           t.temp_used_blocks*8/1024 temp_used_mb
    FROM v$session s
    JOIN v$sort_usage t ON s.addr = t.session_addr
    ORDER BY temp_used_mb DESC;

解决方案

  1. 增加临时表空间大小

    sql
    ALTER TABLESPACE temp ADD TEMPFILE '/u01/app/oracle/oradata/ORCL/temp02.dbf' 
    SIZE 50G AUTOEXTEND ON NEXT 10G MAXSIZE 200G;
  2. 优化查询

    • 减少排序和哈希操作
    • 优化执行计划
    • 减少并行度
  3. 管理临时段

    • 手动释放临时段:ALTER SYSTEM DEFINE TEMPORARY TABLESPACE temp;
    • 考虑使用多个临时表空间,实现负载均衡

Oracle 19c vs 21c 差异

  • Oracle 19c:临时表空间管理相对简单
  • Oracle 21c:新增了临时表空间组的功能,能够更好地管理多个临时表空间

ORA-01653:表空间不足

错误描述:表空间不足,无法扩展段,通常发生在数据增长过快或表空间配置不当的情况下。

生产场景触发条件

  • 表空间大小限制
  • 数据文件达到最大值
  • 自动扩展功能未启用
  • 磁盘空间不足

详细诊断方法

  1. 检查表空间大小和使用率

    sql
    SELECT tablespace_name, 
           ROUND(SUM(bytes)/1024/1024, 2) total_mb, 
           ROUND(SUM(bytes - free_bytes)/1024/1024, 2) used_mb, 
           ROUND(SUM(free_bytes)/1024/1024, 2) free_mb, 
           ROUND((SUM(free_bytes)/SUM(bytes))*100, 2) free_percent
    FROM (
      SELECT tablespace_name, bytes, 0 free_bytes
      FROM dba_data_files
      UNION ALL
      SELECT tablespace_name, 0 bytes, bytes free_bytes
      FROM dba_free_space
    ) 
    GROUP BY tablespace_name
    ORDER BY free_percent ASC;
  2. 检查数据文件的自动扩展设置

    sql
    SELECT name, autoextensible, bytes/1024/1024 current_mb, 
           maxbytes/1024/1024 max_mb
    FROM v$datafile
    WHERE tablespace_name = 'USERS';

解决方案

  1. 增加数据文件大小

    sql
    ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' 
    RESIZE 100G;
  2. 启用数据文件自动扩展

    sql
    ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' 
    AUTOEXTEND ON NEXT 10G MAXSIZE 200G;
  3. 添加新的数据文件

    sql
    ALTER TABLESPACE users ADD DATAFILE '/u01/app/oracle/oradata/ORCL/users02.dbf' 
    SIZE 50G AUTOEXTEND ON NEXT 10G MAXSIZE 200G;
  4. 清理表空间

    • 删除无用的表和索引
    • 归档历史数据
    • 考虑使用表空间压缩

Oracle 19c vs 21c 差异

  • Oracle 19c:需要手动管理表空间扩展
  • Oracle 21c:新增了自动表空间管理功能,能够根据实际需求自动扩展表空间

Oracle 19c vs 21c 错误处理差异

特性Oracle 19cOracle 21c
错误诊断基本的错误信息和跟踪文件增强的错误信息,包含更多上下文和建议
自动修复有限的自动修复能力,仅支持部分错误类型增强的自动修复功能,支持更多错误类型,能够自动回滚错误操作
错误日志传统的告警日志和跟踪文件,格式较为简单统一的日志格式,支持结构化查询,便于分析和监控
补丁管理传统的补丁应用方式,需要手动验证和回滚增强的补丁管理,支持滚动应用和自动回滚,减少 downtime
诊断工具基本的诊断工具集,如 ADRCI、TKPROF 等新增的 AI 驱动的诊断工具,能够自动分析错误并提供解决方案
错误预测新增的错误预测功能,能够基于机器学习预测潜在的错误
云集成有限的云集成能力增强的云集成,支持将错误信息自动发送到 OCI 诊断服务

常见问题(FAQ)

如何快速查找 Oracle 错误信息?

可以使用以下方法查找 Oracle 错误信息:

  1. 使用 oerr 命令行工具:oerr ora 00600
  2. 查看 Oracle 官方文档或 MOS (My Oracle Support)
  3. 查看数据库告警日志和跟踪文件
  4. 使用 ADRCI 工具分析诊断数据
  5. 搜索 Oracle 社区论坛和博客

如何处理 ORA-12541:TNS:无监听程序错误?

处理步骤:

  1. 检查监听器是否正在运行:lsnrctl status
  2. 如果监听器未运行,启动监听器:lsnrctl start
  3. 检查监听器配置文件:$ORACLE_HOME/network/admin/listener.ora
  4. 检查客户端连接字符串是否正确
  5. 检查防火墙设置,确保监听端口未被阻止

如何处理 ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务错误?

处理步骤:

  1. 检查监听器是否正在监听请求的服务:lsnrctl services
  2. 检查监听器配置文件中的服务配置
  3. 检查 tnsnames.ora 文件中的服务名称是否正确
  4. 重启监听器:lsnrctl reload
  5. 检查数据库实例是否正在运行:sqlplus / as sysdba "select status from v$instance;"

如何防止 ORA-04031:SGA 内存不足错误?

预防措施:

  1. 合理配置 SGA 各组件的大小,如 shared_pool_size、db_cache_size 等
  2. 启用自动内存管理:ALTER SYSTEM SET memory_target = 16G SCOPE=SPFILE;
  3. 优化 SQL 语句,减少硬解析和共享池使用
  4. 定期监控 SGA 使用情况,及时调整配置
  5. 考虑使用 Oracle 19c/21c 中的自动内存管理功能

如何处理 ORA-01031:权限不足错误?

处理步骤:

  1. 确认当前用户是否具有执行操作所需的权限
  2. 如果是应用用户,检查应用连接使用的用户和权限
  3. 授予缺少的权限:GRANT SELECT ON scott.emp TO hr;
  4. 检查角色和权限继承关系
  5. 考虑使用最小权限原则,只授予必要的权限

如何处理 ORA-01691:无法扩展 lob 段错误?

处理步骤:

  1. 检查 lob 段所在的表空间使用情况
  2. 增加表空间大小或添加新的数据文件
  3. 考虑将 lob 段迁移到单独的表空间
  4. 优化应用程序,减少 lob 数据的大小
  5. 考虑使用 lob 压缩

错误处理最佳实践

建立错误码知识库

  • 记录常见错误的处理方法和解决方案
  • 包括错误描述、诊断步骤、解决方案和预防措施
  • 定期更新知识库,添加新的错误类型和解决方案
  • 分享给团队成员,提高整体错误处理能力

定期分析告警日志

  • 配置告警日志自动分析工具,如 Enterprise Manager
  • 关注重复出现的错误,及时找出根本原因
  • 建立告警规则,及时通知相关人员
  • 定期生成告警日志分析报告,总结常见问题和趋势

应用最新的补丁集

  • 定期检查 Oracle 发布的补丁集和安全更新
  • 制定补丁应用计划,包括测试和回滚方案
  • 优先应用修复关键错误的补丁
  • 考虑使用 Oracle 21c 中的自动补丁管理功能

配置合适的资源大小

  • 根据实际负载配置内存、表空间和临时表空间大小
  • 启用自动扩展功能,避免资源不足错误
  • 定期监控资源使用情况,及时调整配置
  • 考虑使用 Oracle 19c/21c 中的自动资源管理功能

优化应用程序设计

  • 确保事务访问资源的顺序一致,避免死锁
  • 减少事务的粒度,缩短事务持有锁的时间
  • 使用适当的锁机制,如乐观锁或悲观锁
  • 优化 SQL 语句,减少资源消耗

建立完善的监控和告警机制

  • 监控数据库的关键指标,如 CPU、内存、I/O 等
  • 配置告警规则,及时发现和处理错误
  • 建立故障响应流程,明确责任人和处理步骤
  • 定期进行故障演练,提高团队的应急处理能力

定期备份数据库

  • 制定合理的备份策略,包括全量备份、增量备份和归档日志备份
  • 定期测试备份的可恢复性
  • 考虑使用 Oracle 19c/21c 中的备份优化功能
  • 建立灾难恢复计划,确保在发生严重错误时能够快速恢复

总结

Oracle 错误码是 DBA 日常运维工作中经常遇到的问题,掌握常见错误码的分析和处理方法,对于快速定位和解决数据库问题至关重要。

在实际生产环境中,DBA 应该:

  1. 建立完善的错误处理流程和知识库
  2. 定期分析告警日志,提前发现潜在问题
  3. 应用最新的补丁集,修复已知的错误
  4. 配置合适的资源大小,避免资源不足错误
  5. 优化应用程序设计,减少错误发生的可能性
  6. 建立完善的监控和告警机制,及时发现和处理错误
  7. 定期备份数据库,确保在发生严重错误时能够恢复

随着 Oracle 数据库版本的演进,错误处理功能也在不断增强,特别是 Oracle 21c 引入的 AI 驱动的诊断工具和错误预测功能,为 DBA 提供了更强大的错误处理能力。DBA 应该及时了解和掌握这些新功能,不断提高自己的错误处理水平,确保数据库系统的稳定运行。