ORA-01555经典错误
--创建undo表空间时固定表空间的大小
sys@TDB112>create
undo tablespace undo_small
2
datafile'/u01/app/oracle/oradata/TDB112/undo_small.dbf'
3 size
2m
4
autoextend off;
--切换表空间为定义的小的undo表空间
sys@TDB112>alter
system set undo_tablespace=undo_small;
--创建测试表,并且要求数据是随机产生的
sys@TDB112>create
table t
2 as
3
select * from all_objects
4
order by dbms_random.random;
--创建一个主键约束,目的是创建一个索引:
sys@TDB112>alter
table t add constraint t_pk primary key(object_id);
--收集表的统计信息,目的是让优化器使用索引:
sys@TDB112>exec
dbms_stats.gather_table_stats( user, 'T', cascade=> true );
--大量更新操作
sys@TDB112>begin
2 for
x in ( select rowid rid from t )
3 loop
4
update t set object_name = lower(object_name) where rowid = x.rid;
5
commit;
6 end
loop;
7 end;
8 /
--
在运行这个修改的同时,我们在另一个会话中运行一个查询。这个查询要读表T,并处理每个记录。
获取下一个记录之前处理每个记录所花的时间大约为1/100
秒(使用DBMS_LOCK.SLEEP(0.01)来模拟)。在
查询中使用了FIRST_ROWS
提示,使之使用前面创建的索引,从而通过索引(按OBJECT_ID 排序)来读出表
中的行。由于数据是随机地插入到表中的,我们可能会相当随机地查询表中的块。这个查询只运行几秒就
会失败:
sys@TDB112>declare
2
cursor c is
3
select /*+ first_rows */ object_name
4 from
t
5
order by object_id;
6
l_object_name t.object_name%type;
7
l_rowcnt number := 0;
8
begin
9 open
c;
10 loop
11
fetch c into l_object_name;
12 exit
when c%notfound;
13
dbms_lock.sleep( 0.1 );
14
l_rowcnt := l_rowcnt+1;
15 end
loop;
16
close c;
17
exception
18 when
others then
19
dbms_output.put_line( 'rows fetched = ' || l_rowcnt );
20
raise;
21 end;
22 /
declare
*
ERROR at line 1:
ORA-01555: snapshot
too old: rollback segment number 14 with name "_SYSSMU14_2266994445$"
too small
ORA-06512: at line
20
报错分析:
1、undo表空间太小;
2、因为在更新是一行一行按照原来插入数据的顺序地更新的,减少了对每个指定行更新前的查找记录的时间;相反,对于上面的查询来说,
因为不是按照原来插入数据的顺序查找数据的,而是按照自己object_id排好序的顺序查找数据的。所以下面的查询语句必定比上面的更
新语句执行的慢,所需要的时间也比较的长。这样就有可能发生这样的情况:当查询语句需要查一行数据时,但是该行数据已经被更新语
句在很久以前就已经被更新修改过并且已经提交掉,因为UNDO表空间很小,又由于更新采用的是循环更新操作,使得UNDO表空间被循环利用,
在循环中后面的更新语句所产生的UNDO数据会覆盖掉之前产生的UNDO数据,造成此时查询语句查找不到在查找开始的时间点上该行记录的
数据,则会报ORA-01555。
-----------------------------------------------------------------------------------------------------
对上面出现的问题进行解决需要做两件事情:
1、对UNDO_RETENTION参数需要设置的大点,设置为允许读数据进程全部完成所需要的最长时间;
2、在调大UNDO_RETENTION参数值同时,需要将undo_tablespace的大小也需要设置的大点;
如果是自动管理UNDO表空间,则设置为自动增长;
如果是手动管理UNDO表空间则分配更多的磁盘空间给UNDO表空间
对于上面的例子:
1)对于上面的查询需要的时间小于900s,执行时间大概为780s,通过
sys@TDB112>show
parameter undo_retention
NAME TYPE VALUE
------------------------------------
----------- ------------------------------
undo_retention integer 900
查询UNDO_RETENTION原来的值为900s,UNDO_RETENTION参数值是足够的,所以先不需要修改;
2)由于原来的UNDO表空间为2M,是不可以自动增长的,所以设置UNDO表空间为自动增长,以1M的速度增长,并且最大设置为2G;
sys@TDB112>select
file_name
2 from
dba_data_files
3
where tablespace_name='UNDO_SMALL';
FILE_NAME
-----------------------------------------------
/u01/app/oracle/oradata/TDB112/undo_small.dbf
sys@TDB112>alter database datafile
'/u01/app/oracle/oradata/TDB112/undo_small.dbf' autoextend on next 1m maxsize
2048m;
做了上面的修改操作之后,下面来重新同时执行上面的更新语句和查询语句,就不会有ORA-01555错误产生;
11g官方文档叙述:
ORA-01555: snapshot too old: rollback segment number string with name "string" too small
Cause: rollback records
needed by a reader for consistent read are overwritten by other writers
Action: If in Automatic Undo
Management mode, increase undo_retention setting. Otherwise, use larger
rollback segments
ORA-01555经典错误的更多相关文章
- iOS开发——项目实战总结&经典错误一
经典错误一 No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7, VA 运行报错 出现的原因:armv7s ...
- C#socket通讯两个最经典错误解决方案
1.经典错误之 无法访问已释放的对象. 对象名:“System.Net.Sockets.Socket” (1).问题现场 (2).问题叙述 程序中的某个地方调用到了socket.close ...
- iOS----------常见经典错误
最近使用cocoapods集成友盟 发现几个经典错误 1.clang: error: linker command failed with exit code 1 (use -v to see in ...
- 10 个 MySQL 经典错误【转】
Top 1:Too many connections(连接数过多,导致连接不上数据库,业务无法正常进行) 问题还原 mysql> show variables like '%max_connec ...
- 四十八:数据库之alembic常用命令和经典错误的解决办法
常用命令:1.init:创建一个alembic仓库2.reversion:创建一个新的版本3.--autogenerate:自动将当前模型的修改,生成迁移脚本4.-m:message,可以记录本次迁移 ...
- Python编程的10个经典错误及解决办法
接触了很多Python爱好者,有初学者,亦有转行人.不论大家学习Python的目的是什么,总之,学习Python前期写出来的代码不报错就是极好的.下面,严小样儿为大家罗列出Python3十大经典错误及 ...
- 抛弃 .NET 经典错误:object null reference , 使用安全扩展方法? 希望对大家有帮助---Bitter.Frame 引用类型的安全转换
还是一样,我不喜欢长篇大论,除非关乎我设计思想领域的文章.大家过来看,都是想节省时间,能用白话表达的内容,绝不长篇大论.能直接上核心代码的,绝不上混淆代码. 长期从事 .NET 工作的人都知道..NE ...
- MySQL数据库“十宗罪”【十大经典错误案例】
原文作者:张甦 来源:http://blog.51cto.com/sumongodb 今天就给大家列举 MySQL 数据库中,最经典的十大错误案例,并附有处理问题的解决思路和方法,希望能给刚入行,或数 ...
- javascript入门经典(第五版)-清华出版社之“经典”错误
学校教材太烂,于是自己买书. 果然是入门经典,开篇就把我惊着了~ 第九页≯1.4/ch1_example2.html / <script> //script block 2 documen ...
- 这十个MySQL经典错误
今天就给大家列举 MySQL 数据库中,最经典的十大错误案例,并附有处理问题的解决思路和方法,希望能给刚入行,或数据库爱好者一些帮助,今后再遇到任何报错,我们都可以很淡定地去处理.学习任何一门技术的同 ...
随机推荐
- 制作windows镜像
下载包含windows驱动的iso: http://222.186.58.77/virtio-win-0.1-30.iso?fid=kF46uzxlPMrgvLDErP0ohhZYwAUASLoCAA ...
- 关于css的伪类和伪元素
现在才发现自己一直没有分清楚css的伪类和伪元素啊,so,总结一下. CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪元素用于将特殊的效果添加到某些选择器. 可以明确两点,第一两者都与选择器相 ...
- JAVA基础--继承中的构造方法
1. 子类的构造方法必须调用父类的构造方法 2. 子类在自己的构造方法中使用super(argument_list)调用父类的构造方法, 使用this(argument_list)调用自己的其他的构造 ...
- java中堆和堆栈的区别
java中堆和堆栈的区别(一) 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取 ...
- H5手机开发锁定表头和首列(惯性滚动)解决方案
前端时间移动端在做表格的时候需要这个功能,由于还有实现类似原生的惯性滚动功能,于是使用了iscroll插件. iscroll插件下载地址:iscroll5 该功能demo github地址: http ...
- 用div做下拉列表
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- HUST 1372 marshmallow
很简单的博弈题.....算几组能得到规律了. 某个状态先手要赢 等价于 之前有一种状态是后手赢,先手可以保证让现在这个状态到达那个状态 #include<cstdio> #include& ...
- N皇后问题——递归求解
比较简单,废话不说,上代码: public class NQueen { //比如:position[1]=3,表示第一行的第三列有一个皇后 private int [] position; //总的 ...
- 流水线技术原理和Verilog HDL实现(转)
源:流水线技术原理和Verilog HDL实现 所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执 ...
- android NDK编译(导入).a文件和编译多个so文件(转)
源:android NDK编译(导入).a文件和编译多个so文件 一.编译一个静态库 libstatic_android.a LOCAL_PATH := $(call my-dir) include ...