• UNDO空间满的处理方法(含UNDO的学习与相关解释)


     

    1、查看数据库当前实例使用的是哪个UNDO表空间:

    show parameter undo_tablespace

    2、查看UNDO表空间对应的数据文件和大小

    set lines 200 pages 200col file_name for a60
    col tablespace_name for a20;select tablespace_name,file_name,bytes/1024/1024 MB from dba_data_fileswhere tablespace_name like '%UNDOTBS%';

    3、查看undo表空间属性:

    show parameter undo

    select retention,tablespace_name from dba_tablespaces where tablespace_name like '%UNDOTBS%';

    解释:

    undo段中区的状态:

    free:     区未分配给任何一个段

    active:  已经被分配给段,并且这个段被事务所使用,且事务没有提交,不能覆盖。 (区被未提交的事务使用)       

    unexpired:事务已经提交,但是区还在段中,还没有被覆盖且未达到undo_retention设定的时间。

        (nogurantee的情况下,原则上oracle尽量的不覆盖unexpired的区,但是如果undo空间压力及较大,oracle也会去覆盖。如果是guarantee,oracle强制保留retention时间内的内容,这时候free和expired空间不足的话,新事物将失败。)

    expired:oracle希望已经提交的事务对应的undo表空间中的undo段中的区再保留一段时间。保留的时间就是undo_retention。

         unexpired的区存在时间超过undo_retention设定的时间,状态就会变为expired。过期后的区就可以被覆盖了。原则上expired的区一般不会释放成free

    PS:生产中没有人会将UNDOTBS的retention设置成GUARANTEE这是很危险的。

    4、查看undo表空间当前的使用情况:

    set lines 200 pages 200  
    col tablespace_name for a30select tablespace_name,
    status,sum(bytes)/1024/1024 MB from dba_undo_extentsgroup by tablespace_name,status;

    与一般的用户表空间不同,undo表空间不能通过dba_free_spaces来确定实际的使用情况,undo表空间除了active状态的extent不能被覆盖外。其他状态的extent都是可以空间复用的。

    如果active的extent总大小很大,说明系统中存在大事务。如果undo资源耗尽(ACTIVE接近undotbs的总大小),可能导致事务失败。

    5、查看什么事务占用了过多的undo:

    select addr,used_ublk,used_urec,inst_id 
    from gv$transaction order by 2 desc;

    ADDR: 事务的内存你地址。

    USED_UBLK:事务使用的undo block数量。

    USED_UREC:事务使用的undo record (undo前镜像的条数,例如:delete删除的记录数)

    6、查看占用undo的事务执行了什么sql:

    set lines 200 pages 200col program for a30
    col machine for a30select sql_id,last_call_et,program,machine from gv$session 
    where taddr='0000000089A9E2F0';

    LAST_CALL_ET: 上一次调用到现在为止过了多长时间,单位为秒,途中显示过了304s (既可以理解为sql已经运行了304s)。

    set long 99999set lines 100 set pages 1000 
    select 
    sql_fulltext from v$sql where SQL_ID='8gvp49tr474f2';

    7、找到了sql,下面就可以联系应用做处理了:

    哪台机器,通过什么程序,发起了什么sql,占用了多少undo,是否可以杀掉,sql是否可以改写,是否可以分批提交。。。等

     关于UNDO的其他知识:

    1、undo的读取方式是单块读的,所以事务的回滚比较慢

    2、显示undo使用情况的统计信息:

    SELECT TO_CHAR(BEGIN_TIME,'HH24:MI:SS') BEGIN_TIME,
    TO_CHAR(END_TIME,'HH24:MI:SS') END_TIME,
    UNDOBLKSFROM V$UNDOSTAT;

    3、system表空间中有一个系统回滚段,只有在对数据字典进行操作时(eg:修改表结构)才用到系统回滚段,另外一种情况,如果undo表空间出现问题,oracle也可能使用system段。

    一个事务开始的时候,在shared pool中分一个IMU(in memory undo) buffer,将所有的回滚信息写到IMU buffer中

    一个事务开始后,需要回滚块的时候不需要从从磁盘读undo block,直接从shared pool 中分IMU BUFFER,之后回滚信息写到imubuffer中,

    回滚信息写入的时候也要产生redo,但是imubuffer减少了物理io

    针对IMUbuffer 在shared中会生成专门供其使用的redo日志区,叫做private redo

    4、undo segment的信息:

    SELECT 
    a.name, 
    b.xacts, 
    b.writes, 
    b.extents
    FROM 
    v$rollname a, v$rollstat b
    WHERE a.usn=b.usn;

    USN          Rollback segment number

    XACTS         Number of active transactions

    EXTENTS     Number of extents in the rollback segment

    WRITES      Number of bytes written to the rollback segment 

    作者:Nathon-wang

    原文链接:https://www.cnblogs.com/nathon-wang/p/10293919.html

  • 相关阅读:
    【报错】引入jar包import org.apache.commons.codec.digest.DigestUtils 报错,jar不存在
    【spring data jpa】使用jpa的@Query,自己写的语句,报错:org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'status' cannot be found on null
    【java】在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException
    【java】java中直接根据Date 获取明天的时间
    【java】处理时间字段 在数据库查询的时候只想要年月日,不想要时分秒 ,java中设置时间类型为年月日,java中设置Date中的时分秒为00.00.000
    【spring data jpa】 spring data jpa 中 时间格式设置between and 查询
    【mybatis】mybatis 中select 查询 select * 查询出来的数据,字段值带不出来 数据不全
    【spring mvc】spring mvc POST方式接收单个字符串参数,不加注解,接收到的值为null,加上@RequestBody,接收到{"uid":"品牌分类大”},加上@RequestParam报错 ---- GET方式接收单个参数的方法
    Centos7安装配置tomcat 9并设置自动启动
    centos7 yum安装配置redis 并设置密码
  • 原文地址:https://www.cnblogs.com/yaoyangding/p/12264894.html
Copyright © 2020-2023  润新知