管理undo(PPT-I-299-309)

7.1 undo的作用(SMON)

使用undo tablespace 存放从datafiles 读出的数据块的前镜像,提供以下四种情况所需要的信息
        
    1)回滚事务:rollback
    2)读一致性:正在做DML操作的数据块,事务结束前,其他用户读undo里面的数据前镜像
    3)实例的恢复:instance recover(undo -->rollback)
    4)闪回技术 :flashback query、flashback table等

7.2 undo 的管理模式:undo_management
    
    1)manaual 手工:roll segment(淘汰)
    2)auto 自动:undo tablespace (init parameter :undo_management  = auto)[9I之后]
       
7.3 undo 表空间管理
 
    1)可以建立多个undo表空间,但一个时刻只有一个处于active
    2)处于active状态的undo tablespace 不能offline 和 drop[undo_tablespace指定的undo表空间为active undo tablespace]

01:08:31 SQL> select tablespace_name,status,contents from dba_tablespaces;

TABLESPACE_NAME                STATUS    CONTENTS
------------------------------ --------- ---------
SYSTEM                             ONLINE    PERMANENT
UNDOTBS1                           ONLINE    UNDO
SYSAUX                             ONLINE    PERMANENT
TEMP                               ONLINE    TEMPORARY
USERS                              ONLINE    PERMANENT
EXAMPLE                            ONLINE    PERMANENT
TEST                               ONLINE    PERMANENT
                                                                                
09:47:55 SQL> select tablespace_name,status,contents from dba_tablespaces;

SQL> select tablespace_name,status ,contents from dba_tablespaces;

7.4 查看当前正在使用的undo tablespace

SQL>show parameter undo;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1

00:20:50
SQL> select * from v$rollname;

USN NAME
---------- ------------------------------
         0 SYSTEM                  //系统表空间专用段,不属于UNDO TABLESPACE
         1 _SYSSMU1_1363316212$
         2 _SYSSMU2_1363316212$
         3 _SYSSMU3_1363316212$
         4 _SYSSMU4_1363316212$
         5 _SYSSMU5_1363316212$
         6 _SYSSMU6_1363316212$
         7 _SYSSMU7_1363316212$
         8 _SYSSMU8_1363316212$
         9 _SYSSMU9_1363316212$
        10 _SYSSMU10_1363316212$

一个事务存储在一个段中,当段不足时会自动增长
一个段可以存储多个事务

7.5 切换undo

SQL> create undo tablespace undo2 datafile '/u01/data/urpdb/undo3.dbf' size 100m;
SQL> alter system set undo_tablespace=undotbs2;     //memory动态修改,如果存在未完成的事务,则事务对应的UNDO SEGMENT会复制到新的UNDO TABLESPACE                                               
SQL> show parameter undo;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS2

SQL> select * from v$rollname;

USN NAME
---------- ------------------------------
         0 SYSTEM
        11 _SYSSMU11_1357956213$
        12 _SYSSMU12_1357956213$
        13 _SYSSMU13_1357956213$
        14 _SYSSMU14_1357956213$
        15 _SYSSMU15_1357956213$
        16 _SYSSMU16_1357956213$
        17 _SYSSMU17_1357956213$
        18 _SYSSMU18_1357956213$
        19 _SYSSMU19_1357956213$
        20 _SYSSMU20_1357956213$

7.6 删除undo tablespace

SQL> drop tablespace undotbs1 including contents and datafiles;
SQL> select * from v$tablespace;

TS# NAME                           INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
         0 SYSTEM                         YES NO  YES
         1 SYSAUX                         YES NO  YES
         4 USERS                            YES NO  YES
         6 EXAMPLE                        YES NO  YES
         8 TEST                              YES NO  YES
         3 TEMP                             NO  NO  YES
         5 UNDOTBS2                   YES NO  YES

7.7 undo 数据的4种状态

1)active:  表示transaction还没有commit,不可覆盖,
2)unexpired:已经commit,但是还在undo_retention内[单位:s,用于闪回、一致性读],不可以覆盖(非强制),加GUARANTEE属性后强制undo_retention内不覆盖。
3)expired:  已经commit,且时间超过了undo_retention,随时可以覆盖。
4)free:     分配了但未使用过。

