Oracle常见错误汇总
Oracle的常见错误及解决办法

Oracle的常见错误及解决办法ORA-12528:TNS:listener: all appropriate instances are blocking new connectionsORA-12528问题是因为监听中的服务使⽤了动态服务,实例虽然启动,但没有注册到监听。
实例是通过PMON进程注册到监听上的,⽽PMON进程需要在MOUNT状态下才会启动。
所以造成了上⾯的错误。
解决这个问题,有三种⽅法:1、把监听设置为静态;2、在tnsnames.ora中追加(UR=A);3、重新启动服务;⽅法1、通过修改listener.ora的参数,把listener.ora动态注册设置为静态注册,然后重新启动监听# listener.ora Network Configuration File: $ORACLE_HOME\network\admin\listener.ora# Generated by Oracle configuration tools.LISTENER =(DESCRIPTION_LIST =(DESCRIPTION =(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))(ADDRESS = (PROTOCOL = TCP)(HOST = [IP])(PORT = 1521))))SID_LIST_LISTENER =(SID_LIST =(SID_DESC =(GLOBAL_DBNAME = [DBNAME])(ORACLE_HOME = [$ORACLE_HOME])(SID_NAME = [SID])))静态注册的风险:如果在instance运⾏中,lisener重新启动,就找不到instance了。
静态注册需要先启动lisener,再启动instance。
且静态模式下,lisener status显⽰的是unknown⽅法2、启动到nomount状态,通过修改tnsnames.ora的参数# tnsnames.ora Network Configuration File: $ORACLE_HOME\network\admin\tnsnames.ora# Generated by Oracle configuration tools.SYK =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = [IP])(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = SYK)(UR=A)))然后连接上数据库SQL>alter database mount;SQL>alter database open;⽅法3、重启ORACLE或者重启ORACLE服务在oracle帐户下依序执⾏如下命令:sqlplus / as sysdba;//在其它帐户(如root)下执⾏可能会报错(ORA-01031)因为这些帐户没有在dba组中shutdown immediate;startup;/s/blog_636415010100x3lc.htmloracle实例名: error while loading shared libraries: libskgxp10.so: cannot open shared object file: No such file or directory是环境变量LD_LIBRARY_PATH的问题。
oracle常见故障处理手册

oracle常见故障处理手册一、数据库启动与关闭故障1.数据库启动失败原因:可能是由于Oracle数据库配置不正确、系统环境变量设置不正确、初始化参数设置不正确等原因导致。
解决方法:检查数据库日志文件,查看错误信息,根据错误信息进行相应的修复。
2.数据库关闭失败原因:可能是由于数据库事务未完成、数据库锁未释放等原因导致。
解决方法:检查数据库日志文件,查看错误信息,根据错误信息进行相应的修复。
二、连接故障1.连接不成功原因:可能是由于网络连接问题、数据库用户名或密码错误、数据库实例名错误等原因导致。
解决方法:检查网络连接是否正常,检查数据库用户名和密码是否正确,检查数据库实例名是否正确。
2.连接断开原因:可能是由于网络不稳定、数据库服务器异常等原因导致。
解决方法:检查网络连接是否正常,检查数据库服务器是否正常。
三、数据恢复故障1.数据丢失原因:可能是由于数据库损坏、磁盘故障等原因导致。
解决方法:根据数据丢失的原因,选择相应的恢复方法,如使用备份恢复数据或使用日志文件恢复数据。
2.数据不一致原因:可能是由于数据修改不一致、数据复制不一致等原因导致。
解决方法:检查数据修改和复制的日志文件,找到不一致的数据并修复。
四、性能优化故障1.性能下降原因:可能是由于CPU占用过高、内存占用过高、磁盘IO过大等原因导致。
解决方法:优化数据库配置参数,如增加内存、优化磁盘IO等。
2.查询速度慢原因:可能是由于查询语句不优化、表没有建立索引等原因导致。
解决方法:优化查询语句,为表建立索引等。
五、存储管理故障1.存储空间不足原因:可能是由于磁盘空间不足、表空间不足等原因导致。
解决方法:清理磁盘空间,增加磁盘空间,调整表空间大小等。
2.数据文件丢失或损坏原因:可能是由于磁盘故障、人为误删除或修改等原因导致。
解决方法:使用备份恢复数据文件或修复损坏的数据文件。
六、网络连接故障1.网络连接中断原因:可能是由于网络设备故障、网络连接线故障等原因导致。
oracle操作常见错误

