如何解决Oracle测试数据库中的ORA-1555错误

2025-05-04 15:00:23
推荐回答(2个)
回答(1):

解决Oracle测试数据库中的ORA-1555错误:
现象:
应用的夜维从夜里00:00开始执行,但因为hang的原因(暂时猜测为夜维处理的某条数据和当前应用正常处理的某条数据相同,出现前后等待同一资源锁的现象),直到第二天白天09:25左右才继续执行,但此时应用日志记录:
snapshot too old: rollback segment number 29 with name "_SYSSMU29$" too small
原因分析:
因hang导致夜维的DELETE语句一直处于等待状态(超过一天),直到资源锁释放,但此时由于开始存放于UNDO中的前镜像超过UNDO_RETENTION参数设置的时间,且这是高并发的一个系统,很快可能就会被应用session覆盖UNDO中的记录,导致无法找到UNDO中的记录产生一致性读,因此报错ORA-1555,此次执行失败。

引申:
不过从这个报错现象可以接触到ORA-1555这个经典的错误号,尤其是在生产中,也是一种不多见的情况,尤其在现在UNDO基本都是用Oracle自动管理方式,且磁盘空间分配都比较大的情况下。

这个ORA-1555的错误是Oracle回滚段错误中的一种经典。UNDO用于记录DML操作数据的前镜像,ORA-1555的错误简单用一句话总结,我觉得就是当DML语句需要用UNDO记录的数据找到前镜像时,该记录已经被覆盖,导致无法利用UNDO中的记录完成一致性读。当然Oracle也有UNDO_RETENTION等参数避免这种情况的产生,但仍旧可能发生,原因有多种,解决方法也有多种,下面就简单说明介绍下。

从原因来讲,ORA-1555的错误原因归为两种,一是一致性读,一个是延迟块(锁)清除。

回答(2):

在orcal的配置过程中 经常会出现监听的问题 也让人 很恼火
今天 listner的配置都是ok的
可是
sqlplus systm/system 是ok的
但是sqlplus system/sysetem@orcl就不可以 ora-12514的错误

后来 发现是环境变量的问题
在listener.ora中 添加 全局的服务解析
(SID_DESC =
(GLOBAL_DBNAME = ORCL)
(ORACLE_HOME = E:/oracle/product/10.1.0/Db_1)
(SID_NAME = ORCL)
)

添加后
# listener.ora Network Configuration File: E:/oracle/product/10.1.0/Db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = E:/oracle/product/10.1.0/Db_1)
(PROGRAM = extproc)
)

)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
)
)

这样就ok了