oracle学习之undo的基本知识及事务与undo、数据块的关联
通过自己学习总结的这些undo知识能够让大家都能深刻了解oracle的undo相关原理。
一、undo撤销表空间的作用
撤销表空间通常称为undo表空间:undo表空间的段也称为撤销段或undo段、回滚段;撤销段中存放的数据就是撤销信息,这些撤销信息也称为撤销数据或undo数据。撤销段是最直接管理撤销新的逻辑层。
1.1、读写一致性
在不同的进程或用户模式下检索数据时,oracle只能给用户提供被提交的数据,这样可以确保数据的一致性。某个连接登录到数据库对某个表某个行进行update操作时未提交,其他连接查询该行数据只能查询到该行被改变之前的数据。具体实现的过程是undo段中记录该行数据的镜像,第二个连接上来,在buffer中找一个块,从Undo回滚段中找出前面的镜像,加上该行所在块其他未修改的行,合成一个块一起构造成cr块,我们叫它构造cr块,保证一致性读。
1.2、可以回滚事务
当执行修改操作如insert、delete、update操作时,旧的数据被存放到undo段中,新的数据(脏数据)在没被dbwr写到数据文件时是存放在数据文件的块所对应的buffer块中。如果影虎不想完成之前的操作就可以回滚,rollback进行回滚。
1.3、事务恢复
事务恢复是实例恢复的一部分,他是oracle服务器自动完成的,如果数据库在运行过程中出现实例失败如断电等,那么当重启oracle服务时,后天进程smon进程会自动执行实例恢复,在恢复的过程中,跑日志前滚并回滚未提交的事务。
1.4、闪回操作
11g新增了强大的闪回功能,其中很多闪回技术都是基于undo段实现的,比如闪回表,闪回事务查询,闪回版本查询。
二、undo段的初始化参数
2.1、undo_tablespace
该参数用于指定实例所要使用的undo表空间,使用自动undo管理时,通过配置该参数指定实例所使用的undo表空间。如果auto模式没有指定第一参数的话,oracle会自动选择第一个可用的undo表空间来存放undo数据,如果没有可用的undo表空间的话,oracle会使用system表空间存放undo数据,并在alter日志中告警。
2.2、undo_management
该参数用于指定undo表空间的管理模式,如auto自动管理模式,manual则为手动管理模式。
2.3、undo_retention
该参数用于控制undo数据最大保留事假,默认是900秒即为15分钟。从9i开始配置该参数指定保留时间,这个参数我是这么理解的,事务A的回滚段(已提交,该回滚段为inactive),当数据库的事务不是特比多或者基本没有其他事务,A事务undo数据可以被保存很长时间,当数据库的事务正常,可能15分钟的时候被覆盖,也可能20分钟被覆盖,但是当数据库事务繁忙,undo表空间没有空余的free expired的空间的话,A事务对应的回滚段数据可能第5分钟就被覆盖了。如果需要固定必须15分钟后才被覆盖的话,可以设置参数,
alter tablespace undotbs1 retention guarantee,则此时无法使用Inactive的undo段,如果没有free,则自动扩展,如不能扩展则优先使用expired,但是此时设置了retention guarantee,无法使用inactive,此时数据库容易产生ora-30035。我们可以通过下面语句查询回滚段信息:
select segment_name,tablespace_name,status from dba_undo_extents;
free --没有分配给任何段
active---区中有事务没有提交
inactive--区中有事务已提交,但是没有超过undo_retention时间
expired---事务提交了,也超过undo_retention时间
三、事务跟undo的关联
1、事务表
oracle在undo表空间的段中的第一个块存在一个事务表,事务表最多有47行,每一行可以放一个事务。当一个事务开始的时候,oracle给它分配一个xid事务编号,这个时候这个事务会做的第一件事就是在undo表空间找一个段,在段头块中找一行,把自己的事务信息写上,至少写上xid。oracle一个事务尽量使用一个回滚段,如果事务太多回滚段太少,这时会出现多个事务使用一个回滚段,oracle尽量均匀的将活动的事务分布在各个回滚段。总结:事务表在undo段中的一个数据块中,每一个回滚段最多同时可以有47个活动的事务。
select xid,xidusn,xidslot,xidsqn,ubablk,ubafil from v$transaction;
2、回滚段的段头块
数据库有多少回滚段
select * from v$rollname;
可以用以上的sql查看,当前有查询结果出来的这么多段头块,根据undo的负载情况系统会自动增加undo的段头块数量。查询段头块地址:
oracle学习之undo的基本知识及事务与undo、数据块的关联的更多相关文章
- ORACLE体系结构一 (逻辑结构)-表空间、段、区和数据块
一.Oracle的逻辑结构 Oracle的逻辑结构是一种层次结构.主要由:表空间.段.区和数据块等概念组成.逻辑结构是面向用户的,用户使用Oracle开发应用程序使用的就是逻辑结构.数据库存储层次结构 ...
- Oracle 学习系列之二(会话与事务级临时表和dual表 )
一. 会话临时表 --创建会话临时表create global temporary table tmp_user_session(user_id int, user_name varchar2(20) ...
- oracle学习----逻辑读
1.物理读 当数据块第一次读取到,就会缓存到buffer cache 中,而第二次读取和修改该数据块时就在内存buffer cache 清空数据缓冲区 SQL> alter session se ...
- MySQL学习总结:提问式回顾 undo log 相关知识
原文链接:MySQL学习总结:提问式回顾 undo log 相关知识 1.redo 日志支持恢复重做,那么如果是回滚事务中的操作呢,也会有什么日志支持么? 也回滚已有操作,那么就是想撤销,对应的有撤销 ...
- Oracle学习线路
出自huyangg的博客,地址是:oracle学习路线图 1.sql.pl/sql(网上有很多的视频,可以做一个简单的入手,然后看几本书,多做实验) 作为oracle的基本功,需要大家对sql和 ...
- [转]oracle学习入门系列之五内存结构、数据库结构、进程
原文地址:http://www.2cto.com/database/201505/399285.html 1 Oracle数据库结构 关于这个话题,网上一搜绝对一大把,更别提书籍上出现的了,还有很多大 ...
- Oracle 学习总结 - 物理结构
参考了很多文章,学习自网络 数据库 = 实例(数据库启动时初始的进程和内存结构,进程会作用到对应的内存区域-数据写入器到写入内存缓冲区,日志写入器到日志缓冲区等) + 数据库(物理文件-控制文件,数据 ...
- Oracle学习-Power Designer、visio 2003、Oracle sql developer、OEM、expdp
Oracle的体系太庞大了.对于刚開始学习的人来说,难免有些无从下手的感觉. 经过一学期的学习对Oracle学习有了一些深入的了解,由于之前学习过Oracle的一些主要的知识.所以学习起来上手比較快一 ...
- Oracle学习总结(8)—— 面向程序员的数据库访问性能优化法则
特别说明: 1. 本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识: 2. 本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也 ...
- Oracle手边常用70则脚本知识汇总
Oracle手边常用70则脚本知识汇总 作者:白宁超 时间:2016年3月4日13:58:36 摘要: 日常使用oracle数据库过程中,常用脚本命令莫不是用户和密码.表空间.多表联合.执行语句等常规 ...
随机推荐
- 看完这一篇,ShardingSphere-jdbc 实战再也不怕了
谈到分库分表中间件时,我们自然而然的会想到 ShardingSphere-JDBC . 这篇文章,我们聊聊 ShardingSphere-JDBC 相关知识点,并实战演示一番. 1 ShardingS ...
- 拥抱下一代前端工具链-Vue老项目迁移Vite探索
作者:京东物流 邓道远 背景描述 随着项目的不断维护,代码越来越多,项目越来越大.调试代码的过程就变得极其痛苦,等待项目启动的时间也越来越长,尤其是需要处理紧急问题的时候,切换项目启动,等待的时间就会 ...
- Chai3D之触觉设备
推荐:将 NSDT场景编辑器 加入你的3D开发工具链 介绍 触觉设备是一种双向仪表/致动的人机界面,由人类操作员用于与计算机模拟虚拟环境进行主动交互.触觉设备可以是鼠标.方向盘.指垫.机器人手柄. ...
- ChatGpt聊天API使用
昨天ChatGpt发布了聊天API,新增了两个模型,目前还是测试阶段 gpt-3.5-turbo 功能强大的GPT-3.5模型,专门针对聊天做了优化 gpt-3.5-turbo-0301 此模型只支持 ...
- Reverse for 'blog_detail.html' not found.解决方法
初学django遇到了以下问题: 查找解决方法的时候发现有以下几个原因: 1.字母打错 2.多加了空格 随后 我发现 报错的代码中多加了'.html'..删掉后就没问题了.
- python链接数据库
一.链接数据库 #sql1.py import pymysql # user=input('用户名: ').strip() # pwd=input('密码: ').strip() #链接 # conn ...
- maven打包找不到本地jar包的解决方法
有时候我们在项目中会引入一些本地jar包,在maven打包时会找不到这些jar,我们需要在pom.xml中的 <pluginManagement> <plugins> < ...
- Java虚拟机中 -XX:+PrintFlagsFinal与XX:+PrintCommandLineFlags 中MaxHeapSize的值不同的原因
size_t CollectorPolicy::compute_heap_alignment() { // The card marking array and the offset arrays f ...
- PHP 调用外部接口
//1.类中定义静态方法 class FtpService{ /** * 请求外网 * @param $url 外网接口url * @param bool $params 参数,拼接字符串 post请 ...
- SDN实验环境安装