目录第1章 Oracle数据库常见问题诊断方法 (1)1.1 常见错误篇 (1)1.1.1 ORA-12571、ORA-03113、ORA-03114、ORA-01041 (1)1.1.2 ORA-01000 (1)1.1.3 ORA-01545 (2)1.1.4 ORA-0165x (2)1.1.5 ORA-01555 (3)1.1.6 ORA-04031 (3)1.1.7 ORA-04091 (3)1.1.8 ORA-01242、ORA-01113 (4)1.2 内部错误篇 (4)1.2.1 ORA-00600【12330】错误 (4)1.2.2 ORA-00604【xxx】错误 (5)1.2.3 ORA-00600【3339】错误 (5)1.2.4 ORA-00600【13004】错误 (5)1.3 分布式事务篇 (6)1.3.1 诊断分布式事务 (6)1.3.2 检查其它节点的事务(DBA_2PC_NEIGHBORS) (6)1.3.3 通过DBA_2PC_PENDING字典表检查事务的状态 (6)1.3.4 检查处理结果 (7)1.3.5 COMMIT FORCE或ROLLBACK FORCE命令 (7)1.4 OPS或RAC篇 (8)1.4.1 准备工作 (8)1.4.2 紧急情况下的状态备份 (8)1.4.3 OPS设计、配置准则 (9)1.4.4 OPS常见问题 (9)1.4.5 诊断分析步骤 (9)1.5 非OPS篇 (18)1.5.1 ORACLE数据库系统常见问题:空间方面问题 (18)1.5.2 ORACLE数据库系统常见问题:性能方面问题 (18)1.5.3 ORACLE数据库系统常见问题:锁争用方面问题 (19)1.5.4 ORACLE数据库系统常见问题:内存方面问题 (20)1.5.5 ORACLE问题分析脚本 (20)1.5.6 SQL*NET篇 (24)1.5.7 TNS-12154 Error 或ORA-12154 (24)1.5.8 NL-00462 Error 或ORA-00462 (25)1.5.9 NL-00405 Error 或ORA-00405 (26)1.5.10 TNS-01155 Error 或ORA-01155 (26)1.5.11 TNS-12537 、TNS-12560、TNS-00507 Error (26)1.5.12 TNS-12203 Error (27)1.5.13 TNS-12533 Error (27)1.6 备份与恢复篇 (27)1.6.1 EXP-00942 或ORA-00942、ORA-00904错误 (28)1.6.2 EXP-00037 或 ORA-00037 (28)1.6.3 IMP-00009 或ORA-00009 (28)1.6.4 EXP-00041或ORA-00041 (29)1.6.5 IMP-00016 、IMP-00036 、IMP-00037 、IMP-00038 (29)第1章 Oracle数据库常见问题诊断方法1.1 常见错误篇ORACLE的这类错误在ORALCE的文档中有详细说明,但原因及措施说明不详细,本文当着重说明如何解决这类错误。
1.1.1 ORA-12571、ORA-03113、ORA-03114、ORA-010411. 特征客户端(代理或应用服务器)有时报这类断连错误2. 原因如果偶尔出现一次,则可能为网络原因或用户异常中止,如果经常出现则为客户端与服务端的字符集不一致。
3. 措施如果偶尔出现,可在服务端的协议配置文件PROTOCOL.ORA中增加一行TCP.NODELAY=YES;如果经常出现,则为客户端与服务端字符集不一致或网络原因。
客户端的字符集在注册表里定义:HKEY__LOCAL__MACHINE/SOFTWARE/ORACLE/NLS__LANG在客户端注册表中的TCP参数项中设置TCPMAXDATARETRANSMITIONS=20。
1.1.2 ORA-010001. 特征达到会话允许的最大游标数2. 原因达到会话允许的最大游标数3. 措施有两种解决方法:在初始化文件INIT<SID>.ORA文件中增加OPEN_CURSORS的数量,一般要求大于200。
在应用级,与开发工具有关,例如设置MAXOPEN_CURSORS等。
1.1.3 ORA-015451. 特征某个回滚段不可用2. 原因(1) 当使回滚段ONLINE时,但回滚段不可用,例如回滚段所在表空间OFFLINE;(2) 当使回滚段ONLINE时,但回滚段已ONLINE,例如回滚段被使用两次,典型的案例如OPS方式时,回滚段不能公有;(3) 删除回滚段时,回滚段中有活动的事务;3. 措施(1) 确保回滚段可用(2) 从初始化文件INIT<SID>.ORA的参数ROLLBACK)SEGMENTS中删除指定的回滚段。
(3) 可以将回滚段所在表空间删除,取消UNDO事务1.1.4 ORA-0165x1. 特征表空间没有足够的空间供分配2. 原因表空间已满;存储参数不合理,NEXT太小;没有连续的区间3. 措施如果表空间已满,则需为表空间增加文件;如果存储参数不合理,则需增加INITIAL和NEXT;如果没有连续的区间,需要合并空闲的表空间。
查看空间碎片用DBA_FREE_SPACE1.1.5 ORA-015551. 特征当前会话无法读到以前版本的数据2. 原因原因很多,主要原因有下列:回滚段太小、太少;回滚段冲突;交叉提交(FETCH_ACROSS)3. 措施增加回滚段数量;1.1.6 ORA-040311. 特征共享池内存区内存不够,或产生内存碎片2. 原因当试图装载一个大包时或执行一个较大的存储过程时,而共享池没有连续的内存空间。
3. 措施如果是内存不够,则增加SHARE)POOL_SIZE;如果是内存碎片,执行alter system flush share_pool1.1.7 ORA-040911. 特征触发器工作不正常2. 原因一个行触发读取或修改变化的表(正在修改、插入)时,产生这种错误。
3. 措施检查触发器脚本,保证引用完整性1.1.8 ORA-01242、ORA-011131. 特征介质故障导致数据库宕机2. 原因介质故障。
3. 措施检查硬件故障;修改dbshut脚本,将其中的STARTUP命令修改为:Startup open recoverAlter database open1.2 内部错误篇ORACLE的错误各种各样,包括应用错误、一般错误、内部错误等,前面两类错误在ORALCE的文档中有说明,但内部错误没有相应的文档说明,只是请求报告ORACLE技术支持,本文档主要讨论ORACLE的内部错误,且这些内部错误在ICD中经常出现,仅供参考。
内部错误一般为格式为ORA-00600或ORA-006XX,其中前者最普遍,后者较少见,ORA-600中的第一个变量用于标记代码中错误的位置,第二个到第五个变量显示附加信息,例如文件号、函数号等具体信息。
1.2.1 ORA-00600【12330】错误1. 特征数据库告警日志中经常有这个错误及相应的trace文件2. 原因用户异常中断操作或客户端字符集与SERVER端字符集不一致3. 措施如果偶尔出现,则为用户异常中止,例如代理或应用服务器的断连,有时会产生这个错误;如果经常出现,则为客户端与服务端字符集不一致。
客户端的字符集在注册表里定义:HKEY__LOCAL__MACHINE/SOFTWARE/ORACLE/NLS__LANG1.2.2 ORA-00604【xxx】错误1. 特征在分析SQL语句时,查询数据字典表发生错误2. 原因这类错误一般与内存管理有关,有可能是由于内存泄漏导致该错误3. 措施如果偶尔出现,适当加大SHARE_POOL_SIZE;如果经常出现,则需要打相应的补丁。
1.2.3 ORA-00600【3339】错误1. 特征数据冲突,包括:块格式冲突、非法索引入口2. 原因oracle系统本身bug;操作系统或介质故障3. 措施ORACLE升级或打补丁;检查硬件故障1.2.4 ORA-00600【13004】错误1. 特征逻辑冲突,例如查询返回错误的数据等2. 原因oracle系统本身bug;3. 措施ORACLE升级或打补丁1.3 分布式事务篇对于数据库服务端到服务端的访问(如DBLINK、复制、快照等),由于网络等原因可能会产生一个节点的事务无法恢复,与之相关的另一个节点的数据库事务挂起,因而产生分布式数据库事务问题。
1.3.1 诊断分布式事务(1) 检查alert<sid>.log文件,发现相应的错误确保网络正常,并检查DBLINK是”valid”和可操作的(2) SELECT * FROM V$DBLINK 或GV$DBLINGK(3) 查找悬挂的事务( DBA_2PC_PENDING)SELECT LOCAL_TRAN_ID, GLOBAL_TRAN_ID, STATE, MIXED, HOST,COMMIT# FROM DBA_2PC_PENDINGLOCAL_TRAN_ID 是本机的事务号(报告错误的机器),如果LOCAL_TRAN_ID = GLOBAL_TRAN_ID, 即分布式事务来源于本机,也可以从本机的alert<sid>.log中得到 LOCAL_TRAN_ID 。
1.3.2 检查其它节点的事务(DBA_2PC_NEIGHBORS)(1) 执行下列命令:SELECT LOCAL_TRAN_ID, IN_OUT, DATABASE, INTERFACEFROM DBA_2PC_NEIGHBORS(2) 在init<sid>.ora中检查参数COMMIT_POINT_STRENGTH该参数应有较大值(最好最大值)1.3.3 通过DBA_2PC_PENDING字典表检查事务的状态(1) 如果状态是commit,则本地数据库提交成功,即不必在本数据库实施COMMIT FORCE或ROLLBACK FORCE。
(2) 如果状态是not commited(prepared),则必需在本数据库实施COMMITFORCE或ROLLBACK FORCE,SCN号可在DBA_2PC_PENDING字典表中找到。
(3) 比较个节点的GLOBAL_TRAN_ID及SCN号(DBA_2PC_PENDING)如果在其它节点没有这个GLOBAL_TRAN_ID及SCN,则RECO已经解决了这个问题,可以不作任何事情。
此时可在进程中看到RECO进程(通常看不到)(4) 如果节点存在没有提交事务如果事务的状态是prepared,则必需在本数据库实施COMMIT FORCE或ROLLBACK FORCE,SCN号可在DBA_2PC_PENDING字典表中找到。