特殊的表空间--回滚表空间

特殊的表空间–回滚表空间

1. 概念

回滚表空间,用于存放回滚数据,

当用户修改数据的时候,Oracle会把修改之前的值保存起来,这样的数据叫回滚数据(Undo Data),回滚数据有如下用途:

   	1. 事务回滚,回滚未提交的事务;
    	2. 提供一致读;
     	3. 闪回查询;

回滚数据在回滚段中一致处于 active 状态,直到下面的情况出现,变为inactive 状态:

   	1. 用户输入了rollback 命令回滚了这个事务;
    	2. 用户输入了 commit  命令提交了这个事务;
     	3. 用户会话被异常中止(事务被回滚);
     	4. 用户正常退出Oracle登录(事务被提交)。

inactive 状态的数据在回滚段中也会保留一段时间,直到数据被覆盖。

2. 回滚段的作用

​ 一个数据库可以有多个回滚表空间,但是只能有一个活动的回滚表空间,回滚段存在一个或多个表的回滚数据。

​ 回滚段中的区是循环使用的,当回滚段中的一个区使用完成的时候,Oracle 会使用一个已经存在的区或者分配一个新的区。当所有的去都使用完的时候,如果第一个去没有被其他活动事务所使用(inactive),Oracle会重新使用第一个区,以此类推,循环使用。

​ 当前活动的回滚段的信息,可以查看如下:

select * from v$rollname;

​ **注意: 所有回滚段的拥有者都是SYS。 **

​ 回滚段有两种管理方式:手动回滚段管理(Manual Undo Management)和自动回滚段管理(Automatic Undo Management)。手动方式比较繁琐,基本被淘汰,自动回滚段管理只需要一个回滚表空间,需要我们做下面的配置。

3. 相关配置

​ 查看Undo相关配置:

show param undo
undo_management:
设置为MANUAL,则表示手动回滚段管理。
设置为AUTO,则表示自动回滚段管理,我们一般设置为AUTO。

undo_retention:
回滚段中数据保留时间,单位秒,它用来保证undo回滚段中的内容一定时间不会被覆盖,设置时要和undo的大小一起考虑。
10.2版本以后,Oracle会自动调整undo_retention 时间,最大可能的保留undo信息,当然这个功能是隐藏参数 _undo_autotune控制的。
另外,在回滚表空间满了的时候,回滚段中的内容,是否被覆盖还是保留,还跟回滚表空间的设置有关,如果设置为guarantee:
	alter tablespace undo_new retention guarantee;
则按照undo_retention 配置时间保留内容,如果此时回滚表空间满了,则报错。
如果设置为Noguarantee,则在回滚表空间满了的情况下,undo_retention 不在生效,前面inactive的内容任然会被覆盖。
我们一般在升级脚本中会重新配置该参数,减少回滚段数据保留时间,在大数据量的情况下,可以增加回滚段的有效使用率。当然之后还要修改回来。

undo_tablespace:
当前使用的回滚表空间名。

4. 回滚表空间满了,怎么办?

现象:

当往表中插入大量数据时,报告错误

 “ ORA-01650:unable to extend rollback Segment RB01 by 256 in Tablespace UNDOTBS1"。

原因:

  1. 数据文件非自动扩展情况下,回滚表空间被占满了,回滚段没有 inactive 的回滚区,或者或滚区没有到达 undo_retention 配置的保留时间;
  2. 数据文件是自动扩展的情况,回滚表空间会自动扩展,但是系统没有足够的磁盘空间了。

解决/规避方法:

  1. 应用程序调整(很重要)

    主要看哪些操作占用回滚段,对SQL语句进行调整,增加数据更新提交(commit)的频率,避免大数据量提交,减少对回滚段中 active 区的占用。

    未提交的事务查看:

    select addr,sid,username,s.status,process,program from v$transaction t,v$session s where t.ses_addr = s.saddr;
    
  2. 按照前面说明,适当调整参数 undo_retention,减少回滚段数据保留时间

    注意要查看“_undo_autotune”,我们一般设置为false,即

    alter system set "_undo_autotune" = false;
    
  3. 重建回滚表空间

    即新建一个容量较小的回滚表空间 UNDOTBS2,并切换为当前使用的表空间。

    删除原来的回滚表空间 UNDOTBS1;

    然后重新创建 UNDOTBS1;

    最后再切换回来。

  4. 手动增加回滚表空间 UNDOTBS1 中的数据文件大小;

  5. 往 UNDOTBS1 中增加数据文件

  6. 把回滚表空间 UNDOTBS1 中的数据文件设置为自动扩展(不建议,磁盘空间容易被占满)。

猜你喜欢

转载自blog.csdn.net/xxydzyr/article/details/85840815