查询UNDO段的状态:
select tablespace_name,segment_name,status
from dba_undo_extents;

undo retention参数和undo autoextend on特性

undo retention参数规定了unexpired commit数据的保留期,它是保证一致性读,和大多数闪回技术成功的关键,

将undo表空间设为autoextend on, 这是DBCA创建数据库时的缺省设置, 这一个特性将在undo空间不足时优先扩展新的空间,其次才是覆盖unexpired commit。

如果undo retention=0,则Oracle会启用undo自动调优,它使用900秒作为undo retention的参考值。然后根据收集到的数据库中最长查询及撤销生成率自动调整undo retention。

考点:如果要减少ORA_O1555错误(snapshot too old),考虑延长undo retention并使之guarantee, 同时使undo autoextend on。

查看数据文件是否自动扩展
select file_name,autoextensible from dba_data_files;

7.8 关于undo_retention 参数     //这个参数只对已commit的undo状态有效

01:10:46 SQL> select tablespace_name,status,contents,retention from dba_tablespaces;

TABLESPACE_NAME                STATUS    CONTENTS  RETENTION
------------------------------ --------- --------- -----------
SYSTEM                             ONLINE    PERMANENT NOT APPLY
SYSAUX                             ONLINE    PERMANENT NOT APPLY
TEMP                               ONLINE    TEMPORARY NOT APPLY
USERS                              ONLINE    PERMANENT NOT APPLY
EXAMPLE                            ONLINE    PERMANENT NOT APPLY
TEST                              ONLINE    PERMANENT NOT APPLY
UNDOTBS2                           ONLINE    UNDO      NOGUARANTEE

guarantee属性随undo表空间建立, 可以修改

SQL> create undo tablespace undo2 datafile '/u01/data/urpdb/undo3.dbf' size 100m retention guarantee;

09:52:22 SQL> alter tablespace undo01 retention guarantee;     //保证在retention 期间不允许被覆盖

09:52:22 SQL> alter tablespace undotbs2 retention noguarantee;     //不保证在retention 期间不允许被覆盖

01:11:16 SQL> select tablespace_name,status ,contents,retention from dba_tablespaces;

缺省配置下undo retention是 noguarantee

SQL> alter tablespace undotbs2 retention noguarantee;

7.9 undo 信息的查询
 
       1) v$session      查看用户建立的session
       2) v$transaction  当前的事务
       3) v$rollname     undo段的名称
       4) v$rollstat     undo段的状态
       5)  dba_rollback_segs 数据字典里记录的undo段状态

一般来说,一个session同时只能承载一个事务,建立了session未必有事务,只有事务处于活动状态时,v$transaction才能看到这个事务。换句话说,如果看到了事务(在 v$transaction里),那一定有个session和它对应,将两个视图连在一起,信息看得更为清楚。

cmd下scott登录:
    
10:03:28 SQL> select username,sid,serial# from v$session where username is not null;    //看看有几个session连上来了。                                                                       
USERNAME                              SID    SERIAL#
------------------------------ ---------- ----------
SCOTT                                     131         18
SYS                                       170          5

cmd下 update emp1 set sal=1000 where empno=7788;       // 产生一个活动事务

SQL> select a.sid,a.serial#,a.username,b.xidusn,xidslot,b.ubablk,b.status from v$session a,v$transaction b where a.saddr=b.ses_addr;

10:08:29 SQL> col name for a10
     
     SID     SERIAL#  USERNAME                 XIDUSN    XIDSLOT     UBABLK     STATUS           
---------- ---------- -------------------- ---------- ---------- ---------- ----------------

131         18     SCOTT                        18              5        305     ACTIVE

//两表联查,sid和serial#在v$session里,在v$transaction里  XIDUSN是undo segment 的id ,XIDSLOT 是事务槽的id,UBABLK是undo块号

查询正在使用的段信息:
SELECT a.username,b.name,c.used_ublk
FROM v$session a,v$rollname b,v$transaction c
WHERE a.saddr=c.ses_addr AND b.usn=c.xidusn;

