千家信息网

Undo坏块

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,一、概述SQL> show parameter undoNAME TYPE VALUE------------------------------------ ----------- --------
千家信息网最后更新 2026年11月02日Undo坏块

一、概述

SQL> show parameter undo

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

undo_management string AUTO

undo_retention integer 900

undo_tablespace string UNDOTBS1

1.1 当undo_management被设置成MENUAL时使用系统回滚段, 即将undo records 记录到SYSTEM 表空间下的SYSTEM段。

SQL> col segment_name format a25

SQL> select segment_name,tablespace_name,bytes,next_extent from dba_segments where segment_type='ROLLBACK';

SEGMENT_NAME TABLESPACE_NAME BYTES NEXT_EXTENT

------------------------- ------------------------------ ---------- -----------

SYSTEM SYSTEM 393216 57344

通过上面的这条语句,我们查到了这个用于rollback 的system segment 存在于system 表空间。 默认情况下,只有一个segment,并且它还比较小,所以,如果使用system 段来存储undo records。肯定会影响数据库的性能。 所以Oracle 是建议使用Undo tablespace 来管理undo records。

1.2 当undo_management设置成AUTO时使用UNDO tablespace来管理回滚段。 这个时候,我们将有多个undo segment,并且这些segment 是存放在UNDO 表空间里的。 这样对DB的性能就会提高。

SQL> select segment_name,tablespace_name,bytes,next_extent from dba_segments where segment_type='TYPE2 UNDO';

SEGMENT_NAME TABLESPACE_NAME BYTES NEXT_EXTENT

------------------------- ------------------------------ ---------- -----------

_SYSSMU1_3724004606$ UNDOTBS1 8519680 65536

_SYSSMU2_2996391332$ UNDOTBS1 8519680 65536

_SYSSMU3_1723003836$ UNDOTBS1 2228224 65536

_SYSSMU4_1254879796$ UNDOTBS1 3276800 65536

_SYSSMU5_898567397$ UNDOTBS1 8519680 65536

_SYSSMU6_1263032392$ UNDOTBS1 8519680 65536

_SYSSMU7_2070203016$ UNDOTBS1 8519680 65536

_SYSSMU8_517538920$ UNDOTBS1 1179648 65536

_SYSSMU9_1650507775$ UNDOTBS1 8519680 65536

_SYSSMU10_1197734989$ UNDOTBS1 8519680 65536

10 rows selected.

SQL>

通过以上SQL的查询结果,我们可以看出,有10个undo segment来存放undo records。

以上我们是通过dba_segment视图查看的结果。而也可以通过v$rollstat和v$rollname 两个视图来查看信息,这2个视图会显示所有rollback段的信息,包括system段和undo段。

SQL> col name format a25

SQL> select s.usn,n.name,s.extents,s.hwmsize,s.status from v$rollstat s, v$rollname n where s.usn=n.usn;

USN NAME EXTENTS HWMSIZE STATUS

---------- ------------------------- ---------- ---------- ----------

0 SYSTEM 6 385024 ONLINE

1 _SYSSMU1_3724004606$ 3 8511488 ONLINE

2 _SYSSMU2_2996391332$ 3 8511488 ONLINE

3 _SYSSMU3_1723003836$ 4 2220032 ONLINE

4 _SYSSMU4_1254879796$ 4 3268608 ONLINE

5 _SYSSMU5_898567397$ 3 8511488 ONLINE

6 _SYSSMU6_1263032392$ 3 8511488 ONLINE

7 _SYSSMU7_2070203016$ 3 8511488 ONLINE

8 _SYSSMU8_517538920$ 3 1171456 ONLINE

9 _SYSSMU9_1650507775$ 3 8511488 ONLINE

10 _SYSSMU10_1197734989$ 3 8511488 ONLINE

11 rows selected.

SQL>

二、UNDO 损坏的处理

2.1 方法一,使用system segment

提到了一种方法,就是使用SYSTEM 的回滚段, 步骤如下:

(1)用spfile 创建pfile,然后修改参数:

#*.undo_tablespace='UNDOTBS1'

#*.undo_management='AUTO'

#*.undo_tablespace

#*.undo_retention

undo_management='MANUAL'

rollback_segments='SYSTEM'

(2)用修改之后的pfile,重启DB

SQL> STARTUP MOUNT pfile='F:/initorcl.ora' ;

(3)删除原来的表空间,创建新的UNDO 表空间

SQL> drop tablespace undotbs;

SQL> create undo tablespace undotbs1 datafile '/u01/oradata/undotbs1.dbf' size 10M;

(4)关闭数据库,修改pfile参数,然后用新的pfile创建spfile,在正常启动数据库。

*.undo_tablespace='UNDOTBS1'

*.undo_management='AUTO'

#undo_management='MANUAL'

