ORA 错误码查询
查询 ORA-XXXXX 错误码含义、常见原因与解决方案,支持关键字模糊搜索
常见错误快速访问
找到 70 条匹配结果
违反唯一约束
常见原因
- 向唯一/主键列插入了重复值
- 批量插入中存在冲突行
解决方案
- 1.插入前先检查数据是否存在
- 2.使用 MERGE 或先查后插逻辑
- 3.确认唯一约束建在正确列上
超出最大会话数
常见原因
- 并发连接过多
- 连接池未释放会话
- SESSIONS 参数设置过低
解决方案
- 1.增加 SESSIONS 参数值
- 2.调整连接池配置
- 3.识别并终止空闲会话
超出最大进程数
常见原因
- PROCESSES 参数过低
- 应用存在资源泄漏
- 并行进程过多
解决方案
- 1.增加 PROCESSES 参数
- 2.修复应用中的连接泄漏
- 3.修改参数后重启实例
资源忙,NOWAIT 方式获取锁失败或超时
常见原因
- 其他会话持有对象锁
- 在有活跃 DML 的表上执行 DDL
- 长事务阻塞其他操作
解决方案
- 1.等待后重试操作
- 2.查找并终止阻塞会话
- 3.使用 WAIT 替代 NOWAIT
等待资源时检测到死锁
常见原因
- 两个或多个会话互相等待对方的锁
- 未索引的外键导致表级锁
- 应用锁顺序设计不当
解决方案
- 1.在外键列上添加索引
- 2.确保应用中锁的获取顺序一致
- 3.审查并重新设计事务逻辑
归档进程错误
常见原因
- 归档日志目标目录已满
- 归档进程停止
- 闪回恢复区空间不足
解决方案
- 1.释放归档目标目录空间
- 2.增加 db_recovery_file_dest_size
- 3.备份并删除旧归档日志
内部错误代码
常见原因
- Oracle 内部 Bug
- 内存损坏
- 硬件故障
解决方案
- 1.在 Oracle 官方支持查找已知 Bug
- 2.收集 trace 文件并提交 SR
- 3.应用最新补丁
无效标识符
常见原因
- 列名拼写错误
- 缺少表别名引用
- 列在表中不存在
解决方案
- 1.检查列名拼写
- 2.确认表/视图定义
- 3.使用正确的表别名
缺少右括号
常见原因
- SQL 中括号未匹配
- 括号内语法无效
- 使用保留字未加引号
解决方案
- 1.检查并匹配所有括号
- 2.检查 CREATE TABLE 或函数调用内的语法
- 3.用双引号包裹保留字
无效字符
常见原因
- 编程方式执行 SQL 时包含了分号
- SQL 中含有非 ASCII 字符
- 特殊字符未正确转义
解决方案
- 1.在 JDBC/OCI 调用中移除末尾分号
- 2.检查不可见字符
- 3.对特殊字符使用正确的转义
值过多
常见原因
- INSERT 列数与值数不匹配
- 子查询返回列数超出预期
- 列列表不匹配
解决方案
- 1.使列数与值数匹配
- 2.在 INSERT 中显式列出列
- 3.检查子查询 SELECT 列表
列定义不明确
常见原因
- 多表中存在同名列但未使用别名
- JOIN 时未正确限定表名
解决方案
- 1.用表别名前缀限定列
- 2.在所有 JOIN 中使用显式表别名
数据类型不一致
常见原因
- 比较不兼容的数据类型
- UNION 的列类型不匹配
- 隐式转换失败
解决方案
- 1.使用显式类型转换 (TO_CHAR, TO_NUMBER 等)
- 2.确保 UNION 各列类型一致
- 3.检查 WHERE 子句数据类型兼容性
缺少表达式
常见原因
- SELECT 列表不完整
- 运算符后缺少值
- 列列表末尾多余逗号
解决方案
- 1.补全 SQL 表达式
- 2.移除末尾逗号
- 3.检查缺少的列名或值
表或视图不存在
常见原因
- 对象在该 schema 中不存在
- 对该表没有 SELECT 权限
- 使用了错误的 schema 前缀
解决方案
- 1.确认表是否存在:SELECT * FROM all_tables
- 2.授予必要的权限
- 3.使用正确的 schema.table_name 格式
名称已被现有对象使用
常见原因
- 创建了重名对象
- 对象已存在于当前 schema
解决方案
- 1.对视图/存储过程使用 CREATE OR REPLACE
- 2.先删除已存在的对象
- 3.选择一个不同的名称
超出最大打开游标数
常见原因
- 应用未关闭游标/语句
- OPEN_CURSORS 参数过低
- PL/SQL 代码中存在游标泄漏
解决方案
- 1.在应用代码中使用后关闭游标
- 2.增加 OPEN_CURSORS 参数
- 3.使用 V$OPEN_CURSOR 定位泄漏
用户名/密码无效;登录被拒绝
常见原因
- 密码错误
- 账户被锁定
- 密码大小写不匹配
解决方案
- 1.验证凭据
- 2.解锁账户:ALTER USER ... ACCOUNT UNLOCK
- 3.检查 SEC_CASE_SENSITIVE_LOGON 参数
权限不足
常见原因
- 用户缺少所需系统权限
- 缺少角色授予
- 对象权限未授予
解决方案
- 1.授予所需权限:GRANT ... TO user
- 2.检查 DBA_SYS_PRIVS 和 DBA_ROLE_PRIVS
- 3.授予具体对象权限
ORACLE 不可用
常见原因
- 数据库实例未启动
- 实例已崩溃
- 后台进程未运行
解决方案
- 1.启动实例:STARTUP
- 2.检查 alert log 中的错误
- 3.确认 Oracle 进程正在运行
处理系统参数失败
常见原因
- init.ora/spfile 参数无效
- 参数文件语法错误
- 参数文件权限问题
解决方案
- 1.检查参数文件语法错误
- 2.验证参数值是否有效
- 3.从 spfile 创建 pfile 进行编辑
数据库未打开
常见原因
- 数据库已挂载但未打开
- 因需要恢复导致打开失败
- 受限会话活跃中
解决方案
- 1.执行 ALTER DATABASE OPEN
- 2.如需要则执行介质恢复
- 3.检查 alert log 中的打开失败信息
不能向列插入 NULL 值
常见原因
- NOT NULL 列缺少值
- 触发器未提供默认值
- 应用为必填字段传了空值
解决方案
- 1.为 NOT NULL 列提供值
- 2.为列添加 DEFAULT 子句
- 3.修复应用逻辑传递必填值
未找到数据
常见原因
- SELECT INTO 未返回任何行
- 隐式游标未找到匹配数据
- 数据被其他会话删除
解决方案
- 1.在 PL/SQL 中处理 NO_DATA_FOUND 异常
- 2.使用游标配合 %NOTFOUND 检查
- 3.查询前确认数据是否存在
无效的 ROWID
常见原因
- 获取 ROWID 后该行已被删除
- 跨表使用 ROWID
- ROWID 值损坏
解决方案
- 1.重新查询获取当前 ROWID
- 2.不要长期缓存 ROWID
- 3.使用主键代替 ROWID
精确提取返回了多于请求的行数
常见原因
- SELECT INTO 返回了多行
- 子查询返回了多于一行
- 数据完整性问题——意外重复
解决方案
- 1.添加 WHERE 子句限制为一行
- 2.使用游标或 BULK COLLECT 处理多行
- 3.修复数据重复问题
值超出指定精度
常见原因
- 数值超出列精度
- 计算结果对列来说太大
- 表定义中数据类型大小不正确
解决方案
- 1.增加列精度:ALTER TABLE MODIFY
- 2.插入前对值进行舍入或截断
- 3.确认数据范围与列定义匹配
索引或其分区处于不可用状态
常见原因
- 直接路径加载导致索引失效
- ALTER TABLE MOVE 后未重建索引
- 分区维护操作
解决方案
- 1.重建索引:ALTER INDEX ... REBUILD
- 2.使用 ONLINE 重建避免停机
- 3.设置 SKIP_UNUSABLE_INDEXES=TRUE 作为临时方案
超出表空间的空间配额
常见原因
- 用户在表空间上的配额已达上限
- 没有 UNLIMITED TABLESPACE 权限
- 表空间配额设置过低
解决方案
- 1.ALTER USER ... QUOTA UNLIMITED ON 表空间
- 2.授予 UNLIMITED TABLESPACE 权限
- 3.增加具体的配额量
快照过旧
常见原因
- UNDO_RETENTION 对长查询来说太小
- Undo 表空间太小
- 并发事务过多覆写了 undo 数据
解决方案
- 1.增大 UNDO_RETENTION 参数
- 2.增大 undo 表空间
- 3.在低活跃时段运行长查询
ORACLE 数据块损坏
常见原因
- 磁盘硬件故障
- 写入时 I/O 错误
- 内存损坏数据写入磁盘
解决方案
- 1.从备份恢复 (RMAN 块介质恢复)
- 2.使用 DBMS_REPAIR 标记损坏块
- 3.检查并更换故障硬件
回滚段已达到最大区数
常见原因
- 回滚段无法继续扩展
- 大事务超出 undo 容量
- 未启用自动 undo 管理
解决方案
- 1.切换到自动 undo 管理
- 2.增大 undo 表空间
- 3.将大事务拆分为小批次
表已达到最大区数
常见原因
- 表无法分配更多区
- 字典管理表空间限制
- 区大小过小导致区数过多
解决方案
- 1.将表移到本地管理表空间
- 2.以更大的区大小重建表
- 3.ALTER TABLE ... MOVE TABLESPACE ...
无法在表空间中扩展临时段
常见原因
- 表空间已满
- 数据文件已达最大大小
- 数据文件未启用自动扩展
解决方案
- 1.向表空间添加数据文件
- 2.对现有数据文件启用自动扩展
- 3.增大数据文件最大大小
无法在表空间中扩展表
常见原因
- 表空间空间不足以扩展表
- 数据文件未启用自动扩展
- 配额用尽
解决方案
- 1.添加数据文件或扩大现有文件
- 2.启用数据文件的 AUTOEXTEND ON
- 3.将表移到更大的表空间
无法在表空间中扩展索引
常见原因
- 索引表空间已满
- 大索引重建占用所有空间
- 未启用自动扩展
解决方案
- 1.向索引表空间添加数据文件
- 2.在其他表空间中重建索引
- 3.启用数据文件自动扩展
无法在表空间中扩展 LOB 段
常见原因
- LOB 表空间已满
- 大 BLOB/CLOB 数据耗尽空间
- LOB 表空间数据文件未启用自动扩展
解决方案
- 1.向 LOB 表空间添加数据文件
- 2.对 LOB 数据文件启用自动扩展
- 3.清理过期 LOB 数据
无效数字
常见原因
- 尝试将非数字字符串转为数字
- 隐式转换失败
- 源数据质量问题
解决方案
- 1.转换前验证数据
- 2.使用 TO_NUMBER 配合错误处理
- 3.清理源数据中的非数字值
引用的字符串未正确终止
常见原因
- 缺少关闭的单引号
- 字符串中包含未转义的单引号
- 多行字符串未正确处理
解决方案
- 1.添加匹配的关闭引号
- 2.用两个单引号转义单引号
- 3.对复杂字符串使用 Q-quoting 语法
不是有效的月份
常见原因
- 日期格式与 NLS_DATE_FORMAT 不匹配
- 字符串中的月份值无效
- 区域设置不匹配(如 'JAN' vs '01')
解决方案
- 1.在 TO_DATE 中使用显式格式
- 2.设置正确的 NLS_DATE_FORMAT
- 3.转换前验证日期字符串
不能删除当前已连接的用户
常见原因
- 用户有活跃会话
- 该用户下有后台作业运行
- 连接池保持会话存活
解决方案
- 1.先终止所有用户会话
- 2.断开连接后使用 DROP USER ... CASCADE
- 3.对活跃会话执行 ALTER SYSTEM KILL SESSION
超时:分布式事务等待锁
常见原因
- 分布式事务被远程锁阻塞
- 网络延迟导致锁超时
- 远程数据库无响应
解决方案
- 1.检查远程数据库中的阻塞锁
- 2.增加 DISTRIBUTED_LOCK_TIMEOUT
- 3.验证到远程数据库的网络连通性
违反完整性约束——未找到父键
常见原因
- 插入子记录时没有匹配的父记录
- 父行已被删除
- 外键值错误
解决方案
- 1.先插入父记录
- 2.确认外键值在父表中存在
- 3.批量加载时临时禁用约束
违反完整性约束——存在子记录
常见原因
- 删除存在子记录的父记录
- 更新被子记录引用的父键
- 未配置级联删除
解决方案
- 1.先删除子记录
- 2.在约束中使用 ON DELETE CASCADE
- 3.适当时临时禁用约束
不能删除用于强制唯一/主键的索引
常见原因
- 尝试删除约束依赖的索引
- 索引被主键或唯一约束使用
解决方案
- 1.先删除约束再删除索引
- 2.使用 ALTER TABLE ... DROP CONSTRAINT
- 3.删索引前先禁用约束
通信通道上遇到文件结束
常见原因
- 服务器进程崩溃
- 网络中断
- 操作期间实例终止
解决方案
- 1.检查 alert log 中的 ORA-600/ORA-7445 错误
- 2.验证网络稳定性
- 3.重新连接并重试
未连接到 ORACLE
常见原因
- 连接已丢失
- 会话超时
- 数据库实例已关闭
解决方案
- 1.重新建立数据库连接
- 2.检查实例状态
- 3.在应用中实现连接重试逻辑
连接失去联系
常见原因
- 超出网络超时时间
- 防火墙终止了空闲连接
- 服务端超时 (SQLNET.EXPIRE_TIME)
解决方案
- 1.配置 SQLNET.EXPIRE_TIME 检测死连接
- 2.调整防火墙超时设置
- 3.在连接池中实现连接验证
无法分配共享内存
常见原因
- 共享池碎片化
- SGA 对工作负载来说太小
- 太多字面值 SQL 语句(未使用绑定变量)
解决方案
- 1.增大 SHARED_POOL_SIZE
- 2.使用绑定变量减少解析
- 3.刷新共享池:ALTER SYSTEM FLUSH SHARED_POOL
实例使用的 PGA 内存超出 PGA_AGGREGATE_LIMIT
常见原因
- 总 PGA 消耗超出限制
- 会话中存在内存泄漏
- 活跃会话过多且各自使用大工作区
解决方案
- 1.增大 PGA_AGGREGATE_LIMIT
- 2.识别 PGA 使用过多的会话
- 3.减小 SORT_AREA_SIZE 或 HASH_AREA_SIZE
对象不存在
常见原因
- 引用的对象已删除或从未创建
- 对象名拼写错误
- schema 上下文错误
解决方案
- 1.用 DBA_OBJECTS 验证对象是否存在
- 2.检查拼写和 schema 前缀
- 3.创建缺失的对象
包的现有状态已被丢弃
常见原因
- 会话使用包时包被重新编译
- 依赖对象上执行了 DDL
- 包体发生了变化
解决方案
- 1.重试操作(会话将重新初始化包)
- 2.避免在包被使用时重新编译
- 3.在应用中捕获异常并重试
PL/SQL:数值或值错误
常见原因
- 变量太小无法容纳赋值
- 赋值中类型不匹配
- VARCHAR2 变量字符串被截断
解决方案
- 1.增大变量声明的大小
- 2.使用正确的类型转换
- 3.赋值前验证数据长度
在第 ... 行(PL/SQL 回溯)
常见原因
- 这是堆栈跟踪指示,不是根本错误
- 未处理的异常沿调用栈向上传播
解决方案
- 1.查看堆栈跟踪中第一个 ORA 错误
- 2.在 PL/SQL 代码中添加异常处理
- 3.检查引用的行号找到实际错误
第 N 行第 N 列:PL/SQL 编译错误
常见原因
- PL/SQL 块中的语法错误
- 引用不存在的对象
- PL/SQL 代码中类型不匹配
解决方案
- 1.用 SHOW ERRORS 查看详细信息
- 2.确认所有引用的对象存在
- 3.修复指定行列处的语法
不能为此事务序列化访问
常见原因
- 可序列化事务与并发更新冲突
- 事务启动后行被修改
- SERIALIZABLE 隔离级别下高争用
解决方案
- 1.重试事务
- 2.考虑使用 READ COMMITTED 隔离级别
- 3.缩小事务范围
自动执行作业时出错
常见原因
- 计划作业遇到运行时错误
- 作业所有者缺少所需权限
- 引用的对象不再存在
解决方案
- 1.检查 DBA_SCHEDULER_JOB_RUN_DETAILS 获取错误详情
- 2.授予作业所有者必要权限
- 3.修复作业过程/SQL
TNS:无法解析指定的连接标识符
常见原因
- tnsnames.ora 缺失或条目不正确
- TNS_ADMIN 未指向正确目录
- tnsnames.ora 中语法错误
解决方案
- 1.确认 tnsnames.ora 中存在该条目
- 2.检查 TNS_ADMIN 环境变量
- 3.用 tnsping 测试解析
TNS:连接超时
常见原因
- 数据库主机不可达
- 防火墙阻止了端口
- 监听器未启动
解决方案
- 1.验证网络连通性(ping/telnet)
- 2.检查 Oracle 端口的防火墙规则
- 3.启动监听器:lsnrctl start
TNS:监听器当前不知道连接描述符中给定的 SID
常见原因
- 连接字符串中 SID 错误
- 数据库未向监听器注册
- 数据库启动后监听器被重启
解决方案
- 1.用 lsnrctl services 确认 SID
- 2.使用 SERVICE_NAME 代替 SID
- 3.ALTER SYSTEM REGISTER 强制注册
TNS:监听器当前不知道所请求的服务
常见原因
- 连接字符串中服务名不正确
- 数据库未完全打开(服务未注册)
- 动态注册尚未发生
解决方案
- 1.检查服务名:lsnrctl services
- 2.等待动态注册或执行 ALTER SYSTEM REGISTER
- 3.确认数据库为 OPEN 状态
TNS:未找到合适的服务处理程序
常见原因
- 所有调度器繁忙(共享服务器模式)
- PROCESSES 或 SESSIONS 限制已达到
- 监听器无法移交连接
解决方案
- 1.增加 PROCESSES 和 SESSIONS 参数
- 2.如使用共享服务器则添加更多调度器
- 3.切换为专用服务器模式
TNS:无监听器
常见原因
- Oracle 监听器未运行
- 连接字符串中端口错误
- 主机防火墙阻止了监听端口
解决方案
- 1.启动监听器:lsnrctl start
- 2.确认端口号(默认 1521)
- 3.检查防火墙是否允许监听端口
TNS:协议适配器错误
常见原因
- Oracle 服务未运行(Windows)
- ORACLE_SID 未设置(Linux)
- 监听器配置不匹配
解决方案
- 1.启动 OracleService(Windows)或设置 ORACLE_SID(Linux)
- 2.验证环境变量
- 3.检查 listener.ora 配置
插入的分区键未映射到任何分区
常见原因
- 值不在任何已定义的分区范围内
- 范围分区中缺少 MAXVALUE 分区
- 新数据超出分区边界
解决方案
- 1.为该值范围添加新分区
- 2.添加 MAXVALUE 分区作为兜底
- 3.拆分现有分区以容纳新数据
写入文件时出错
常见原因
- RMAN 备份期间磁盘已满
- 文件系统无剩余空间
- 存储阵列 I/O 故障
解决方案
- 1.释放备份目标的磁盘空间
- 2.检查存储健康状态和 I/O 错误
- 3.使用压缩备份节省空间
操作系统相关操作:fork 失败
常见原因
- 操作系统内存不足无法创建新进程
- 进程数达到限制(ulimit)
- 系统资源耗尽
解决方案
- 1.增加操作系统进程限制(ulimit -u)
- 2.释放系统内存
- 3.检查 Linux 上的 /proc/sys/kernel/pid_max
账户已锁定
常见原因
- 登录失败次数过多
- 密码过期导致账户自动锁定
- DBA 显式锁定了账户
解决方案
- 1.ALTER USER 用户名 ACCOUNT UNLOCK
- 2.如果密码过期则重置密码
- 3.检查 FAILED_LOGIN_ATTEMPTS 配置文件设置
密码已过期
常见原因
- 密码使用期限已超
- DEFAULT 配置文件设置了 PASSWORD_LIFE_TIME
- 密码宽限期已结束
解决方案
- 1.修改密码:ALTER USER ... IDENTIFIED BY ...
- 2.如适当将 PASSWORD_LIFE_TIME 设为 UNLIMITED
- 3.审查密码策略要求
无法在 undo 表空间中扩展段
常见原因
- Undo 表空间已满
- 大事务消耗了所有 undo 空间
- Undo 数据文件未启用自动扩展
解决方案
- 1.向 undo 表空间添加数据文件
- 2.对 undo 数据文件启用自动扩展
- 3.增大 UNDO_RETENTION 或添加更多 undo 空间
模糊搜索
支持按错误码、关键字搜索,快速定位问题
原因分析
每个错误码附带常见原因,帮助精准排查
解决方案
提供具体操作步骤,DBA 直接上手修复
分类筛选
按空间、锁、网络等类别筛选,快速缩小范围