对照上面看,下面语句显示出_SYSSMU18是一个活动段, 与XIDUSN=8吻合, 说明这个段被读进buffer了.

SQL> select a.usn,b.name,a.xacts from v$rollstat a, v$rollname b where a.usn=b.usn;

USN NAME            XACTS
---------- -------------------------   --------
         0 SYSTEM                                0
        11 _SYSSMU11_1357956213$                0
        12 _SYSSMU12_1357956213$              0
        13 _SYSSMU13_1357956213$              0
        14 _SYSSMU14_1357956213$              0
        15 _SYSSMU15_1357956213$              0
        16 _SYSSMU16_1357956213$              0
        17 _SYSSMU17_1357956213$              0
        18 _SYSSMU18_1357956213$              1
        19 _SYSSMU19_1357956213$              0
        20 _SYSSMU20_1357956213$              0

7.10 system表空间的undo

默认system表空间会有一个单独的undo segment(usn为0)。其他表空间的事务不能使用它。缺省下undo tablespace 会被分配10个undo段,理论上一个段可以有多个事务,但Oracle的策略并不情愿如此,实验表明,对应并发的事务,通常每个事务会分配一个UNDO段,也就是说如果这10个段不够,Oracle会自动再增加段。

当数据库启动时,如果碰到undo数据文件损坏或不同步,可以将其offline, 即只有一个系统表空间的undo也能进入系统,以便数据字典得以维护,但不能对其他表空间做DML操作。

7.11 测试:模拟数据库open下的undo损坏和修复

如果数据库打开时,当前undo坏掉的话,比如现在UNDOTBS2出现了介质损坏,那么数据库就不能继续DML操作了。如果这时UNDOTBS2表空间上还有active状态的事务(未提交),Oracle会将其下的所有段都标志为NEEDS RECOVERY,这时如有备份可以恢复这个UNDOTBS2,但如果没有备份,那你只能用新建的UNDO替代损坏的UNDO,那么损坏UNDO上的未提交事务也将不得不丢弃。但Oracle没有提供自动解决NEEDS RECOVERY的机制,如果你想删除这个损坏的UNDO表空间,必须另做处理(需要系统择时重启),我们模拟一下这种情况:

[oracle@timran timran]$ mv undotbs02.dbf undotbs02.bak

00:29:28 SQL>alter system checkpoint;

cmd端再做update 语句时会报错

SQL> update emp1 set sal=1000 where empno=7902;
ORA-01116: 打开数据库文件 3 时出错
ORA-01110: 数据文件 3: '/u01/oradata/timran11g/undotbs02.dbf'
ORA-27041: 无法打开文件

00:29:28 SQL> startup force mount

SQL> select file#,checkpoint_change# from v$datafile;

FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1            6708724
         2            6708724
         3            6708724
         4            6708724
         5            6708724
         6            6708724

SQL> select file#,checkpoint_change# from v$datafile_header;

FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1            6708724
         2            6708724
         3                  0
         4            6708724
         5            6708724
         6            6708724

SQL> alter database datafile 7 offline;
SQL> alter database open;
SQL> select * from v$rollname;

USN NAME
---------- ------------------------------
         0 SYSTEM

SQL> select segment_name,status from dba_rollback_segs;        //这个静态视图可以列出所有(online或offline)UNDO段信息

SEGMENT_NAME                   STATUS
------------------------------ ----------------
SYSTEM                             ONLINE
_SYSSMU20_1357956213$          NEEDS RECOVERY
_SYSSMU19_1357956213$          NEEDS RECOVERY
_SYSSMU18_1357956213$          NEEDS RECOVERY
_SYSSMU17_1357956213$          NEEDS RECOVERY
_SYSSMU16_1357956213$          NEEDS RECOVERY
_SYSSMU15_1357956213$          NEEDS RECOVERY
_SYSSMU14_1357956213$          NEEDS RECOVERY
_SYSSMU13_1357956213$          NEEDS RECOVERY
_SYSSMU12_1357956213$          NEEDS RECOVERY
_SYSSMU11_1357956213$          NEEDS RECOVERY