#rollback_segments='SYSTEM'

2.2. 方法二:跳过损坏的segment

在方法一中,我们使用了system segment。 通过第一部分我们了解到,undo segment 有多个,我们可以通过alert log 来查看正在使用的是哪些segment,这些段有可能损坏了。 我们只需要把这些损坏的segment 跳过,先正常启动DB,在创建新的UNDO 表空间,在切换一下。

(1)修改pfile,添加参数:

*._corrupted_rollback_segments='_SYSSMU11$','_SYSSMU12$','_SYSSMU13$'

这些字段的值,我们通过alert log 查看。 也可以通过如下命令查看:

#strings system01.dbf | grep _SYSSMU | cut -d $ -f 1 | sort -u

(2)用修改之后的pfile启动DB

因为跳过了哪些损坏的segment,所以DB 可以正常启动。

(3)创建新的UNDO 表空间,并切换过来

SQL> create undo tablespace undotbs1 datafile '/u01/oradata/undotbs1.dbf' size 10M;

SQL> alter system set undo_tablespace=undotbs1;

SQL> drop tablespace undotbs;

(4)修改pfile,创建spfile,并正常启动

删除如下:

*._corrupted_rollback_segments='_SYSSMU11$','_SYSSMU12$','_SYSSMU13$'

2.3 方法三:使用rman备份恢复

startup mount

--检验备份是否有坏块

RMAN> backup validate datafile 22;

--查询坏块信息

RMAN> select * from v$database_block_corruption where file#=22;

FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO CON_ID

---------- ---------- ---------- ------------------ --------- ----------

22 32120 1 0 CORRUPT 1


--
修复坏块

RMAN> blockrecover datafile 22 block 32120 from backupset;

--打开数据库

alter database open;

注:其它文件(system/sysaux/用户数据文件)坏块也可用这种方式修复

2.4 方法四:使用参数_offline_rollback_segments和_corrupted_rollback_segments

在没有备份的情况下,

使用_offline_rollback_segments和_corrupted_rollback_segments

1.先把数据文件offline,在mount状态下执行:

alter database datafile '/oracle/app/oracle/oradata/cus/undotbs01.dbf' offline;

alter database open;

2.查询哪些undo段是需要恢复(need recover)

select segment_name,status from dba_rollback_segs where status = 'NEEDS RECOVERY';

3. 新建一个回滚表空间,生成pfile

create undo tablespace undotbs2 datafile '/oracle/app/oracle/oradata/cus/undotbs02.dbf' size 300m;

alter system set undo_tablespace='undotbs2';

create pfile='/home/oracle/pfile.txt' from spfile;

4.编辑pfile,添加隐含参数

--根据第2步查询需要恢复的undo段

?*._offline_rollback_segments=('_SYSSMU3_1499641855$','_SYSSMU4_3564003469$',......)

*._corrupted_rollback_segments=('_SYSSMU3_1499641855$',_SYSSMU4_3564003469$',......)

5.重新启动,删除旧的undo

startup pfile='/home/oracle/ pfile.txt';

drop tablespace undotbs1 including contents and datafiles;

?select segment_name,status from dba_rollback_segs where status = 'NEEDS RECOVERY';


6. 去掉隐含参数,重新启动数据库

将pfile.txt文件去掉前面两个隐含参数_offline_rollback_segments和_corrupted_rollback_segments,然后重新启动数据库

shutdown immediate;

startup pfile='/home/oracle/pfile.txt';

create spfile from pfile='/home/oracle/pfile.txt';

shutown immediate;

startup;

总结

以上就是UNDO 出现故障的几种处理方法,其中方法二和方法四类似,都是采用参数进行恢复。

方法 参数 数据 空间 数据库 文件 查询 信息 可以通过 备份 视图 两个 多个 就是 性能 情况 结果 切换 处理 管理 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云南咖啡 什么是科技互联网 金融科技创新监管互联网金融 鑫亿盛互联网科技 无线互联网科技 米客互联网科技 互联网科技公司的市场部门 互联网科技产品 济南华为互联网科技产业总部基地 贵州叶脉互联网科技有限公司所属行业 成都铂石互联网科技做什么的 互联网科技公司实习生 千方科技属于互联网企业吗 佛山市翊博互联网络科技有限公司 朱啸虎曾投资哪些互联网科技企业 众安科技工业互联网合作 云南互联网科技学费 马化腾互联网科技教学 唐山双旺合互联网科技产业园 互联网科技快速发展优美句子 喔噻互联网科技有限公司 互联网科技公司经营范围 湖南一路畅行互联网科技 健康食品互联网创新科技园项目 山东子淼互联网科技有限公司 每天都有哪些好的互联网科技 互联网高科技行业有哪些企业 互联网公司属于科技吗 黑龙江互联网科技公司 互联网科技快速发展优美句子
0