阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

关于Oracle undo表空间深入理解

465次阅读
没有评论

共计 4659 个字符,预计需要花费 12 分钟才能阅读完成。

一、回退段介绍

在 Oracle 数据库中,当某个事物对数据进行修改时,Oracle 首先将数据的原始值保存到一个回退段中。一个事物只能将它的回退信息保存到一个回退段中,而多个并行事物可以使用同一个回退段。

(1)回退段的作用

回退段主要有 4 个作用,分别是:事物回滚、数据库恢复、读一致性、闪回查询。

  – 事物回滚:当事物执行失败或用户执行回滚操作 (rollback) 时,Oracle 会利用保存在回退段中的信息将数据恢复到原来的值;

  – 数据库恢复:当数据库实例运行失败,在数据库重启恢复时,Oracle 先利用重做日志文件的信息对数据库进行恢复(包括已提交和未提交的事务),再利用回滚段中的信息回滚未提交的事务;

  – 读一致性:当一个用户对数据进行修改时,会预先将其原始值保存到回退段中,这时,如果有其它用户访问该数据,则访问回退段中的信息,使当前用户未提交的修改其他用户无法看到,保证了数据的一致性;

  – 闪回查询:通过保留在回退段中的信息,用户可以查询某个数据在过去某个时刻的状态

(2)回退段的工作方式

当事务开始时,系统分配给该事物一个回退段,在事务的整个生命周期中,当数据发生改变时,数据的原始值被复制到回退段中。回退段采用循环写的方式进行工作,当事务写满回退段的一个区之后,会接着写入回退段的下一个区,当所有的区都写满后,事务开始循环写入到第一个区或者分配新的区(datafile 为 autoextend)。回退段归用户 sys 所有,每个回退段至少包含 2 个区。

二、回退表空间的管理

(1)创建 undo 表空间

在 Oracle 11g 中,创建 undo tablespace 有 2 种方法,一种是在创建数据库时创建 undo tablespace,另一种是使用 create undo tablespace 来创建 undo tablespace。undo tablespace 用来保存事务的回退信息,用户不能在其中创建数据库对象。

我们这里介绍如何使用 craete undo tablespace 来创建 undo 表空间。

使用 create undo tablespace

CREATE [BIGFILE | SMALLFILE]UNDO TABLESPACE tbs_name
DATAFILE 'path/filename' SIZE integer [K | M] [REUSE]
[AUTOEXTEND] [OFF | ON] NEXT integer[K | M] MAXSIZE [UNLIMITED | integer [K | M] ]
[EXTENT MANAGEMENT LOCAL] [AUTOALLOCATE]
[RETENTION GUARANTEE | NOGUARANTEE] 

(2)修改 undo 表空间

可以使用 alter tablespace 修改 undo 表空间,允许对 undo 表空间进行如下操作:

  – 添加 undo 表空间的数据文件;

  – 重命名 undo 表空间的数据文件;

  – 将 undo 表空间的数据文件联机或脱机;

  – 启用或禁用保护回退信息在回退段中的保留时间;

例子 1、当 undo 表空间容量不足时,可以考虑增加新的数据文件或改变数据文件的大小

--为 undo tablespace 添加新的数据文件
alter tablespace undotbs1 add datafile '/home/app/oracle/oradata/orcl/untbs02.dbf' size 50M;

--将 undo tablespace 里面的 untbs02.dbf 文件扩充为 100M
alter database datafile '/home/app/oracle/oradata/orcl/untbs02.dbf' resize 100M;

 

(3)删除 undo 表空间

与普通表空间一样,可以使用 drop tablespace 来删除 undo 表空间,但是不能删除当前正在使用的 undo 表空间。如果在 undo 表空间中含有任何未提交的事务的回退信息,则不能使用 drop tablespace 来删除表空间。此外,即使已经使用 drop tablespace 删除了 undo 表空间,在该表空间中也可能存在未过期的回退信息,这样导致某些查询所需的回退信息丢失。因此,在删除时应该注意,不要删除这样的 undo 表空间。

 

(4)切换 undo 表空间

在数据库运行过程中,可以从一个 undo 表空间切换到另一个 undo 表空间,由于初始化参数 undo_tablespace 是一个动态参数,直接修改即可,无需重启实例,切换方式如下:

ALTER SYSTEM SET UNDO_TABLESPACE = undotbs_name

在以下情况,undo 表空间切换会发生错误:

  – 指定的 undo 表空间不存在;

  – 指定的表空间不是 undo 表空间;

  – 指定的 undo 表空间正在被其它实例使用;

在完成 undo 表空间的切换后,任何新的事物的回退信息都会进入新的 undo 表空间中,如果旧的 undo 表空间还存在未提交的事务,则旧的 undo 表空间进入“挂起脱机状态”,“挂起脱机状态”的 undo 表空间不能被新的事务使用,也不能删除,当前未提交的事务将继续使用该表空间。当所有事务都提交完成后,旧的 undo 表空间进入脱机状态。

例子 2、切换 undo 表空间

切换 undo 表空间
– 实验目的:

--   1. 学会切换 undo 表空间
--   2. 学会删除 undo 表空间    
12:40:16 SQL> show parameter undo_tablespace                                        --【窗口 1】查看当前 undo 表空间
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS1

12:45:59 SQL> insert into dept values(50,'a','b');                                  --【窗口 1】执行一条 insert 语句,且不提交
1 row inserted

SQL> alter system set undo_tablespace = UNDOTNS2;                                   --【窗口 2】切换 undo 表空间
System altered
 
SQL> show parameter undo_tablespace;                                                --【窗口 2】查看新的表空间
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTNS2


SQL> drop tablespace undotbs1 including contents and datafiles;                     --【窗口 2】删除旧的表空间,报错,提示旧的表空间正在使用
ORA-30013: undo tablespace 'UNDOTBS1' is currently in use

12:53:02 SQL> commit;                                                               --【窗口 1】提交事务

SQL> drop tablespace undotbs1 including contents and datafiles;                     --【窗口 2】过一段时间之后,成功删除
 
Tablespace dropped

(5)回退信息保留时间

前面我们讲了回退信息的 4 个作用,当我们提交了事务之后,回退信息对于事务回滚以及数据库恢复已经不再起作用。但是,对于一个长事务而言,具有读一致性的作用,保证查询到的信息一直是旧的信息。此外,数据库的各种闪回操作的实现也需要回退段中的信息。Oracle 根据 undo 表空间的大小以及事物量的多少自动调整回退信息的保留时间,可通过调整初始化参数 undo_retention 设置回退信息在回退段中的保留时间:

-- 将回退信息的保留时间设置为 1800s

SQL > ALTER SYSTEM SET UNDO_RETENTION = 1800 ;

需要注意的是,undo_retention 是 Oracle 的一个”软设置“,这个”软设置“如何理解呢?例如,当用户将 UNDO_RETENTION 参数设置为 1800s 后,Oracle 会 尽量 的将回退信息保存 1800s,但是,在这个过程中,如果回退表空间不够用了,新的回退信息依然会将未达到 1800s 的回退信息覆盖。

为了保证长时间的查询的读一致性以及各种闪回操作,我们也可以指定回退信息必须保留到 undo_retention 规定的时间,通过启用 undo 表空间的 retention guarantee 特性,保证只有过期(已提交且达到 undo_retention 设定的值)的数据才会被覆盖,即使 undo 表空间容量已经不足,也不会覆盖未过期的回退信息。

启用 retention_guarantee

SQL
> ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE;

三、查询 undo 表空间

与 undo 表空间相关的数据字典如下:

数据字典 解释
v$undostat 包含所有 undo 表空间的统计信息,用于对 undo 表空间进行监控和调整。
通过该视图,可以估计当前 undo 表空间的大小,Oracle 利用该视图完成对回退信息的自动管理,该视图数据是有最近 4 天内,每 10 分钟产生一条统计记录构成的。
v$rollstat 包含 undo 表空间中回退段的性能统计信息
v$transaction 包含事务所使用的回退段信息
dba_undo_extents 包含 undo 表空间中区的大小与状态信息
dba_hist_undostat 包含 v$undostat 的快照,主要是 4 天前的统计信息

例子 3、查询 undo 表空间中回退信息的当前状态

SQL> select tablespace_name,segment_name,extent_id,status from dba_undo_extents;

TABLESPACE_NAME                SEGMENT_NAME                    EXTENT_ID STATUS
—————————- —————————— ———- ———
UNDOTBS3                      _SYSSMU10_968665341$                    0 UNEXPIRED
UNDOTBS3                      _SYSSMU10_968665341$                   
1 EXPIRED
UNDOTBS3                      _SYSSMU9_3484649867$                   
0 UNEXPIRED
UNDOTBS3                      _SYSSMU9_3484649867$                   
1 EXPIRED
…                            …                                  …  …

undo 表空间中区的状态一共有 3 种:EXPIRED、UNEXPIRED、ACTIVE。

–EXPIRED:表示该回退信息对应的事务已经提交,保存时间超过保留区;

–UNEXPIRED:表示该回退信息对应的事务已经提交,保存时间没有超过保留区;

–ACTIVE:表示回退信息对应的事务还没有提交,该区还在使用;

更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-10/147231.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计4659字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7965207
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击 PHP-FPM(FastCGl Process M...
国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号 AI 知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率 大家好,我是星哥,...
免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

  免费无广告!这款跨平台 AI RSS 阅读器,拯救你的信息焦虑 在算法推荐主导信息流的时代,我们...
2025年11月28日-Cloudflare史诗级事故:一次配置失误,引爆全球宕机

2025年11月28日-Cloudflare史诗级事故:一次配置失误,引爆全球宕机

2025 年 11 月 28 日 -Cloudflare 史诗级事故: 一次配置失误,引爆全球宕机 前言 继今...
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手! 前言 对于个人开发者、建站新手或是想搭建测试站点的从业者...
告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

  告别 Notion 焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁” 引言 在数字笔记工...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...