外观
Oracle 常见错误码解析
生产场景案例
电商平台 ORA-01555 快照过旧问题
背景:某电商平台在夜间执行报表查询时,经常遇到 ORA-01555 快照过旧错误,导致报表生成失败,影响业务决策。
诊断过程:
- 检查 undo 表空间使用情况,发现使用率经常达到 100%
- 查看 v$undostat 视图,发现 undo 保留时间设置为 900 秒,但报表查询需要 30 分钟以上
- 分析应用负载,发现夜间同时有大量批处理作业执行高并发 DML 操作
解决方案:
- 增加 undo 表空间大小至 200GB
- 将 undo_retention 设置为 3600 秒(1 小时)
- 调整报表查询时间,避开批处理作业高峰期
- 优化报表查询,减少查询时间
结果:报表查询不再出现 ORA-01555 错误,生成时间从 45 分钟缩短至 15 分钟
金融系统 ORA-00060 死锁问题
背景:某金融系统在交易高峰期经常出现 ORA-00060 死锁错误,导致交易失败率上升,影响客户体验。
诊断过程:
- 查看告警日志,发现死锁涉及两张核心交易表
- 分析 v$locked_object 和 v$session 视图,确定死锁的会话和 SQL
- 检查应用代码,发现两个不同的交易流程访问表的顺序不一致
解决方案:
- 调整应用代码,确保所有交易流程访问表的顺序一致
- 为经常更新的列添加索引,减少锁持有时间
- 实现乐观锁机制,减少悲观锁的使用
- 配置死锁监控告警,及时发现和处理死锁
结果:死锁错误从每天 50+ 次减少至几乎为零,交易成功率提升至 99.99%
错误码分析方法论
错误诊断步骤
- 快速定位:从错误信息中提取关键信息,确定错误类型和影响范围
- 深入分析:使用 Oracle 诊断工具获取详细信息
- 根因定位:结合业务场景和系统状态,确定错误的根本原因
- 解决方案制定:根据根因制定针对性的解决方案
- 验证修复:实施解决方案后,验证错误是否彻底解决
- 预防措施:制定预防措施,避免类似错误再次发生
常用诊断工具
- 告警日志:记录数据库的重要事件和错误信息
- 跟踪文件:详细记录特定会话或进程的活动
- ADRCI:管理和分析诊断数据
- 动态性能视图:实时监控数据库状态
- AWR/ASH 报告:分析数据库性能趋势和会话活动
常见错误码解析
ORA-00600:内部错误
错误描述:Oracle 数据库内部错误,通常表示数据库遇到了意外情况,是 Oracle 数据库中最严重的错误之一。
生产场景触发条件:
- 执行复杂的 SQL 语句或存储过程
- 数据库软件存在缺陷
- 硬件故障导致数据损坏
- 内存配置不当或内存泄漏
详细诊断方法:
- 查看告警日志获取完整的错误信息和跟踪文件路径
- 使用 ADRCI 工具查看相关事件和问题:bash
adrci> SHOW INCIDENT adrci> SHOW PROBLEM adrci> SHOW TRACEFILES -PATTERN "ora_00600" - 分析跟踪文件,记录错误代码和参数
- 使用 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;解决方案:
增加 undo 表空间大小:
sqlALTER TABLESPACE UNDOTBS1 ADD DATAFILE '/u01/app/oracle/oradata/ORCL/undotbs102.dbf' SIZE 50G AUTOEXTEND ON NEXT 10G MAXSIZE 200G;调整 undo_retention 参数:
sqlALTER SYSTEM SET undo_retention = 3600 SCOPE=BOTH;优化查询:
- 减少查询返回的行数
- 使用并行查询
- 优化执行计划
分离负载:
- 调整查询时间,避开高并发 DML 操作期
- 考虑使用只读副本执行报表查询
Oracle 19c vs 21c 差异:
- Oracle 19c:需要手动计算和调整 undo_retention
- Oracle 21c:新增了自动调整 undo_retention 的功能,能够根据实际负载动态调整
ORA-00060:死锁检测
错误描述:两个或多个事务相互等待对方持有的锁,导致事务无法继续执行。
生产场景触发条件:
- 应用程序设计不当,事务访问资源的顺序不一致
- 缺少索引导致全表扫描,锁范围过大
- 事务持有锁的时间过长
- 高并发访问同一资源
详细诊断方法:
实时查看死锁信息:
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;分析死锁历史:
sql-- 查看死锁历史记录 SELECT * FROM dba_hist_active_sess_history WHERE event = 'enq: TX - row lock contention' ORDER BY sample_time DESC;生成死锁报告:
bashadrci> SHOW ALERT -PATTERN "Deadlock" adrci> SHOW TRACEFILES -PATTERN "deadlock"
解决方案:
优化应用程序设计:
- 确保所有事务访问资源的顺序一致
- 减少事务的粒度,缩短事务持有锁的时间
- 使用 NOWAIT 或 WAIT 子句避免长时间等待
优化数据库设计:
- 为经常更新的列添加索引,减少锁范围
- 考虑使用分区表,减少锁冲突
- 实现乐观锁机制,减少悲观锁的使用
监控和告警:
- 配置死锁监控告警,及时发现和处理死锁
- 定期分析死锁日志,找出频繁发生死锁的业务流程
Oracle 19c vs 21c 差异:
- Oracle 19c:死锁信息主要记录在告警日志和跟踪文件中
- Oracle 21c:增强了死锁诊断功能,能够提供更详细的死锁信息和解决方案建议
ORA-04030:PGA 内存不足
错误描述:进程全局区 (PGA) 内存不足,无法分配所需的内存,通常发生在大型排序、哈希操作或并行查询中。
生产场景触发条件:
- PGA_AGGREGATE_TARGET 设置过小
- 执行大型排序或哈希操作
- 大量并行查询
- 内存泄漏
详细诊断方法:
检查 PGA 配置和使用情况:
sqlSHOW PARAMETER pga_aggregate_target; SELECT * FROM v$pgastat;查看当前使用大量 PGA 的会话:
sqlSELECT 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;分析导致 PGA 不足的 SQL:
sqlSELECT 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;
解决方案:
增加 PGA_AGGREGATE_TARGET 参数:
sqlALTER SYSTEM SET pga_aggregate_target = 4G SCOPE=BOTH;优化查询:
- 减少排序和哈希操作
- 优化执行计划
- 减少并行度
监控和调优:
- 定期监控 PGA 使用情况
- 识别和优化消耗大量 PGA 的 SQL
- 考虑使用自动 PGA 管理
Oracle 19c vs 21c 差异:
- Oracle 19c:PGA 管理相对简单,主要依赖 PGA_AGGREGATE_TARGET
- Oracle 21c:增强了 PGA 管理功能,能够更精细地控制和监控 PGA 使用
ORA-01652:临时表空间不足
错误描述:临时表空间不足,无法完成排序或哈希操作,通常发生在大型查询或并行操作中。
生产场景触发条件:
- 临时表空间太小
- 执行大型排序或哈希操作
- 大量并行查询
- 临时段未释放
详细诊断方法:
检查临时表空间大小和使用率:
sqlSELECT 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;查看当前使用临时表空间的会话:
sqlSELECT 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;
解决方案:
增加临时表空间大小:
sqlALTER TABLESPACE temp ADD TEMPFILE '/u01/app/oracle/oradata/ORCL/temp02.dbf' SIZE 50G AUTOEXTEND ON NEXT 10G MAXSIZE 200G;优化查询:
- 减少排序和哈希操作
- 优化执行计划
- 减少并行度
管理临时段:
- 手动释放临时段:
ALTER SYSTEM DEFINE TEMPORARY TABLESPACE temp; - 考虑使用多个临时表空间,实现负载均衡
- 手动释放临时段:
Oracle 19c vs 21c 差异:
- Oracle 19c:临时表空间管理相对简单
- Oracle 21c:新增了临时表空间组的功能,能够更好地管理多个临时表空间
ORA-01653:表空间不足
错误描述:表空间不足,无法扩展段,通常发生在数据增长过快或表空间配置不当的情况下。
生产场景触发条件:
- 表空间大小限制
- 数据文件达到最大值
- 自动扩展功能未启用
- 磁盘空间不足
详细诊断方法:
检查表空间大小和使用率:
sqlSELECT 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;检查数据文件的自动扩展设置:
sqlSELECT name, autoextensible, bytes/1024/1024 current_mb, maxbytes/1024/1024 max_mb FROM v$datafile WHERE tablespace_name = 'USERS';
解决方案:
增加数据文件大小:
sqlALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' RESIZE 100G;启用数据文件自动扩展:
sqlALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' AUTOEXTEND ON NEXT 10G MAXSIZE 200G;添加新的数据文件:
sqlALTER TABLESPACE users ADD DATAFILE '/u01/app/oracle/oradata/ORCL/users02.dbf' SIZE 50G AUTOEXTEND ON NEXT 10G MAXSIZE 200G;清理表空间:
- 删除无用的表和索引
- 归档历史数据
- 考虑使用表空间压缩
Oracle 19c vs 21c 差异:
- Oracle 19c:需要手动管理表空间扩展
- Oracle 21c:新增了自动表空间管理功能,能够根据实际需求自动扩展表空间
Oracle 19c vs 21c 错误处理差异
| 特性 | Oracle 19c | Oracle 21c |
|---|---|---|
| 错误诊断 | 基本的错误信息和跟踪文件 | 增强的错误信息,包含更多上下文和建议 |
| 自动修复 | 有限的自动修复能力,仅支持部分错误类型 | 增强的自动修复功能,支持更多错误类型,能够自动回滚错误操作 |
| 错误日志 | 传统的告警日志和跟踪文件,格式较为简单 | 统一的日志格式,支持结构化查询,便于分析和监控 |
| 补丁管理 | 传统的补丁应用方式,需要手动验证和回滚 | 增强的补丁管理,支持滚动应用和自动回滚,减少 downtime |
| 诊断工具 | 基本的诊断工具集,如 ADRCI、TKPROF 等 | 新增的 AI 驱动的诊断工具,能够自动分析错误并提供解决方案 |
| 错误预测 | 无 | 新增的错误预测功能,能够基于机器学习预测潜在的错误 |
| 云集成 | 有限的云集成能力 | 增强的云集成,支持将错误信息自动发送到 OCI 诊断服务 |
常见问题(FAQ)
如何快速查找 Oracle 错误信息?
可以使用以下方法查找 Oracle 错误信息:
- 使用
oerr命令行工具:oerr ora 00600 - 查看 Oracle 官方文档或 MOS (My Oracle Support)
- 查看数据库告警日志和跟踪文件
- 使用 ADRCI 工具分析诊断数据
- 搜索 Oracle 社区论坛和博客
如何处理 ORA-12541:TNS:无监听程序错误?
处理步骤:
- 检查监听器是否正在运行:
lsnrctl status - 如果监听器未运行,启动监听器:
lsnrctl start - 检查监听器配置文件:
$ORACLE_HOME/network/admin/listener.ora - 检查客户端连接字符串是否正确
- 检查防火墙设置,确保监听端口未被阻止
如何处理 ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务错误?
处理步骤:
- 检查监听器是否正在监听请求的服务:
lsnrctl services - 检查监听器配置文件中的服务配置
- 检查 tnsnames.ora 文件中的服务名称是否正确
- 重启监听器:
lsnrctl reload - 检查数据库实例是否正在运行:
sqlplus / as sysdba "select status from v$instance;"
如何防止 ORA-04031:SGA 内存不足错误?
预防措施:
- 合理配置 SGA 各组件的大小,如 shared_pool_size、db_cache_size 等
- 启用自动内存管理:
ALTER SYSTEM SET memory_target = 16G SCOPE=SPFILE; - 优化 SQL 语句,减少硬解析和共享池使用
- 定期监控 SGA 使用情况,及时调整配置
- 考虑使用 Oracle 19c/21c 中的自动内存管理功能
如何处理 ORA-01031:权限不足错误?
处理步骤:
- 确认当前用户是否具有执行操作所需的权限
- 如果是应用用户,检查应用连接使用的用户和权限
- 授予缺少的权限:
GRANT SELECT ON scott.emp TO hr; - 检查角色和权限继承关系
- 考虑使用最小权限原则,只授予必要的权限
如何处理 ORA-01691:无法扩展 lob 段错误?
处理步骤:
- 检查 lob 段所在的表空间使用情况
- 增加表空间大小或添加新的数据文件
- 考虑将 lob 段迁移到单独的表空间
- 优化应用程序,减少 lob 数据的大小
- 考虑使用 lob 压缩
错误处理最佳实践
建立错误码知识库
- 记录常见错误的处理方法和解决方案
- 包括错误描述、诊断步骤、解决方案和预防措施
- 定期更新知识库,添加新的错误类型和解决方案
- 分享给团队成员,提高整体错误处理能力
定期分析告警日志
- 配置告警日志自动分析工具,如 Enterprise Manager
- 关注重复出现的错误,及时找出根本原因
- 建立告警规则,及时通知相关人员
- 定期生成告警日志分析报告,总结常见问题和趋势
应用最新的补丁集
- 定期检查 Oracle 发布的补丁集和安全更新
- 制定补丁应用计划,包括测试和回滚方案
- 优先应用修复关键错误的补丁
- 考虑使用 Oracle 21c 中的自动补丁管理功能
配置合适的资源大小
- 根据实际负载配置内存、表空间和临时表空间大小
- 启用自动扩展功能,避免资源不足错误
- 定期监控资源使用情况,及时调整配置
- 考虑使用 Oracle 19c/21c 中的自动资源管理功能
优化应用程序设计
- 确保事务访问资源的顺序一致,避免死锁
- 减少事务的粒度,缩短事务持有锁的时间
- 使用适当的锁机制,如乐观锁或悲观锁
- 优化 SQL 语句,减少资源消耗
建立完善的监控和告警机制
- 监控数据库的关键指标,如 CPU、内存、I/O 等
- 配置告警规则,及时发现和处理错误
- 建立故障响应流程,明确责任人和处理步骤
- 定期进行故障演练,提高团队的应急处理能力
定期备份数据库
- 制定合理的备份策略,包括全量备份、增量备份和归档日志备份
- 定期测试备份的可恢复性
- 考虑使用 Oracle 19c/21c 中的备份优化功能
- 建立灾难恢复计划,确保在发生严重错误时能够快速恢复
总结
Oracle 错误码是 DBA 日常运维工作中经常遇到的问题,掌握常见错误码的分析和处理方法,对于快速定位和解决数据库问题至关重要。
在实际生产环境中,DBA 应该:
- 建立完善的错误处理流程和知识库
- 定期分析告警日志,提前发现潜在问题
- 应用最新的补丁集,修复已知的错误
- 配置合适的资源大小,避免资源不足错误
- 优化应用程序设计,减少错误发生的可能性
- 建立完善的监控和告警机制,及时发现和处理错误
- 定期备份数据库,确保在发生严重错误时能够恢复
随着 Oracle 数据库版本的演进,错误处理功能也在不断增强,特别是 Oracle 21c 引入的 AI 驱动的诊断工具和错误预测功能,为 DBA 提供了更强大的错误处理能力。DBA 应该及时了解和掌握这些新功能,不断提高自己的错误处理水平,确保数据库系统的稳定运行。