1.[Err] ORA-02438: Column check constraint cannot reference other columnsORA-02438: 列检查约束条件无法引用其它列--通常可能是constraint 拼写错误2. [Err] ORA-02250: missing or invalid constraint name约束条件名缺失或者无效。
比如:alter table tbl_schooladd s_level number(7) constraint unique; //错误的====add s_level number(7) unique; 正确的4. [Err] ORA-01861: literal does not match format stringORA-01861: 文字与格式字符串不匹配比如:insert into tbl_school(id,s_name,address,establish_time,style)values(1,'清华','北京','1976-05-05','理');日期的输入,要有固定的格式=====values(1,'清华','北京',to_date('1976-05-01','rrrr-mm-dd'),'理');5:select index_name,table_name from user_indexesWhere table_name=’s_emp’;提示错误:为选定行。
‘’里面的就变成了字符串,是区分大小写的,select index_name,table_name from user_indexesWhere table_name=’S_EMP’;6:Ora-02290【】违反检查约束条件可能原因:check里面出错,在传值的时候,出现乱码了,只能重建表7.A.number类型如果是后面带小数点的呢,最好在实体类里面做一下转化。
Oracle常见错误及解决方案

O r a c l e常见错误及解决方案问题1:Oracle服务器进入PL/SQL Developer时报ora-01033:oracle initialization or shutdown in progress 错误提示,应用系统无法连接Oracle服务。
解决方法如下:⑴进入CMD,执行set ORACLE_SID=fbms,确保连接到正确的SID;⑵运行sqlplus "/as sysdba"SQL>shutdown immediate停止服务SQL>startup启动服务,观察启动时有无数据文件加载报错,并记住出错数据文件标号SQL>shutdown immediate再次停止服务SQL>startup mountSQL> recover datafile 2恢复出错的数据文件SQL>shutdown immediate再次停止服务SQL>startup启动服务,此次正常。
⑶进入PL/SQL Developer检查,没有再提示错误。
问题2:Oracle密码忘记了怎么办?解决方法有很多种,这里讲述以下三种:⑴打开cmd,输入sqlplus /nolog,回车;输入“conn / as sysdba”;输入“alter user sys identified by 新密码”。
注意:新密码最好以字母开头,否则可能出现错误Ora-00988。
有了这个方法后,只要自己对oracle 服务器有管理员权限,Oracle密码忘记了也不用着急,可以随意修改密码。
⑵在命令行执行如下命令:sqlplus "/@服务名as sysdba"然后在sqlplus中运行以上命令即可修改密码:alter user sys identified by 新密码;alter user system identified by 新密码;⑶运行到C盘根目录输入:SET ORACLE_SID = 你的SID名称输入:sqlplus/nolog输入:connect/as sysdba输入:alert user sys identified by sys输入:alert user system identified by system完成以上5步,则密码更改完成,密码是Oracle数据库的初始密码。
oracle报错处理 案例

