ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 回退表空间

回退表空间

原创 Linux操作系统 作者:yuecaibo 时间:2012-03-06 00:02:18 0 删除 编辑

****** 回退表空间和数据文件的管理 ******
UNDO表空间 --> rollback segment

system回退段 系统创建 为system表空间的对象提供回退
非系统回退段 用户创建 为用户表空间的对象提供回退
延迟回退段   系统创建 表空间非正常离线时自动创建 我们不能管理


作用:
 1.交易的回退:没有提交的交易可以rollback
 2.交易的恢复:数据库崩溃时,将磁盘的不正确数据恢复到交易前
 3.读一致性  :被查询的记录有事务占用,转向回滚段找改前镜像
 4.闪回数据  :从回滚段中构造历史数据

回滚段创建的时候是空闲的,只有事务产生时候才会产生数据。

创建UNDO表空间:
SQL> create undo tablespace undo2 datafile '/u01/oracle/oradata/ora10g/undo02.dbf' size 10M;

Tablespace created.

SQL>

管理风格:自动或手动

SQL> show parameter undo

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

undo_management=AUTO 回滚表空间段的段管理模式,
自动管理
 管理员只需要备足够的表空间容量,oracle会自动管理扩展回滚段的数量。
 只能使用一个UNDO表空间
 undo_tablespace:只有在自动管理模式下才可以使用。指明使用哪个UNDO表空间


SQL> select segment_name,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME                   TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ ----------------
SYSTEM                         SYSTEM                         ONLINE
_SYSSMU10$                     UNDOTBS1                       ONLINE
_SYSSMU9$                      UNDOTBS1                       ONLINE
_SYSSMU8$                      UNDOTBS1                       ONLINE
_SYSSMU7$                      UNDOTBS1                       ONLINE
_SYSSMU6$                      UNDOTBS1                       ONLINE
_SYSSMU5$                      UNDOTBS1                       ONLINE
_SYSSMU4$                      UNDOTBS1                       ONLINE
_SYSSMU3$                      UNDOTBS1                       ONLINE
_SYSSMU2$                      UNDOTBS1                       ONLINE
_SYSSMU1$                      UNDOTBS1                       ONLINE
_SYSSMU20$                     UNDO2                          OFFLINE
_SYSSMU19$                     UNDO2                          OFFLINE
_SYSSMU18$                     UNDO2                          OFFLINE
_SYSSMU17$                     UNDO2                          OFFLINE
_SYSSMU16$                     UNDO2                          OFFLINE
_SYSSMU15$                     UNDO2                          OFFLINE
_SYSSMU14$                     UNDO2                          OFFLINE
_SYSSMU13$                     UNDO2                          OFFLINE
_SYSSMU12$                     UNDO2                          OFFLINE
_SYSSMU11$                     UNDO2                          OFFLINE

21 rows selected.

回滚段的名字系统自动取
system是系统回退段,DBA不能管理.

切换回滚表空间的时候不会影响回滚数据:
SQL> alter system set undo_tablespace=undo2;

System altered.

SQL>


undo_retention=900 :
 提交之后旧的镜像保持在回滚段中的时间。
 非强制的回退保持时间.(回滚空间不足老的镜像就会被覆盖)


强制保持:但是对空间要求较大,要慎用。(10g开始支持)
alter tablespace UNDOTABS1 RETENTION GUARANTEE;
select  tablespace_name,RETENTION from dba_tablespaces;

 

手工管理UNDO

修改方法

SYS@beijing> show parameter rollback

NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollback      string  LOW
rollback_segments       string
transactions_per_rollback_segment    integer  5
SYS@beijing>

默认一个回滚段可以维持5个事务  不要放太多事务 会产生回滚段头争用
因为段头中记录段中的块的位置   找段里的数据就要访问段头

改成手动
SQL> alter system set undo_management=manual scope=spfile;

System altered.

SQL> startup force
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size      1218992 bytes
Variable Size     75499088 bytes
Database Buffers   205520896 bytes
Redo Buffers      2973696 bytes
Database mounted.
Database opened.
SQL> select SEGMENT_NAME,TABLESPACE_NAME,STATUS from dba_rollback_segs;