SQL>create undo tablespace undotbs1 datafile '/u01/data/urpdb/undotbs01.dbf' size 100m autoextend on;
   
SQL>select * from v$tablespace;

TS# NAME                           INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
         0 SYSTEM                         YES NO  YES
         1 SYSAUX                         YES NO  YES
         2 UNDOTBS1                    YES NO  YES
         4 USERS                          YES NO  YES
         3 TEMP                           NO  NO  YES
         6 EXAMPLE                       YES NO  YES
         8 TEST                           YES NO  YES
         5 UNDOTBS2                   YES NO  YES

SQL> alter system set undo_tablespace=UNDOTBS1;

注意:此时原有活动事务的信息(未提交)可能仍然保存在UNDOTBS2, 已经没有恢复的必要了。

SQL> update emp1 set sal=1000 where empno=7902;        //emp1表被锁住,不能做DML操作
update emp1 set sal=1000 where empno=7902
       *
第 1 行出现错误:
ORA-00376: 此时无法读取文件 7
ORA-01110: 数据文件 7: '/u01/oradata/timran11g/undotbs02.dbf'

SQL> drop tablespace undotbs2 including contents and datafiles;
drop tablespace undotbs2 including contents and datafiles
*
第 1 行出现错误:
ORA-01548: 已找到活动回退段 'SYSSMU11_1357956213$', 终止删除表空间

//这个UNDOTBS2删不掉是因为Oracle把其下的所有段都标志成 NEEDS RECOVERY了,再查看一下相关的数据字典:

SQL> select segment_name,status from dba_rollback_segs;

解决有两个办法:1)使用备份恢复,2)使用oracle提供的隐含参数_CORRUPTED_ROLLBACK_SEGMENTS
我们假设没有备份,就使用第2种方法

SQL>create pfile from spfile;            //建立静态参数文件
SQL>shutdown abort

#vi /u01/oracle/dbs/inittimran11g.ora        //在静态参数文件里第一行插入以下内容
_CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU30_1446366573$,_SYSSMU29_1446366573$,_SYSSMU28_1446366573$,_SYSSMU27_1446366573$,_SYSSMU26_1446366573$,_SYSSMU25_1446366573$,_SYSSMU24_1446366573$,_SYSSMU23_1446366573$,_SYSSMU22_1446366573$,_SYSSMU21_1446366573$)

然后存盘,再使静态参数文件启动数据库

SQL> startup pfile='/u01/oracle/dbs/inittimran11g.ora'

SQL> drop rollback segment "_SYSSMU30_1446366573$";

回退段已删除。
......
SQL> drop rollback segment "_SYSSMU20_1357956213$";

SQL> select segment_name,status from dba_rollback_segs;

SEGMENT_NAME                   STATUS
------------------------------ ----------------
SYSTEM                             ONLINE
_SYSSMU10_1384520126$          ONLINE
_SYSSMU9_1384520126$           ONLINE
_SYSSMU8_1384520126$           ONLINE
_SYSSMU7_1384520126$           ONLINE
_SYSSMU6_1384520126$           ONLINE
_SYSSMU5_1384520126$           ONLINE
_SYSSMU4_1384520126$           ONLINE
_SYSSMU3_1384520126$           ONLINE
_SYSSMU2_1384520126$           ONLINE
_SYSSMU1_1384520125$           ONLINE

已选择11行。

SQL> drop tablespace undotbs2 including contents and datafiles;

表空间已删除。

如果仍然删除失败(比较少见),则尝试修改字典

select * from v$tablespace;  记下要删除的undo对应的ts#号,比如是=2,则执行下行语句:
update seg$ set type# = 3 where ts#=2;

然后再删除该表空间即可。

