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));
网友评论