oracle-snapshot too old 示例
一、快照太老例子:
1、创建一个很小的undo表空间,并且不自动扩展。
create undo tablespace undo_small
datafile '/u01/app/oracle/oradata/prod/undo_small01.dbf' size 2m
autoextend off;
2、让系统使用该undo表空间
alter system set undo_tablespace = undo_small;
3、用普通用户创建一张表,我们将建立表T 来查询和修改。注意我们在这个表中随机地对数据排序。CREATE TABLE AS
SELECT 力图按查询获取的顺序将行放在块中。我们的目的只是把行弄乱,使它们不至于认为有某种顺序,
从而得到随机的分布::
create table t
as
select *
from all_objects
order by dbms_random.random;
4、创建一个主键约束,目的是创建一个索引:
alter table t add constraint t_pk primary key(object_id);
5、收集表的统计信息,目的是让优化器使用索引:
exec dbms_stats.gather_table_stats( user, 'T', cascade=> true );
6、现在开始修改表:
begin
for x in ( select rowid rid from t )
loop
update t set object_name = lower(object_name) where rowid = x.rid;
commit;
end loop;
end;
7、在运行这个修改的同时,我们在另一个会话中运行一个查询。这个查询要读表T,并处理每个记录。
获取下一个记录之前处理每个记录所花的时间大约为1/100 秒(使用DBMS_LOCK.SLEEP(0.01)来模拟)。在
查询中使用了FIRST_ROWS 提示,使之使用前面创建的索引,从而通过索引(按OBJECT_ID 排序)来读出表
中的行。由于数据是随机地插入到表中的,我们可能会相当随机地查询表中的块。这个查询只运行几秒就
会失败:
declare
cursor c is
select /*+ first_rows */ object_name
from t
order by object_id;
l_object_name t.object_name%type;
l_rowcnt number := 0;
begin
open c;
loop
fetch c into l_object_name;
exit when c%notfound;
dbms_lock.sleep( 0.1 );
l_rowcnt := l_rowcnt+1;
end loop;
close c;
exception
when others then
dbms_output.put_line( 'rows fetched = ' || l_rowcnt );
raise;
end;
8、解决办法:
可以看到,在遭遇ORA-01555:snapshot too old 错误而失败之前,它只处理了253 个记录。要修正
这个错误,我们要保证做到两点:
1、数据库中UNDO_RETENTION 要设置得足够长,以保证这个读进程完成。这样数据库就能扩大undo 表空间来保留足够的undo,使我们能够完成工作。
2、undo 表空间可以增长,或者为之手动分配更多的磁盘空间。
对于这个例子,我认为这个长时间运行的进程需要大约600 秒才能完成。我的UNDO_RETENTION 设置
为900(单位是秒,所以undo 保持大约15 分钟)。我修改了undo 表空间的数据文件,使之一次扩大1MB,
直到最大达到2GB:
这里没有收到错误,我们成功地完成了工作,而且undo 扩大得足够大,可以满足我们的需要。
在这个例子中,之所以会得到错误只是因为我们通过索引来读表T,而且在全表上执行随机读。如果不是
这样,而是执行全表扫描,在这个特例中很可能不会遇到ORA-01555 错误。原因是SELECT 和UPDATE 都要
对T 执行全表扫描,而SELECT 扫描很可能在UPDATE 之前进行(SELECT 只需要读,而UPDATE 不仅要读还
有更新,因此可能更慢一些)。如果执行随机读,SELECT 就更有可能要读已修改的块(即块中的多行已经
被UPDATE 修改而且已经提交)。这就展示了ORA-01555 的“阴险”,这个错误的出现取决于并发会话如何访
问和管理底层表。
oracle-snapshot too old 示例的更多相关文章
- Oracle中创建触发器示例及注意事项
1.oracle 中创建触发器示例 CREATE TABLE "CONCEPT"."FREQUENCYMODIFYLOG" ( "FREQUENCYI ...
- oracle常用函数及示例
学习oracle也有一段时间了,发现oracle中的函数好多,对于做后台的程序猿来说,大把大把的时间还要学习很多其他的新东西,再把这些函数也都记住是不太现实的,所以总结了一下oracle中的一些常用函 ...
- Oracle Merge备忘示例
Oracle的merge语法非常实用,用于Insert.Update判断情况.以下是自己书写的一个示例,以免时间长了语法形式忘记了. MERGE INTO T_FR_GUOSZX T USING (S ...
- Oracle Flashback和RMAN示例
作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/5346833.html 环境: Windows 10 专业版 Oracle Database 12c R ...
- oracle 全文检索创建脚本示例
--创建全文索引 grant execute on ctx_ddl to username;--使用其他帐号对username授权exec ctx_ddl.create_preference('my_ ...
- Mybatis之Oracle增删查改示例--转
http://blog.csdn.net/bingjie1217/article/details/21088431?utm_source=tuicool&utm_medium=referral ...
- Oracle TDE的数据加密示例并用logminer验证加密效果
1.确认数据库版本 2创建密钥钱包 3创建加密列的表并初始值 4演示TDE的数据加密示例 5 logminer验证加密效果
- ORACLE CHECK CONSTRAINT使用示例(转载) .
看下面的例子: CREATE TABLE temp (age NUMBER(3)); ALTER TABLE temp ADD CONSTRAINT ck_temp_age CHECK ((A ...
- Oracle游标的使用示例
此文是使用Oracle游标的几种方式,for...in会自动打开游标,fetch...into需要手动打开游标,游标类似于一个只会往前移动的指针,每次指向数据集中的一行数据,通过游标可以打开数据集,也 ...
- Oracle expdp/impdp 使用示例
1. 创建目录 使用数据泵之前,需要创建一个存放文件的目录. 这个目录要写入Oracle的数据字典中才能识别. (1)先查看一下已经存在的目录: SQL> col owner format a5 ...
随机推荐
- SQL server聚合函数、数学函数、字符串函数
一.基础语句 二.数学函数与字符串函数 三.练习 1.创建一个学生信息表,根据要求写出程序 2.新建一个超市表,进了十种商品,个数都是十件
- Guava的一些总结
guava是java API蛋糕上的冰激凌(精华). 源码包的简单说明: com.google.common.annotations:普通注解类型. com.google.common.base: ...
- [LeetCode#274]H-Index
Problem: Given an array of citations (each citation is a non-negative integer) of a researcher, writ ...
- 大数A-B
还没写过大数减法,今天比赛还WA了两次... #include<iostream> #include<string> using namespace std; void sub ...
- Apache log4net™ Config Examples
Overview This document presents example configurations for the built-in appenders. These configurati ...
- “ORA-12545: 因目标主机或对象不存在,连接失败”怎么办?
大概知道是因为主机名或者IP地址的原因引起的,但是不知道究竟,就去百度上查了查,然后就根据几种答案做出了以下就该: 1.E:\oracle\product\10.2.0\db_1\NETWORK\AD ...
- [回顾]SVE回顾
SVE回顾 写完后的自评:书写太过凌乱,基本无法阅读. 前几日,SVE通过了TR5,虽说是一个小得不能再小的项目,即使到最后也存在一些未能解决的问题,但在用户的通融下还是在超期一段时间后写下了一个暂时 ...
- mapreduce 倒排索引的建立
大道至简 http://blog.csdn.net/hguisu/article/details/7969757 1.map的输入 key: 文档 id value: 文档内容 输出: key ...
- 怎么样把UIImage保存到相册
需要保存的图片放在UIImage里面,保存只需要运行一下代码: UIImageWriteToSavedPhotosAlbum(outputImage, nil, nil, nil);
- SVN 资源库报错 E175002
遇到一个问题, svn: E175002: OPTIONS request failed on '/' Connection timed out: connect 试了网上好多办法,都没有,最后公司大 ...