如何解决Oracle ORA-01555错误

首先了解Oracle在什么情况下会产生ORA-01555错误:

假设有张table1的表,里面有6000万行数据,假设预计全表扫描1次需要2个小时,从过程来看:

1、在1点钟,用户A发出了select * from table1;此时不管将来table1怎么变化,正确的结果应该是用户A会看到在1点钟这个时刻的内容。

2、在1点30分,用户B执行了update命令,更新了table1表中的第4000万行的这条记录,这时,用户A的全表扫描还没有到达第4000万条。毫无疑问,这个时候,第4000万行的这条记录是被写入了回滚段,假设是回滚段UNDOTS1,如果用户A的全表扫描到达了第4000万行,是应该会正确的从回滚段UNDOTS1中读取出1点钟时刻的内容的。

3、这时,用户B将他刚才做的操作提交了,但是这时,系统仍然可以给用户A提供正确的数据,因为那第4000万行记录的内容仍然还在回滚段UNDOTS1里,系统可以根据SCN到回滚段里找到正确的数据,但要注意到,这时记录在UNDOTS1里的第4000万行记录已经发生了重大的改变:就是第4000万行在回滚段UNDOTS1里的数据有可能随时被覆盖掉,因为这条记录已经被提交了!

4、由于用户A的查询时间漫长,而业务在一直不断的进行,UNDOTS1回滚段在被多个不同的transaction使用着,这个回滚段里的extent循环到了第4000万行数据所在的extent,由于这条记录已经被标记提交了,所以这个extent是可以被其他transaction覆盖掉的!

5、到了1点45分,用户A的查询终于到了第4000万行,而这时已经出现了第4条说的

情况,需要到回滚段UNDOTS1去找数据,但是已经被覆盖掉了,于是就出现了ORA-01555错误。

解决办法:

1. 扩大回滚段,因为回滚段是循环使用的,如果回滚段足够大,那么那些被提交的数据就能保存足够长的时间,使那些大事务完成一致性读取。UNDO表空间设的足够大

2. 增加undo_retention时间,因为UNDO回滚段是循环使用,里面的数据可能随时被循环覆盖掉,如果设置undo_retention时间更长,那么在retention规定的时间内,任何其他事务都不能覆盖这些数据。

3. 最重要的一点就是优化程序相关查询语句,减少查询语句的一致性读,降低读取不到回滚段数据的风险。所有的出错信息都会纪录到数据库日志alert_PROD.log文件中,检查log文件找到相应的SQL词句,把这条语句提供给开发人员来分析和优化程序代码。比如把一个大的查询分解成几个小的查询等

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

时间: 2024-09-24 22:09:16

如何解决Oracle ORA-01555错误的相关文章

如何解决oracle的ORA-16014错误

Flash Recovery Area空间不足导致数据库不能打开或hang住 1.问题以及解决过程 SQL> select status from v$instance; STATUS ------------ MOUNTED SQL> alter database open; alter database open * 第 1 行出现错误: ORA-16014: 日志 2 的序列号 27 未归档, 没有可用的目的地 ORA-00312: 联机日志 2 线程 1: 'D:/ORACLE/PRO

解决jdbc连接oracle协议适配器错误