SEGMENT_NAME    TABLESPACE_NAME STATUS
------------------------- --------------- ----------
SYSTEM     SYSTEM   ONLINE
_SYSSMU1$    UNDOTBS1   OFFLINE
_SYSSMU2$    UNDOTBS1   OFFLINE
_SYSSMU3$    UNDOTBS1   OFFLINE
_SYSSMU4$    UNDOTBS1   OFFLINE
_SYSSMU5$    UNDOTBS1   OFFLINE
_SYSSMU6$    UNDOTBS1   OFFLINE
_SYSSMU7$    UNDOTBS1   OFFLINE
_SYSSMU8$    UNDOTBS1   OFFLINE
_SYSSMU9$    UNDOTBS1   OFFLINE
_SYSSMU10$    UNDOTBS1   OFFLINE
_SYSSMU11$    UNDO2    OFFLINE
_SYSSMU12$    UNDO2    OFFLINE
_SYSSMU13$    UNDO2    OFFLINE
_SYSSMU14$    UNDO2    OFFLINE
_SYSSMU15$    UNDO2    OFFLINE
_SYSSMU16$    UNDO2    OFFLINE
_SYSSMU17$    UNDO2    OFFLINE
_SYSSMU18$    UNDO2    OFFLINE
_SYSSMU19$    UNDO2    OFFLINE
_SYSSMU20$    UNDO2    OFFLINE

21 rows selected.

SQL>
此时普通用户不能创建和修改数据
而sys可以 但也只限于修改的是system表空间的数据 因为有system回退段


手动创建回滚段 段会自动拓展大小 所以不需要指明
create rollback segment rbs1 tablespace undotbs1;


SYS@beijing> create rollback segment rbs1 tablespace undotbs1;

Rollback segment created.

SYS@beijing>

SYS@beijing> select SEGMENT_NAME,TABLESPACE_NAME,STATUS from dba_rollback_segs where segment_name='RBS1';

SEGMENT_NAME    TABLESPACE_NAME STATUS
------------------------- --------------- ----------
RBS1     UNDOTBS1   OFFLINE

SYS@beijing>

SYS@beijing> alter rollback segment rbs1 online;

Rollback segment altered.

SYS@beijing> select SEGMENT_NAME,TABLESPACE_NAME,STATUS from dba_rollback_segs where segment_name='RBS1';

SEGMENT_NAME    TABLESPACE_NAME STATUS
------------------------- --------------- ----------
RBS1     UNDOTBS1   ONLINE

SYS@beijing> 此时普通用户可以产生事务了

 

下次停库再起还是offline的
自动online的方法
 alter system set rollback_segments=RBS1,rbs2,... scope=spfile;

SYS@beijing> show parameter rollback

NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollback      string  LOW
rollback_segments       string
transactions_per_rollback_segment    integer  5
SYS@beijing> alter system set rollback_segments='RBS1' scope=spfile;

System altered.

SYS@beijing>


手工管理在事务差距大时使用 N多个事务里有一个十分大的事务时使用

 

扩容:和管理永久表空间一样。
SQL> drop tablespace undo2 including contents and datafiles;

Tablespace dropped.

SQL>

监控回滚使用情况
desc v$transaction
select ses_addr,used_ublk from v$transaction;
select username from v$session where saddr=(select ses_addr from v$transaction);


查看哪个用户在使用哪个回滚段
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;

若要指定事务的回滚段使用
SET TRANSACTION USE ROLLBACK SEGMENT rbs_name;


计算回滚表空间的大小
可以通过v$undostat视图计算出每秒钟产生多少undo量 再按undo_retention参数值来计算undo的大小

v$undostat视图每10分钟就会更新一次
先给UNDO一个大的容量,让数据库运行一个周期,之后来这个视图取值

select min(begin_time) begin,max(end_time) end,sum(undoblks) blks from v$undostat;
开始和结束 比如我们取24小时的时间(这个时间自己按需指定,这里比方说是24小时) 看24小时内共计使用了多少UNDO块

再去运算每秒产生的块
select blks/((end-begin)*3600) from ( select min(begin_time) begin,max(end_time) end,sum(undoblks) blks from v$undostat);

再根据
undo_retention的秒数乘以上面运算出的每秒值 既是UNDO表空间需求的尺寸

只是粗略算法 只能说明实际生产中的值要比上面的计算结果更大,因为有突发事务等操作.

 


 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24756465/viewspace-717783/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 临时表空间
下一篇: 存储结构
请登录后发表评论 登录
全部评论

注册时间:2012-03-03

  • 博文量
    42
  • 访问量
    37660