oracle报错处理案例Oracle数据库在运行过程中可能会遇到各种错误,下面列举几个报错案例以及相应的解决思路:1、ORA-00701: 这个错误通常与内部错误或者核心对象有关。
根据2021年的信息,处理ORA-00701的一个解决方案是将数据库启动到升级模式(upgrade mode)进行修复,或者配置特定的事件(如event 38003),以便让Oracle跳过某些验证步骤。
在某些情况下,可能需要重建受影响的核心对象。
2、数据库无法打开并开始crash recovery:当数据库因异常关闭(如服务器断电)后,重启时可能会出现类似"alter database open... crash recovery"的情况。
此时,Oracle会自动尝试执行恢复过程来确保数据一致性。
DBA需要监控redo日志应用情况和归档日志状态,确保所有必需的redo已成功应用,以完成数据库的正常恢复开放。
3、ORA-00235:这个错误在官方文档中没有明确记录,但根据历史资料中的案例,它可能与备份或RMAN操作期间的同步恢复目录有关。
解决方案可能涉及检查并协调任何冲突的RMAN任务、确保恢复目录的一致性,或者重新同步恢复目录信息。
4、服务器断电导致的数据恢复:在服务器意外断电后,Oracle数据库可能无法正常启动。
在这种情况下,数据恢复工作包括检查物理文件的完整性、评估控制文件、联机重做日志文件和数据文件的状态,并使用RMAN或其他工具进行介质恢复或不完全恢复操作。
如果数据文件损坏严重,可能还需要从最近的有效备份和归档日志中恢复。
在实际处理Oracle数据库错误时,关键在于理解错误的具体含义、分析错误产生的上下文环境,并按照Oracle官方提供的最佳实践和建议步骤进行操作。
同时,维护详细的日志记录和定期备份也是避免数据丢失和快速恢复服务的关键措施。
Oracle常见错误及解决方法

Oracle常见错误及解决⽅法1、ORA-12541:TNS:没有监听器原因:没有启动监听器或者监听器损坏。
如果是前者,使⽤命令net start OracleOraHome81TNSListener(名字可能有出⼊)即可;如果是后者,则使⽤“Net8 Configuration Assistant”⼯具向导之“监听程序配置”增加⼀个监听器即可(基本不⽤写任何信息,⼀路OK。
在添加之前可能需要把所有的监听器先删除!)2、ORA-12500:TNS:监听程序⽆法启动专⽤服务器进程或 ORA-12560:TNS:协议适配器错误原因:ORACLE的数据库服务没有启动。
使⽤命令net start ORACLESERVICEORADB(ORADB为数据库名字)即可。
如果仍没有解决,请继续向下看。
3、如果数据库服务启动失败,则很有可能是其注册表项值损坏,最好的做法是以下两步:1)ORADIM -DELETE -SID oradb 删除数据库服务项2)ORADIM -NEW -SID oradb 新增数据库服务项注:这个过程中如果出错,就重启计算机!4、ORA-12154:TNS:能解析服务名原因:ORACLE的⽹络服务名没有正确配置。
请使⽤“Net8 Configuration Assistant”⼯具向导之“本地⽹络服务名配置”配置TNS即可。
如果仍没有解决,请继续向下看。
5、ORA-1034 :TNS:ORACLE不可⽤原因:ORACLE的数据库服务正确启动,但是数据库没有打开!使⽤命令:1)svrmgrl 启动服务管理器2)connect internal 以internal⾝份登陆3)startup 打开数据库6、ORA-12560:TNS:协议适配器错误(顽固性的)原因:未知。
解决:必杀技--打开“Windows任务管理器”,杀死ORACLE.exe及ORADIM.exe进程,书写⾃⼰的ora_startup.bat,执⾏之!7、ORA-12638:⾝份证明检索失败原因:服务端开了防⽕墙,且使⽤了本地操作系统认证解决:修改sqlnet.ora⽂件,1)NTS改为NONE,oracle将采⽤⼝令⽂件认证(此时 remote_login_passwordfile=exclusive)如connect /as sysdba 登录,后报错RA-01031: insufficient privileges,实际上是要求你输⼊sysdba的⽤户名和密码SQLNET.AUTHENTICATION_SERVICES= (NONE)2)修改查找连接的字符串顺序:tnsnames.ora,直接使⽤简单连接字符串,使⽤计算机名称NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT, HOSTNAME)8、ArcSDE数据被锁定后的解锁⽅法描述:(1)删除所选对象失败锁定请求与已有锁定冲突。
Oracle 错误一览表

