- 浏览: 631120 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
d1438138:
[img][/img]
google api 的一些神奇使用 -
waykingeye:
[i][b][u]引用[list]
[*][img][url] ...
No result defined for action and result input -
tss0823:
...
No result defined for action and result input -
yahier:
有什么办法能够捕捉,然后给出自定义的提示呢
No result defined for action and result input -
chen_lian:
恩恩 按照上面的代码测试一下觉得很对
java创建目录
写了段java操作数据库的代码
String getIPList="select t.dns_ip from t_dnscachetotal t where t.locid=0"; String getLocid="select t3.locid from (select max(t2.ipstart) ipstart,max(t2.ipend) ipend from t_GGMAP_IP t2 where t2.ipstart<=query_ip(?)) t1,t_GGMAP_IP t3 where t1.ipend>=query_ip(?) and t1.ipstart=t3.ipstart"; String updateDnsCacheTotal="update t_dnscachetotal t set t.locid=? where t.dns_ip=?"; pstmt=con.prepareStatement(getIPList); rs=pstmt.executeQuery(); String ip; ResultSet rs2; int countupdate=0; while(rs.next()){ ip=rs.getString(1); pstmt2 = con.prepareStatement(getLocid); pstmt2.setString(1, ip); pstmt2.setString(2, ip); rs2=pstmt2.executeQuery(); int locid=-1; while(rs2.next()){ locid=rs2.getInt(1); } pstmt2.close(); rs2.close(); countupdate++; pstmt2=con.prepareStatement(updateDnsCacheTotal); pstmt2.setInt(1, locid); pstmt2.setString(2, ip); pstmt2.executeUpdate(); pstmt2.close(); } pstmt.close(); rs.close();
大体就这样。。我删了一部分代码。
核心的问题就在于
while(rs.next()){
}
因为rs.next实际上是对oracle某表持续的查询,而在循环中又在不断地update这个表,从而导致了这个1555错误,
假设有一张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错误。
明显我是犯了同样的错误。而解决办法大致有三个
首先:
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
可以看到我们是自动管理undo的,(11g),另外undo_retention时间是900s,这个是可以考虑放大的,
该参数用来指定UNDO段中数据保存的最短时间,以秒为单位,是一个动态参数,完全可以在实例运行时随时修改,通常默认是900秒,也就是15分钟。
首先要注意,UNDO_RETENTION只是指定UNDO段中数据的过期时间,并不是说,UNDO段中的数据一定会在UNDO表空间中保存15分钟。如一个新事务开始的时候,如果此时UNDO表空间已经被写满,则新事务的数据会自动覆盖已提交事务的数据,而不管这些数据是否已过期,因此呢,这就又关联回了第一点,当你创建一个自动管理的UNDO表空间时,还要注意其空间大小,要尽可能保证UNDO表空间有足够的存储空间。
同时还要注意,也并不是说,UNDO_RETENTION中指定的时间一过,已经提交事务中的数据就立刻无法访问,当超出UNDO_RETENTION参数指定的时间后,这部分数据占用的空间将会被标识为可重用,不过只要不被别的事务触发的数据覆盖,它会仍然存在,并可以随时被Flashback特性引用。如果你的UNDO表空间足够大,而数据库又不是那么繁忙,那么其实UNDO_RETENTION参数的值并不会影响到你,哪怕你设置成1(这么说好像绝对了点,大家一定要注意理解,别钻牛角尖),只要没有事务去覆盖UNDO数据,这部分数据就会持续有效。因此呢,再次重复那句话,要注意UNDO表空间的大小,保证其有足够的存储空间。
最后,只有在一种情况下,UNDO表空间能够确保UNDO中的数据在UNDO_RETENTION指定时间过期前一定有效,就是为UNDO表空间指定RETENTION GUARANTEE,指定之后,不会覆盖UNDO表空间中未过期的UNDO数据,例如:
SQL> ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE; 如果想禁止UNDO表空间RETENTION GUARANTEE,例如:
SQL> ALTER TABLESPACE UNDOTBS1 RETENTION NOGUARANTEE; 转了一圈,问题又回来了,既然它看起来有用又像没有用,为什么还要设置它呢?嘿嘿,就我理解,其存在的真实用途,就是提醒你UNDO表空间很重要,给它指定分配一个合适的大小更重要哟。
但是从这篇文章中明显发现,undo_retention参数意义很小,而且默认的TABLESPACE UNDOTBS1 一般都是NOGUARANTEE,这个是一个考虑解决1555错误的方法,但是我个人觉得大部分情况绝不是因为undo_retention过小引起的,应该都是因为UNDOTBS1 占满了的缘故,所以
1、扩大回滚段
因为回滚段是循环使用的,如果回滚段足够大,那么那些被提交的数据信息就能保存足够长的时间是那些大事务完成一致性读取。
2、增加undo_retention时间
在undo_retention规定的时间内,任何其他事务都不能覆盖这些数据。
3、优化相关查询语句,减少一致性读。
减少查询语句的一致性读,就降低读取不到回滚段数据的风险。这一点非常重要!
4、减少不必要的事务提交
提交的事务越少,产生的回滚段信息就越少。
5、对大事务指定回滚段
通过以下语句可以指定事务的回滚段:
SET TRANSACTION USE ROLLBACK SEGMENTrollback_segment
;
我觉得标红的都是可以考虑的方案,
我的解决方案包括了
1.while(rs.next()){
}去掉,不在rs循环内执行update,而是把rs数据全部读出,然后在进行逐条update,
2.无非就是标红的那些了
发表评论
-
pcap包处理程序的一次改进
2012-04-27 12:26 2043最近某同学的有个程序跑得好慢,疑似有点问题。程序的核心是 ... -
oracle 多表update,索引失效
2011-08-27 00:19 3375这两天在写一个sql,就是有A,B两个表,要利用b表的字 ... -
linux下oracle备份的一些心的
2011-05-04 14:16 19381.最近在做一个基于j2ee的web项目,这个项目web服务器 ... -
UPDATE GLOBAL INDEXES效果测试
2011-04-13 10:08 3728alter table T_RECORD_0510 drop ... -
ora 1653 temp不够大问题解决
2011-04-13 09:58 2047我们在为一个大约70G的表重建索引的时候发现,会报ora 1 ... -
查看索引建立执行进度
2011-04-12 20:40 6050SELECT SID, decode(totalwork, ... -
删除自动分区的存储过程
2011-04-12 20:23 1781我们设计了一个自动分区的超级大表,分区采用以时间分区的方式, ... -
sql 多行合并问题 zt
2011-04-02 15:48 1803写道 内容引自: 多行一列数据合并成一行一列数据 http: ... -
存储过程使用小结
2010-12-17 16:45 1080写道 create or replace procedure ... -
spool的小技巧以及别的sql取整
2010-12-15 12:44 1579在SQLPLUS里: 1.不显示 行头 set heading ... -
物化视图同步问题
2010-12-13 18:45 2126今天使用了下oracle的物化视图同步。过程 因为已经使用 ... -
impdp expdp使用小结
2010-12-10 11:09 1502最近我们迁移数据库,其中涉及到了数据迁移 sql如下 写道 ... -
oracle impdp ORA-39002处理
2010-12-09 12:57 13639由于数据库迁移到了redhat上,在导数据时利用impdp,结 ... -
redhat Linux5.2 安装oracle 11G(二)
2010-12-07 21:59 1535上一次我们已经验证过了rpm等问题解决了,下来就是安装了,这 ... -
redhat Linux5.2 安装oracle 11G(一)
2010-12-07 11:01 3536首先有两个帖子质量非常高很值得一看 写道 https:// ... -
关于ip区间查询sql的写法
2010-12-02 13:54 3643我们在项目中遇到了这样的一个问题,要查询ip对应的地址,采用的 ... -
PL sql小技巧
2010-11-30 19:10 965我们在使用pl/sql时有时候不想把变量写死在sql中 比如 ... -
oracle 按主键排序
2010-11-29 12:07 4474今天又遇到了个问题,我在应用中发现我们的一个web列表显示的 ... -
insert or update 的处理
2010-11-29 00:05 7922我想大家在用数据库的时候应该都遇到过这种问题,当插入一条记录时 ... -
oracle 干掉执行线程
2010-11-26 12:07 1682我们经常出现执行大数据量sql时,由于各种原因,我们想取消掉, ...
相关推荐
本文将详细介绍如何在Windows和Linux操作系统下解决ORA-00702错误。 **ORA-00702错误解析** ORA-00702错误信息表明数据库实例试图访问一个尚未完全初始化的数据文件或控制文件。这可能是由于数据库在不正常的情况下...
#### ORA-00001: Unique Constraint Violated 当尝试插入或更新违反唯一约束的数据时触发此错误。例如,在具有唯一索引的列上插入重复数据。 #### ORA-00017: Rollback Segment Full 在进行事务回滚操作时,如果...
oracle ORA-01033问题怎么解决 !! 能修复文件出错问题
### ORA-01033 错误与误删Oracle表空间文件解决方案 #### 一、背景介绍 ORA-01033 错误是Oracle数据库中常见的错误之一,该错误通常出现在数据库初始化或关闭的过程中。当遇到此错误时,可能会导致SQL*Plus无法...
- ORA-00050: 获取入队时操作系统出错。这表明操作系统在分配Oracle需要的资源时出现问题,可能需要检查系统日志以找到具体原因。 - ORA-00054: 资源正忙,要求指定NOWAIT。在执行数据库操作时,所需的资源正被其他...
- 对程序进行调试,找出具体出错位置。 - 增加错误处理机制,提高程序的健壮性和容错能力。 #### 17. ROWTYPE_MISMATCH (ORA-06504) **异常描述:** 在PL/SQL中,当尝试将一个记录类型的值赋给另一个不同类型的记录...
#### ORA-00050: 获取入队时操作系统出错 当尝试获取入队资源时遇到操作系统级别的错误。 #### ORA-00051: 等待资源超时 当等待某个资源的时间超过了系统设定的阈值时触发。 #### ORA-00052: 超过最大入队资源数 ...
### ORACLE ORA错误大全解析 #### 概述 在Oracle数据库管理与开发过程中,遇到ORA错误是非常常见的现象。这些错误通常提供了关于问题的具体位置和...同时,Oracle提供的文档和技术支持也是解决ORA错误不可或缺的资源。
5. **ORA-12005**: 提示在保存事务时出错,可能是因为提交操作被异常终止。 6. **ORA-12006**: 用户指定的名字无法解析,可能是用户定义的变量、表或视图的名称错误。 7. **ORA-12007**: 指示尝试使用的游标已被...
- **解释**: 在获取当前事务的ID时出错。 - **解决方案**: 确保数据库服务正常运行,检查日志以获取更多信息。 #### ORA-00023: Failed to open the shared memory segment - **解释**: 无法打开共享内存段。 - **...
### Oracle 错误码大全:常见错误及其解决方法 Oracle数据库是业界广泛使用的数据库管理系统之一,在实际的应用过程中可能会遇到各种各样的错误。了解这些错误代码及其含义对于快速定位问题、解决问题至关重要。...
* ORA-00050: 获取入队时操作系统出错 * ORA-00051: 等待资源超时 * ORA-00052: 超出最大入队资源数 () * ORA-00053: 超出最大入队数 * ORA-00054: 资源正忙,要求指定 NOWAIT * ORA-00055: 超出 DML 锁的最大数 * ...
5. **存储问题**:包括表空间满(ORA-01652:无法扩展临时段达到XXX字节)、回滚段问题(ORA-01555:快照过旧)等,这些问题通常需要调整数据库的存储策略或增加额外的磁盘空间。 6. **并发控制**:如ORA-00054...
- **描述**:在获取控制文件ID时出错。 - **解决方法**:检查控制文件是否损坏或丢失。 #### ORA-00023: Redo log file number not in range - **描述**:重做日志文件编号超出范围。 - **解决方法**:确认重做日志...
ORA-00050: 获取入队时操作系统出错 ORA-00051: 等待资源超时 ORA-00052: 超出最大入队资源数 ORA-00053: 超出最大入队数 ORA-00054: 资源正忙,要求指定 NOWAIT ORA-00055: 超出 DML 锁的最大数 ORA-00056: 对象 '....
当用户尝试获取入队时,Oracle 数据库将检查操作系统是否出错,如果出错,则返回 ORA-00050 错误。 十一、等待资源超时(ORA-00051) ORA-00051 错误表示等待资源超时。当用户尝试等待资源时,Oracle 数据库将检查...
Oracle 11g 内部错误代码 ORA-00600 是一个非常通用的错误,它表示数据库遇到了一个无法处理的内部错误或异常情况。这个错误通常涉及到Oracle数据库的底层结构,如数据块、索引或者内存管理等,且参数列表可以提供...