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 的“阴险”,这个错误的出现取决于并发会话如何访
问和管理底层表。

时间: 2024-10-14 10:53:00

oracle-snapshot too old 示例的相关文章

Oracle expdp/impdp 使用示例

1. 创建目录 使用数据泵之前,需要创建一个存放文件的目录. 这个目录要写入Oracle的数据字典中才能识别. (1)先查看一下已经存在的目录: SQL> col owner format a5 SQL> col directory_name format a25 SQL> select * from dba_directories; OWNER DIRECTORY_NAME            DIRECTORY_PATH ----- ------------------------

Oracle中创建触发器示例及注意事项

Oracle中创建触发器示例及注意事项 1.oracle 中创建触发器示例 CREATE TABLE "CONCEPT"."FREQUENCYMODIFYLOG" ( "FREQUENCYID" NUMBER(10,0), "NAME" NVARCHAR2(30), "CODE" VARCHAR2(10 CHAR), "MNEMONICCODE" VARCHAR2(10 CHAR), &

Oracle Flashback和RMAN示例

作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/5346833.html ? 环境: Windows 10 专业版 Oracle Database 12c Release 1 ? Flashback示例 场景1: ? 新建了一张表t_table1, 在某个时间点插入两条数据,后续又误插入一条数据,现在需要恢复到误插入数据之前的状态. ? 打开SQL Plus 用普通用户登录: ? 新建一张表t_table1: create table t_table

Oracle expdp/impdp常用示例整理

expdp不依赖和参考NLS_LANG的设置,而是完全按照数据库本身的字符集进行转换, 平时数据量不大时一直采用exp/imp导数据库,到了数据量大的时候expdp/impdp就看到效果了,一次exp导出28G的DMP文件用了3个小时,采用EXPDP用了20分钟. 1. 创建测试数据 SQL> create tablespace DATA datafile '/u01/app/oracle/oradata/orcl/DATA.dbf' size 10m autoextend on next 10

Oracle 12.2安装示例schema

在做Oracle数据库实验时都会用到一些示例SCHEMA如:HR.OE.SH等,在Oracle11g版本时在DBCA时直接勾选Sample Schemas就可以安装这些示例SCHEMA,如下图: 但到了Oracle12.2 版本,也有一个示例Schemas选项卡如下图所示: 但是数据库安装完成后却还是没有这些示例SCHEMA,到底是怎么回事呢?我们来查一下官方文档: Starting with Oracle Database 12c Release 2, the latest version o

oracle常用函数及示例

学习oracle也有一段时间了,发现oracle中的函数好多,对于做后台的程序猿来说,大把大把的时间还要学习很多其他的新东西,再把这些函数也都记住是不太现实的,所以总结了一下oracle中的一些常用函数及示例,一是为了和大家分享,二是可以在以后工作中忘记了随时查阅.废话不多说,下面直接上函数. 一.单行函数 只处理单个行,并且为每行返回一个结果. 1.字符函数 (1)concat(str1,str2)字符串拼接函数 select concat('Hello ','World') from dua

[课]13.2 Oracle TDE的数据加密示例并用logminer验证加密效果

1.确认数据库版本 2创建密钥钱包 3创建加密列的表并初始值 4演示TDE的数据加密示例 5 logminer验证加密效果

Mybatis之Oracle增删查改示例--转

http://blog.csdn.net/bingjie1217/article/details/21088431?utm_source=tuicool&utm_medium=referral oracle表结构 create table T_USERS ( ID NUMBER not null, NAME VARCHAR2(30), SEX VARCHAR2(3), BIRS DATE, MESSAGE CLOB ) create sequence SEQ_T_USERS_ID minvalu

oracle 全文检索创建脚本示例

--创建全文索引 grant execute on ctx_ddl to username;--使用其他帐号对username授权exec ctx_ddl.create_preference('my_lexer','chinese_lexer');--创建chinese_lexer词法器(中文词法分析器)exec ctx_ddl.create_preference('my_filter','CHARSET_FILTER');--创建字符过滤器exec ctx_ddl.set_attribute(

oracle 11g R2但示例安装前环境准备(针对用户,权限,内存 存储和系统参数的相关调整)

本文主要是讲oracle11gR2对系统和物理配置的相关要求以及适当的参数调整 系统: [[email protected] ~]# cat /etc/system-release CentOS release 6.7 (Final) 内核版本: [[email protected] ~]# uname -r 2.6.32-573.el6.x86_64 内核相关参数: [[email protected] ~]# vi /etc/sysctl.conf kernel.shmall = 42949