Oracle 错误一览表RA-00001: 违抗独一束缚前提(.)orA-00017: 要求会话以设置跟踪事宜orA-00018: 超出最大年夜会话数orA-00019: 超出最大年夜会话许可数orA-00020: 超出最大年夜过程数()orA- 00021: 会话从属于其它某些过程;无法转换会话orA-00022: 无效的会话ID;拜望被拒绝orA-00023: 会话引用过程私用内存;无法分别会话orA-00024: 单一过程模式下不许可从多个过程注册orA-00025: 无法分派orA-00026: 损掉或无效的会话IDorA-00027: 无法删去当前会话orA-00028: 您的会话己被删去orA-00029: 会话不是用户会话orA-00030: 用户会话ID 不存在。
orA-00031: 标记要删去的会话orA-00032: 无效的会话移植口令orA-00033: 当前的会话具有空的移植口令orA-00034: 无法在当前PL/SQL 会话中orA-00035: LICENSE_MAX_USERS 不克不及小于当前用户数orA-00036: 跨过递归SQL () 级的最大年夜值orA-00037: 无法转换到属于不合办事器组的会话orA-00038: 无法创建会话: 办事器组属于其它用户orA-00050: 猎取入队时操作体系掉足orA-00051: 等待资本超时orA-00052: 超出最大年夜入队资本数()orA-00053: 超出最大年夜入队数orA-00054: 资本正忙,要求指定NOWAITorA-00055: 超出DML 锁的最大年夜数orA-00056: 对象'.' 上的DDL 锁以不兼容模式挂起orA-00057: 超出临时表锁的最大年夜数orA-00058: DB_BLOCK_SIZE 必须为才可安装此数据库(非) orA-00059: 超出DB_FILES 的最大年夜值orA-00060: 等待资本时检测到逝世锁orA-00061: 另一个例程设置了不合的DML_LOCKSorA-00062: 无法获得DML 全表锁定;DML_LOCKS 为0 orA-00063: 超出LOG_FILES 的最大年夜数orA-00064: 对象过大年夜以至无法分派在此O/S (,)orA-00065: FIXED_DATE 的初始化掉败orA-00066: LOG_FILES 为但须要成为才可兼容orA-00067: 值对参数无效;至少必须为orA-00068: 值对参数无效,必须在和之间orA-00069: 无法获得锁定-- 禁用了表锁定orA-00070: 敕令无效orA-00071: 过程号必须介于1 和之间orA-00072: 过程""不活动orA- 00073: 敕令介于和个参数之间时应用orA-00074: 未指定过程orA-00075: 在此例程未找到过程""orA-00076: 未找到转储orA-00077: 转储无效orA-00078: 无法按名称转储变量orA-00079: 未找到变量orA-00080: 层次指定的全局区域无效orA-00081: 地址范畴[,) 弗成读orA-00082: 的内存大年夜小不在有效集合[1], [2], [4] 之内orA-00083: 警告: 可能破坏映射的SGAorA-00084: 全局区域必须为PGA, SGA 或UGAorA-00085: 当前调用不存在orA-00086: 用户调用不存在orA-00087: 敕令无法在长途例程上履行orA- 00088: 共享办事器无法履行敕令orA-00089: orADEBUG 敕令中无效的例程号orA-00090: 未能将内存分派给群集数据库orADEBUG 敕令orA-00091: LARGE_POOL_SIZE 至少必须为orA-00092: LARGE_POOL_SIZE 必须大年夜于LARGE_POOL_MIN_ALLOC orA-00093: 必须介于和之间orA-00094: 要求整数值orA-00096: 值对参数无效,它必须来自之间orA-00097: 应用oracle SQL 特点不在SQL92 级中orA-00099: 等待资本时产生超时,可能是PDML 逝世锁所致orA-00100: 未找到数据orA-00101: 体系参数DISPATCHERS 的说明无效orA-00102: 调剂法度榜样无法应用收集协定orA-00103: 无效的收集协定;供调剂法度榜样备用orA-00104: 检测到逝世锁;全部公用办事器已锁按等待资本orA-00105: 未设备收集协定的调剂机制orA-00106: 无法在连接到调剂法度榜样时启动/封闭数据库orA-00107: 无法连接到orACLE 监听器过程orA-00108: 无法设置调剂法度榜样以同步进行连接orA-00111: 因为办事器数量限制在, 因此没有启动所有办事器orA-00112: 仅能创建多达 (最多指定) 个调剂法度榜样orA-00113: 协定名过长orA-00114: 缺乏体系参数SERVICE_NAMES 的值orA-00115: 连接被拒绝;调剂法度榜样连接表已满orA-00116: SERVICE_NAMES 名过长orA-00117: 体系参数SERVICE_NAMES 的值超出范畴orA- 00118: 体系参数DISPATCHERS 的值超出范畴orA-00119: 体系参数的说明无效orA-00120: 未启用或安装调剂机制orA-00121: 在缺乏DISPATCHERS 的情形下指定了SHARED_SERVERSorA-00122: 无法初始化收集设备orA-00123: 余暇公用办事器终止orA-00124: 在缺乏MAX_SHARED_SERVERS 的情形下指定了DISPATCHERS orA-00125: 连接被拒绝;无效的演示文稿orA-00126: 连接被拒绝;无效的反复orA-00127: 调剂过程不存在orA-00128: 此敕令须要调剂过程名orA-00129: 监听法度榜样地址验证掉败''orA-00130: 监听法度榜样地址'' 无效orA-00131: 收集协定不支撑注册''orA-00132: 语法缺点或无法解析的收集名称''orA-00150: 反复的事务处理IDorA-00151: 无效的事务处理IDorA-00152: 当前会话与要求的会话不匹配orA-00153: XA 库中的内部缺点orA-00154: 事务处理监督器中的协定缺点orA-00155: 无法在全局事务处理之外履行工作orA-00160: 全局事务处理长度超出了最大年夜值()orA-00161: 事务处理的分支长度不法(许可的最大年夜长度为)orA-00162: 外部dbid 的长度超出了最大年夜值()orA-00163: 内部数据库名长度超出了最大年夜值()orA-00164: 在分布式事务处理中不许可自力的事务处理orA-00165: 不许可对长途操作进行可移植分布式自治转换ORACLE缺点一览表(2)作者ORA-00200: 无法创建操纵文件orA-00201: 操纵文件版本与orACLE 版本不兼容orA-00202: 操纵文件: ''orA-00203: 应用缺点的操纵文件orA-00204: 读操纵文件时掉足(块,# 块)orA-00205: 标识操纵文件掉足,有关详情,请检查警告日记orA-00206: 写操纵文件时掉足(块,# 块)orA-00207: 操纵文件不克不及用于同一数据库orA-00208: 操纵文件的名称数超出限制orA-00209: 操纵文件块大年夜小不匹配,有关详情,请检查警告日记orA-00210: 无法打开指定的操纵文件orA-00211: 操纵文件与先前的操纵文件不匹配orA-00212: 块大年夜小低于要求的最小大年夜小( 字节)orA-00213: 不克不及从新应用操纵文件;原文件大年夜小为,还需orA-00214: 操纵文件'' 版本与文件'' 版本不一致orA-00215: 必须至少存在一个操纵文件orA-00216: 无法从新调剂从8.0.2 移植的操纵文件大年夜小orA-00217: 从9.0.1 进行移植无法从新调剂操纵文件的大年夜小orA-00218: 操纵文件的块大年夜小与DB_BLOCK_SIZE () 不匹配orA-00219: 要求的操纵文件大年夜小超出了许可的最大年夜值orA-00220: 第一个例程未安装操纵文件,有关详情,请检查警告日记orA-00221: 写入操纵文件掉足orA-00222: 操作将从新应用当前已安装操纵文件的名称orA-00223: 转换文件无效或版本不精确orA-00224: 操纵文件重设大年夜小测验测验应用不法记录类型() orA-00225: 操纵文件的预期大年夜小与实际大年夜小不合orA-00226: 备用操纵文件打开时不许可进行操作orA-00227: 操纵文件中检测到破坏的块: (块,# 块)orA-00228: 备用操纵文件名长度超出了最大年夜长度orA-00229: 操作不许可: 已挂起快照操纵文件入队orA-00230: 操作不许可: 无法应用快照操纵文件入队orA-00231: 快照操纵文件不决名orA-00232: 快照操纵文件不存在, 已破坏或无法读取orA-00233: 操纵文件副本已破坏或无法读取orA-00234: 标识或打开快照或复制操纵文件时掉足orA-00235: 操纵文件固定表因并发更新而不一致orA-00236: 快照操作不许可: 挂上的操纵文件为备份文件orA-00237: 快照操作不许可: 操纵文件新近创建orA-00238: 操作将重用属于数据库一部分的文件名orA-00250: 未启动存档器orA-00251: LOG_ARCHIVE_DUPLEX_DEST 不克不及是与字符串雷同的目标地orA-00252: 日记在线程上为空,无法存档orA-00253: 字符限制在以内,归档目标字符串超出此限制orA-00254: 存档操纵字符串'' 时掉足orA-00255: 存档日记 (线程, 序列# ) 时掉足orA-00256: 无法翻译归档目标字符串orA-00257: 存档器缺点。
Oracle常见错误及解决办法

Oracle常见错误及解决办法Ø简介本⽂主要记录 Oracle 常见错误及解决办法,包括以下内容:1.ORA-00054: 资源正忙, 但指定以 NOWAIT ⽅式获取资源, 或者超时失效2.ORA-01034: ORACLE not available3.ORA-01261: Parameter db_recovery_file_dest destination string cannot be translated(启动数据库报错)4.ORA-12154: TNS: ⽆法解析指定的连接标识符5.ORA-12514: TNS:listener does not currently know of service requested in connect descriptor6.ORA-12541: TNS:no listener7.ORA-12560: TNS: 协议适配器错误8.ORA-27125: unable to create shared memory segment(启动数据库报错)9.ORA-28040: 没有匹配的验证协议((11g dblink 连接 12c 时)1.ORA-00054: 资源正忙, 但指定以 NOWAIT ⽅式获取资源, 或者超时失效n错误原因由于其他 Session 已经对⽬标表做了操作,并且已经有排他锁在表上了,所以新的 Session ⽆法再对表进⾏DDL操作。
n解决办法以 system ⽤户登录:1)查询被锁的会话IDselect session_id from v$locked_object;2)查询 sid, serial# 字段SELECT sid, serial#, username, osuser FROM v$session where sid = 9;3)将锁定的会话关闭ALTER SYSTEM KILL SESSION '9,99';2.ORA-01034: ORACLE not available1)检查当前数据库实例是否启动3.ORA-01261: Parameter db_recovery_file_dest destination string cannot be translated(启动数据库报错)n错误描述SQL> startupORA-01261: Parameter db_recovery_file_dest destination string cannot be translatedORA-01262: Stat failed on a file destination directoryLinux-x86_64 Error: 2: No such file or directoryn解决办法(没有效果)不知道是什么原因,导致 $ORACLE_BASE/fast_recovery_area 少了这个⽬录,⽽导致了这个错误。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.Oracle ORA-01555快照过旧的错误首先了解Oracle在什么情况下会产生ORA-01555错误:假设有一张6000万行数据的testdb表,预计testdb全表扫描1次需要2个小时,参考过程如下:1、在1点钟,用户A发出了select * from testdb;此时不管将来testdb怎么变化,正确的结果应该是用户A会看到在1点钟这个时刻的内容。
2、在1点30分,用户B执行了update命令,更新了testdb表中的第4100万行的这条记录,这时,用户A的全表扫描还没有到达第4100万条。
毫无疑问,这个时候,第4100万行的这条记录是被写入了回滚段,假设是回滚段UNDOTS1,如果用户A的全表扫描到达了第4100万行,是应该会正确的从回滚段UNDOTS1中读取出1点钟时刻的内容的。
3、这时,用户B将他刚才做的操作提交了,但是这时,系统仍然可以给用户A提供正确的数据,因为那第4100万行记录的内容仍然还在回滚段UNDOTS1里,系统可以根据SCN到回滚段里找到正确的数据,但要注意到,这时记录在UNDOTS1里的第4100万行记录已经发生了重大的改变:就是第4100万行在回滚段UNDOTS1里的数据有可能随时被覆盖掉,因为这条记录已经被提交了!4、由于用户A的查询时间漫长,而业务在一直不断的进行,UNDOTS1回滚段在被多个不同的transaction使用着,这个回滚段里的extent循环到了第4100万行数据所在的extent,由于这条记录已经被标记提交了,所以这个extent是可以被其他transaction覆盖掉的!5、到了1点45分,用户A的查询终于到了第4100万行,而这时已经出现了第4条说的情况,需要到回滚段UNDOTS1去找数据,但是已经被覆盖掉了,这时就出现了ORA-01555错误。
原因分析:"报表"程序执行时间漫长,在程序查询的过程中其他用户对"报表"进行了更新,被更新的数据写入了回滚段,当程序到回滚段找数据时,发现数据已经被覆盖掉,于是就出现了ORA-01555错误。
另外"报表"程序执行效率不高也会造成ORA-01555错误。
解决办法:1、扩大回滚段,因为回滚段是循环使用的,如果回滚段足够大,那么那些被提交的数据就能保存足够长的时间,使那些大事务完成一致性读取。
之前EBS系统UNDO表空间为9GB,目前为10GB。
见下图:2、增加undo_retention时间,因为UNDO回滚段是循环使用,里面的数据可能随时被循环覆盖掉,如果设置undo_retention时间更长,那么在retention规定的时间内,任何其他事务都不能覆盖这些数据。
目前EBS系统undo_retention为10800秒(3个小时)。
见下图:3、最重要的一点就是优化程序相关查询语句,减少查询语句的一致性读,降低读取不到回滚段数据的风险。
所有的出错信息都会纪录到数据库日志alert_PROD.log文件中,下图红线部分是一条SQL查询词句,ORA-01555很有可能是这条语句造成,把这条语句提供给开发人员来分析和优化程序代码。
ORA-01578racle的坏块即ORA-01578错,同时还可能伴随ORA-01110错,这种错误对于初学者或是那些没有实践经验的dba来说无疑是很棘手的。
我当初就深受其害,写下这篇文章则是希望对大家有所帮助。
一、出问题时的情景1、我的一个计费的入库的进程停掉,报的便是ORA-01578错,对应用相关的表tg_bill03做SQL>select from tg_cdr03 where rownum<10;这样是可以的,但做SQL>select count(*) from tg_bill03;时则报ORA-01578错。
2、检查alter<sid>.log中看到一几条报错信息:Errors in file /oracle816/app/admin/billing/udump/ora_7281_billing.trc:ORA-01578: ORACLE data block corrupted (file # 126, block # 88490)ORA-01110: data file 126: '/dev/vgjf7/rdata471'二、事后分析产生这种问题的原因1、十之八九这个Oracle的数据库server打开了异步I/O(async io)或增加了写进程。
2、硬件的I/O出现了错误。
3、操作系统的I/O或缓存出现我问题,比如操作系统对于异步I/O的补丁没有打。
4、手动的修改了数据文件中的数据,我模拟这个错误用的便是这种方式。
三、解决方法这种问题的解决方法是很多的,假如你用的是归档方式,则可以基于时间点恢复来解决。
不过这里介绍一种比较方便的解决方式,因为我的库没有开归档。
Metaline关于ORA-01578的文字也很多,不过我看过后总觉得都不那么实用,不能解决实际的问题。
1、解决这种问题的第一步是首先你要确定是什么段、哪个段坏了,是索引还是表?A、打开alter<sid>.log,找到ORA-01578的报错信息,并记录下file#及block的值,我这里是126和88490。
B、执行以下语句看哪个段坏了SQL>Select * from dba_extents2 where file_id=<F>3 and <B> between block_id and block_id+blocks-1;这里的F指的是file#,B指的是block#我的显示结果指出是tg_bill03出现了坏块。
2、假如确定下来坏的是索引段,这时你就可以轻舒一口气了,只要把这个索相删除然后重建一下就可以了,假如出现坏的是表段,则应往下走了。
3、记录下这个表的建表语句为我方便,建议使用PL/SQL Developer来完成,假如你没有可以在/plsqldev.Html去下载一个,操作步骤是这样的。
A、以表的owner用pl/sql developer连入oracleB、在左面的树状栏中找到这个表tg_bill03,右击该表->view->View SQL,记录下sql,以备以下步骤中重建索引。
4、实际处理了,以我的那个表为例A、以tg_bill03的owner连入oracleB、使用诊断事件10231SQL> ALTER SYSTEM SET EVENTS ‘10231 trace name context forever,level 10’;C、创建一个临时表tg_bill_tmp的表中除坏块的数据都检索出来SQL>CREATE TABLE tg_bill03_tmp as select * from tg_bill03;C、更名原表,并把tg_bill03_tmp为tg_bill03SQL>alter table tg_bill03 rename to tg_bill03_bak;SQL>alter table tg_bill03_tmp to tg_bill03;D、在tg_bill03上重新创建索引、约束、授权、trigger等对象E、利用表之间的业务关系,把坏块中的数据补足。
四、如何尽量减少问题及问题的损失呢分析了产生问题的原因,我认为可以采取以下几个措施1、在为提高性能为操作系统打开异步I/O时,一定要与oracle及操作系统技术支持联系把操作系统与异步I/O相关的补丁要打全。
2、制定一个良好的备份恢复策略,最好有表的eXP备份3、要及时的检查硬件的状态,及时更换驱动器部件。
ORA-01548: 已找到活动回退段'_SYSSMU1$',终止删除表空间的解决办法出现原因:在oracle的服务期控制台直接进行了数据文件的脱离的操作,提示如下:ORA-01145:除非启用了介质恢复,否则不允许紧急脱机ALTER DATABASEDATAFILE 'E:\ORACLE\ORADATA\SHAOMF\UNDOTBS01.DBF' OFFLINE DROP;症状:删除回滚段表空间(drop tablespace undotbs1 including contents)的时候报下面的错ORA-01548: 已找到活动回退段'_SYSSMU1$',终止删除表空间处理过程:1 create undo tablespace undotBS2 datafile'E:\oracle\oradata\shaomf\UNDOTBS2.DBF' size 100m;alter system set undo_tablespace=undotBS2;drop tablespace undotbs1 including contents;(进行这部操作的时候会报下面的错):ORA-01548: 已找到活动回退段'_SYSSMU1$',终止删除表空间2 修改文件E:\oracle\admin\shaomf\pfile\init.ora.162007221035,如下:undo_management=manualundo_retention=10800undo_tablespace=undotBS2_CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU 6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)3 启动服务startup pfile=E:\oracle\admin\shaomf\pfile\init.ora.1620072210354 删除表空间drop tablespace undotbs1 including contents;create undo tablespace undotBS1 datafile'E:\oracle\oradata\shaomf\UNDOTBS01.DBF' size 200m;drop tablespace undotBS2 including contents;5 修改init.ora.162007221035,如下:undo_management=autoundo_retention=10800undo_tablespace=undotBS1#_CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU 6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)6 关闭服务,并且用下面的命令重新启动服务startup pfile=E:\oracle\admin\shaomf\pfile\init.ora.1620072210357 拷贝spfile文件,原先的spfile文件做好备份create spfile='E:\oracle\ora92\database\SPFILESHAOMF.ORA' FROMpfile='E:\oracle\admin\shaomf\pfile\init.ora.162007221035';8 关闭服务器,重新启动服务器,即可。