美文网首页
Undo 表空间管理

Undo 表空间管理

作者: 个人精进成长营 | 来源:发表于2021-06-28 08:18 被阅读0次

    What is Undo

        当发布一条回滚语句时,撤销记录用于撤销未提交事务读数据库所做的修改。

        在数据库恢复期间,撤销记录用于撤销从重做日志作用到数据文件的任何未提交的修改。

        当另一用户正在修改数据时,撤销记录为正在访问数据的用户提供修改钱的映像。

    1、Undo表空间及管理方式

      管理Undo TableSpace的方法有两种:一是使用回滚段来管理,该方式被认为是手动撤销管理;二是使用撤销表空间的方法,是以自动撤销管理方式。

    show parameter undo_tablespace

    Undo段

    select * from v$rollname;

        select owner, segment_name, tablespace_name from dba_rollback_segs;

    select SEGMENT_NAME,BLOCKS,EXTENTS from dba_segments where SEGMENT_NAME='_SYSSMU1_2175781447$';

    select SEGMENT_NAME,TABLESPACE_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where SEGMENT_NAME='_SYSSMU1_2175781447$'

    show parameter undo

    select name from v$parameter where name like '%undo%';

    undo_management

    UNDO表空间占用空间情况以及数据文件存放位置

    select file_name,bytes/1024/1024 from dba_data_files

    where tablespace_name like '%UNDOTBS%';

    undo的三个作用

    读一致性,构造CR块

    回滚

    实例恢复

      undo_retention 强制保护时间

    alter tablespace undotbs1 retention guarantee

    undo_retention 非强制保护时间(数据库默认)

    alter tablespace undotbs1 retention noguarantee

    查询undo_retention状态

    select tablespace_name,retention from dba_tablespaces;

    2: 切换UNDO表空间

        2.1 创建UNDO表空间

            create undo tablespace undotbs_xing datafile '/opt/oracle/oradata/ORCL/undo02.dbf' size 50M;

        2.2 切换UNDO表空间

            2.2.1 更改参数文件

                  alter system set undo_tablespace=UNDOTBS_XING scope=both;

            2.2.2 查看UNDO段状态

                  select tablespace_name,segment_name,status from dba_rollback_segs;

            2.2.3 将原来的undo表空间,置为脱机

                  alter tablespace UNDOTBS_XING offline;

                  alter system set undo_tablespace=UNDOTBS1 scope=both;

    3:Undo段中区的状态

    expired  :  unexpired 的 undo_retention 时间后,会变成expired

    unexpired:  已经提交,尽量不覆盖, undo_retention

                        表空间压力大,也可能被覆盖

    active  :  未提交,不能覆盖

      select status from dba_undo_extents group by status;

    显示UNDO区信息

    SELECT extent_id, bytes, status FROM dba_undo_extents

      --UNDO 表空间各种状态的大小

    SELECT  tablespace_name, status, SUM (bytes) / 1024 / 1024 "Bytes(M)"

      FROM  dba_undo_extents

      GROUP BY  tablespace_name, status;

    4、一个事务的操作流程

    Undo段的组成:段头、回滚块

    事务ID

    select xid,xidusn,xidslot,xidsqn,ubablk,ubafil from v$transaction;

    事务表

    undo段的第一个数据块

    回滚段的段头块

    select spid from v$process where addr in (select paddr from v$session where

      sid=(select sid from v$mystat where rownum=1));

    select * from v$rollname;

    select header_block,header_file from dba_segments where segment_name='_SYSSMU2_2232571081$';

    alter system dump undo header '_SYSSMU2_2232571081$';//转储回滚段头

    alter system dump datafile 3 block 148;//转储回滚段数据块

    事务槽:xid、uba

    事物ID组成:回滚段的段头块,块中的那一行,覆盖次数,通过事物ID可以找到事物表

          1:一个事物开始,找到UNDO段,在段块头的事物表写上事物ID,同时分配UBA

          2:修改具体的数据块:首先在块头的事物槽,写上事物ID,

          1:UNDO表空间---undo段--undo段块头--事物表:事物ID、UBA(最新的回滚块)

          2:数据块--数据块头-事物槽:事物ID、UBA

      大事物,Oracle提交undo块标志,而不提交数据块头事物槽上的提交标志,下次访问的时候再提交

      提交彻底:

      1:undo段块头标志提交

      2:数据块事物槽标志提交

      3:数据行头事物槽ID提交(行级锁)

        SELECT UBAFIL 回滚段文件号,UBABLK 数据块号,UBASQN 回滚序列号,UBAREC 回滚记录号 FROM v$transaction 

        select ini_trans,max_trans from dba_tables where table_name='T';

    --查看事物的开始时间、UNDO BLOCK、UNDO 记录数   

    select START_TIME,START_SCNB,USED_UBLK,USED_UREC,LOG_IO,PHY_IO from v$transaction;   

    start_time --> start_time :)

    start_scnb --> 开始的scn

    used_ublk --> 占用的undo block

    used_urec --> undo 记录的行数

    log_io    --> 逻辑io 注意不是Consistent gets

    phy_io    --> 物理io

    查看回滚段的使用情况,哪个用户正在使用回滚段的资源

    select s.username, u.name from v$transaction t,v$rollstat r,

    v$rollname u,v$session s where s.taddr=t.addr and

    t.xidusn=r.usn and r.usn=u.usn order by s.username;

    检查UNDO Segment状态

    select usn,xacts,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks

    from v$rollstat order by rssize;

    确定当前例程正在使用的UNDO表空间

    Show parameter undo_tablespace

    显示数据库的所有UNDO表空间

    SELECT tablespace_name FROM dba_tablespaces WHERE contents='UNDO';

    显示UNDO表空间统计信息

    SELECT TO_CHAR(BEGIN_TIME,'HH24:MI:SS') BEGIN_TIME,

    TO_CHAR(END_TIME,'HH24:MI:SS') END_TIME,UNDOBLKS

    FROM V$UNDOSTAT;

    显示UNDO段统计信息

    SELECT a.name, b.xacts, b.writes, b.extents

    FROM v$rollname a, v$rollstat b

    WHERE a.usn=b.usn;

    显示活动事务信息

    Col username format a10

    Col name format a10

    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

    AND a.username='WEISI';

    5、读一致性

    ORA-01555错误

          1:select 语句执行时间太长

                  2:undo表空间压力大,覆盖旧数据

    6、事务槽ITL

    默认是1

    最大255(从Oracle10g开始不能更改)

    select INI_TRANS,MAX_TRANS from dba_tables where table_name='NORMAL_T'

    事务槽争用

    create table t10(id number(5),name char(2000));

    insert into t10 values(1,'aa');

    insert into t10 values(2,'bb');

    insert into t10 values(3,'bb');

    insert into t10 values(4,'cc');

    insert into t10 values(5,'dd');

    commit;

    select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid),id from t10;

    update t10 set name='abcd' where id=1;

    select ubafil,ubablk,xidusn,xidslot,xidsqn,start_scnb from v$transaction;

    select * from v$rollname ;

    --dump undo header block

    alter system dump undo header '_SYSSMU1_3474229887$';

    select header_block,header_file from dba_segments where segment_name='_SYSSMU1_3474229887$';

    alter system dump datafile 3 block 405; // 回滚块,数据块

    查看当前会话的进程编号

    select spid from v$process where addr in (select paddr from v$session where

    sid=(select sid from v$mystat where rownum=1));

    相关文章

      网友评论

          本文标题:Undo 表空间管理

          本文链接:https://www.haomeiwen.com/subject/cpafultx.html