oracle|错误|解决 解决oracle协议适配器错误 现象:jdbc连接oracle817 for Linux出现适配器错误,sqlplus连接正常. 方法:编辑init.ora文件屏蔽 mts_dispatchers = "(PROTOCOL=TCP)(SER=MODOSE)" 重新启动oracle. import java.sql.*;import java.lang.*;import java.util.*; class testjdbc { public static vo

Oracle数据库ORA 54013错误的解决办法_oracle

ORA-54013: 不允许对虚拟列执行 INSERT 操作 这是Oracle 11 的新特性 -- 虚拟列. 在以前的Oracle 版本,当我们需要使用表达式或者一些计算公式时,我们会创建数据库视图,如果我们需要在这个视图上使用索引,我们会创建基于函数的索引.现在Oracle 11允许我们直接在表上使用虚拟列来存储表达式.虚拟列的值是不存储在磁盘的,它们是在查询时根据定义的表达式临时计算的.我们不能往虚拟列中插入数据,我们也不能隐式的添加数据到虚拟列,我们只能使用物理列来插入数据.然后可以查询

plsql连接oracle数据库报ora 12154错误解决方法_oracle

plsql连接oracle数据库报ora 12154错误 今天遇到一个问题,使用sqlplus能够连接到远程的数据库,但是使用plsql却连接不上,报错"ORA-12154: TNS: 无法解析指定的连接标识符" 解决方法如下: 1.先检查服务器端的监听服务是否打开,如果没有打开请启动其监听 客户端:tnsping <tns_name> 服务器Linux下: #>lsnrctl status 查看监听状态 #>lsnrctl start 启动监听 2.通过Sql

Oracle的常见错误及解决办法

                      ORA-12528: TNS:listener: all appropriate instances are blocking new connections     ORA-12528问题是因为监听中的服务使用了动态服务,实例虽然启动,但没有注册到监听.实例是通过PMON进程注册到监听上的,而PMON进程需要在MOUNT状态下才会启动.所以造成了上面的错误. 解决这个问题,有三种方法:1.把监听设置为静态:2.在tnsnames.ora中追加(UR=

Oracle ORA 07445 evaopn2()+128错误问题的解决方案_oracle

问题描述 Plsql developer执行一段sql报错: 经查alert log详细报错信息为: ORA-07445: exception encountered: core dump [evaopn2()+128] [SIGSEGV] [Address not mapped to object] [0x000000000] [] [] 数据库版本 10.2.0.4.0 问题原因 复杂视图合并问题导致的oracle bug 解决方法 1.修改隐藏参数: alter system set "_

Oracle数据库配置错误信息

oracle|错误|数据|数据库     Oracle数据库配置错误信息     Oralce数据库的错误信息经常会出现,我们看见的都是错误的代码,至于错误原因究竟是什么还一时半会难以解答,所以就把一些常见的错误整理了一下,来看看也许对你有帮助的.1.   Oracle客户端网络配置:          在Oralce产品安装完成后,为了与数据库服务器进行连接或者是两台数据库之间进行数据复制,则必须进行网络连接配置.          Oracle9i Net Service配置方法:     

解决Oracle 9i和Tomcat端口冲突

问题:1.同时安装Desktop.Engine,Engine部分控件不能用,老是提示要授权.2.将Desktop卸载,Engine大多数控件能用,少部分不能用. 问题关键:Engine授权文件有问题.现在网上Engine9.0的授权文件版本太多了,但有些可以,有些是不能用的.其实我就是被这个问题所困,迟迟不能解决,现将可用的Engine9.0授权文件公布如下(绝对可用):3dengine,9,ecp379783729,none,D7MGJE2110L5J9HSX169designer,9,ecp

Oracle建库错误的排除

  一次Oracle建库错误的排除,无法在指定的范围内为以下进程分配端口解决 前几天安装Oracle数据库.按照说明配置Linux环境,安装rpm,然后先安装10.2.0.1安装包,完了之后又安装10.2.0.4补丁,最后打em补丁.到这一切正常,我开始用dbca创建数据库,结果报错误如下: 1 严重: 无法在指定的范围内为以下进程分配端口: JMS [5540-5559],RMI [5520-5539],Database Control [5500-5519],EM Agent [3938]

解决oracle客户端可以连接11g rac vip,但是不能连接scan ip问题

local不用动,remote_listern按我说的设置一下,应该就可以了! # Public Network - (eth0) 10.4.56.39    syquadb1 10.4.56.40    syquadb2 # Public Virtual IP (VIP) addresses - (eth1) 10.4.56.41    syquadb1-vip 10.4.56.42    syquadb2-vip # Private Interconnect - (bond0:eth2 et