oracle之二管理undo的更多相关文章

  1. oracle 用户的管理<二>

    oracle 用户的管理 创建用户 概述:在 oracle 中要创建一个新的用户使用 create user 语句,一般是具有 dba(数据库管理员)的权限才能使用. create user 用户名 ...

  2. Oracle 基于用户管理恢复的处理

    ================================ -- Oracle 基于用户管理恢复的处理 --================================ Oracle支持多种 ...

  3. 【Oracle】redo与undo

    一 .redo(重做信息) 是Oracle在线(或归档)重做日志文件中记录的信息,万一出现失败时可以利用这些数据来“重放”(或重做)事务.Oracle中记录这些信息的文件叫做redo log file ...

  4. (转)Oracle RAC日常管理命令

    转自:http://www.xuebuyuan.com/1206937.html 一.查看RAC环境 RAC架构,2节点信息 节点1 SQL> show parameter instance N ...

  5. Oracle 数据库用户管理

    Oracle 数据库用户管理 Oracle 权限设置      一.权限分类: 系统权限:系统规定用户使用数据库的权限.(系统权限是对用户而言). 实体权限:某种权限用户对其它用户的表或视图的存取权限 ...

  6. ORACLE表空间管理方式segment和extent

    A permanent tablespace contains persistent schema objects. Objects in permanent tablespaces are stor ...

  7. OCA读书笔记(10) - 管理UNDO数据

    Undo自动管理与手动管理 undo段自动管理SQL> show parameter undo_management 将undo段改为手工管理SQL> alter system set u ...

  8. Oracle 用户权限管理方法

    Oracle 用户权限管理方法 sys;//系统管理员,拥有最高权限 system;//本地管理员,次高权限 scott;//普通用户,密码默认为tiger,默认未解锁 sys;//系统管理员,拥有最 ...

  9. Oracle GoldenGate 二、配置和使用

    Oracle GoldenGate 二.配置和使用 配置和使用GoldenGate的步骤 1 在源端和目标端配置数据库支持GoldenGate 2 在源端和目标端创建和配置GoldenGate实例 3 ...

随机推荐

  1. 面试官:怎么做JDK8的垃圾收集器的调优?

    面试官:怎么做JDK8的垃圾收集器的调优? 看着面试官真诚的眼神,心中暗想看起来年纪轻轻却提出如此直击灵魂的问题.擦了擦额头上汗,我稍微调整了一下紧张的情绪,对面试官说: 在JDK8中有Serial收 ...

  2. 基于.NetCore3.1系列 —— 日志记录之自定义日志组件

    一.前言 回顾:日志记录之日志核心要素揭秘 在上一篇中,我们通过学习了解在.net core 中内置的日志记录中的几大核心要素,在日志工厂记录器(ILoggerFactory)中实现将日志记录提供器( ...

  3. 【NOI2014】魔法森林 - 动态加边SPFA

    题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2,3,…,n,边标号为 1,2,3,…, ...

  4. unity探索者之安卓微信登录,非第三方插件

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7666348.html 之前写了两篇关于微信分享的博客,其实微信登录.分享.支付博主 ...

  5. Gitlab-CI/CD 1

    Gitlab-Runner自动构建服务器搭建1 这里讲到的gitlab仓库指的是https://gitlab.com/,自建gitlab仓库也基本相同. 项目的构建打包过程相对比较消耗系统性能,所以g ...

  6. IntelliJ IDEA中如何再次调出springboot的依赖窗口

    原文链接:https://blog.csdn.net/qq_38138069/article/details/102528587 IDEA中如何再次调出springboot的依赖窗口,随时可以根据喜好 ...

  7. 通俗易懂的 Java 位操作运算讲解

    所有数值都是2进制 软件开发者都知道 10 进制.16 进制.8 进制. 比如数字 10 的各位进制形式表现如下. 十进制:10 八进制:012 十六进制:0x0a 二进制:1010 原码 反码 补码 ...

  8. 更好用 更简单的Java缓存框架 jscache

    比Spring Cache 更好用 更简单的缓存工具 jscache 取名意义为 java simple cache,基于AOP实现,支持注解到接口 自定义单个缓存过期时间配置 ttl,轻松扩展缓存实 ...

  9. magento 2 cronjob setup

    crontab -u magento_user -e */5 * * * * php /var/www/html/bin/magento cron:run >> /var/www/html ...

  10. keepalived的工作原理解析以及安装使用

    一.keepalived keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障. keepalived官网http://www.keepali ...