概述
1 什么是undo
Oracle数据库在回退、撤销或者改变数据所需要的维护数据库信息的一种手段。这里的数据库信息是指在数据库提交之前的记录的改变等事务信息。Undo 信息主要有以下用途:
l 当系统发出rollback信息
l 数据库恢复
l 提供读一致性
当系统发出rollback命令时,undo 信息通过记录的信息将数据库的改变恢复到commit之前的状态。在数据库恢复期间,undo信息被用来从redo log中撤销任何未提交到数据文件的事务。当一个用户在访问数据时,Undo记录通过维护访问数据的前镜像数据来保证当有其他用户改变相同数据时数据库的读一致性。
以前数据库使用回滚段来存储undo信息,这种回滚段管理方式非常的复杂。现在数据库采用undo的方式降低了管理的复杂性,同时减少了dba的工作负荷。但是在数据库只能使用这两种方式的一种。可以在数据库里定义两种方式的文件,但是,同一时刻,必须指定数据使用哪一种方式。当你需要在两种方式中切换时,必须将系统重新启动。
Oracle数据库一直使用系统回滚段来完成系统的事务。系统回滚段是在数据库,创建的时候产生的,系统启动后就一直在线。Dba不需要对它作任何的操作来优化。
2 指定Undo的方式
oracle 9i以后有个初始化参数:undo_management。当将undo_management设置成AUTO时系统使用重做表空间来管理回滚段,当它被设置成MENUAL时系统使用回滚段。
oracle推荐使用重做表空间代替回滚段。当系统使用auto方式管理undo信息时,系统必须指定一个undo表空间。这个表空间可以是在数据库创建时产生,也可以数据库创建后再创建。当实例启动的时候,系统自动选择第一个有效的undo表空间或者是rollback segment,如果没有有效的可用的undo表空间或者是回滚段,系统使用system rollback segment。这种情况是不被推荐的,当系统运行在没有undo的情况下,系统会在alert.log中记录一条警告信息。
2.1 自动管理模式(Automatic UndoManagement)
如果系统使用要使用auto方式管理undo信息,那么需要通过指定初始化参数undo_tablespace的值来指定系统使用哪一个undo表空间来存放undo信息。如果指定了undo_tablespace的值,但是系统中不存在这样的表空间,那些系统启动将会失败。此时可以做的操作是,如果系统存在undo表空间,为undo_tablespace指定正确的undo表空间名字,或者将undo_tablespace注释。系统会采用存在的undo表空间。否则使用手动方式。
相关的初始化参数:
undo_tablespace 指名系统使用哪一个重做表空间。
undo_suppress_errors 被设置成true时表示系统创建和使用回滚段时忽略错误。
undo_retention 系统提交后,回滚段的数据保留多长时间,单位是秒。
当系统被设置成menual后,这几个参数被忽略。
SQL> show parameterundo
NAME TYPE VALUE
------------------------------------- ---------- ---------------
undo_management string AUTO
undo_retention integer 1000
undo_tablespace string UNDOTBS1
2.2 补充:初始化参数UNDO_RETENTION
该参数用来指定undo 记录保存的最长时间,以秒为单位,是个动态参数,完全可以在实例运行时随时修改通常默认是900 秒,也就是15 分钟。
一定要注意,undo_retention只是指定undo 数据的过期时间,并不是说,undo 中的数据一定会在undo表空间中保存15 分钟,比如说刚一个新事务开始的时候,如果undo 表空间已经被写满,则新事务的数据会自动覆盖已提交事务的数据,而不管这些数据是否已过期,因此呢,这就又关联回了第一点,当你创建
一个自动管理的undo 表空间时,还要注意其空间大小,要尽可能保证undo 表空间有足够的存储空间。
同时还要注意,也并不是说,undo_retention 中指定的时间一过,已经提交事务中的数据就立刻无法访问,它只是失效,只要不被别的事务覆盖,它会仍然存在,并可随时被flashback 特性引用。如果你的undo表空间足够大,而数据库又不是那么繁忙,那么其实undo_retention 参数的值并不会影响到你,哪怕你设置成1,只要没有事务去覆盖undo 数据,它就会持续有效。因此呢,这里还是那句话,要注意undo 表空间的大小,保证其有足够的存储空间。
只有在一种情况下,undo 表空间能够确保undo 中的数据在undo_retention 指定时间过期前一定有效,就是为undo 表空间指定Retention Guarantee,指定之后,oracle 对于undo 表空间中未过期的undo 数据不会覆盖,
SQL> Altertablespace undotbs1 retention guarantee;
如果想禁止undo 表空间retention guarantee,
SQL> Altertablespace undotbs1 retention noguarantee;
2.3 manual管理模式
当将系统中初始化参数undo_management设置成manual后,系统启动后使用rollback segment方式存储undo信息。如果系统没有指定undo_management,那么系统默认以manual方式启动,即使设置了auto方式的参数,这些参数将被忽略。
当实例启动时,系统根据如下几个步骤确认online的rollback segment的数量:
初始化参数rollback_segments
初始化参数transactions、transactions_per_rollback_segment
与menual相关的初始化参数
rollback_segments 指定实例启动时所需要的回滚段
transactions 指定系统中最大的并发事务数
transactions_per_rollback_segment指定每一个回滚段支持的并发数
max_rollback_segments 指明系统支持的最大的online的回滚段数目
3 管理undo tablespace
创建undo talespace有两种方式:
1. 数据库创建时创建undo tablespace;
2. 在一个已经存在的数据库创建。
在undo tablespace中不能创建数据库对象,这是因为这个表空间是为数据库recover而准备的。
3.1 创建数据库时创建undo tablespace
在创建数据库的时候可以通过指定undo子句来创建undo tablespace,但是这个子句不是必须的。如果在创建数据库时,系统指定是auto模式,但是没有指明undo tablespace的名字,那么系统会创建一个默认的回滚表空间,名称叫sys_undotbs。这个表空间根据oracle定义的缺省值创建。初始化大小是10m,可以自动扩展。不过oracle推荐最好还是使用一个指定的大小。
CREATE DATABASE rbdb1
CONTROLFILE REUSE
...
UNDO TABLESPACE undotbs_01 DATAFILE '/u01/oracle/rbdb1/undo0101.dbf';
注意:如果此时系统创建undo失败,那么整个创建数据库的命令就失败了。此时
Dba需要删除已经创建的数据文件,纠正错误,重建创建数据库。
使用create undo tablespace子句创建
CREATE UNDO TABLESPACE undotbs_02
DATAFILE '/u01/oracle/rbdb1/undo0201.dbf' SIZE 2M REUSE
AUTOEXTEND ON;
3.2 Undotablespace的相关操作
l 增加数据文件
ALTER TABLESPACEundotbs_01
ADD DATAFILE'/u01/oracle/rbdb1/undo0102.dbf' AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;
l 2. 重命名数据文件
ALTER TABLESPACEundotbs_01 RENAME DATAFILE '/u01/oracle/rbdb1/undo0102.dbf' TO '/u01/oracle/rbdb1/undo0101.dbf';
l 3. 使数据文件online或者offline
ALTER TABLESPACEundotbs_01 online|offline;
l 4. 开始或者结束一个联机备份
ALTER TABLESPACEundotbs_01 BEGIN|END BACKUP;
l 5. 删除undo tablespace
Drop tablespaceundotbs_01;
Drop undo表空间的时候必须是在未使用的情况下才能进行。如果undo表空间正在使用(例如事务失败,但是还没有恢复成功),那么drop表空间命令将失败。在drop表空间的时候可以使用including contents。
l 6. 切换undo tablespace
切换undo表空间有两种方式:
1. 使用命令动态修改;
2. 修改初始化参数后重新启动数据库。
Alter system setundo_tablespace=undotbs1;
当切换命令完成后,所有的事务就会在新的回滚表空间内进行。
以下几种情况会导致切换命令失败:
1. 表空间不存在;
2.. 表空间不是一个回滚段表空间;
3. 表空间已经被另一个实例使用。
注意:切换的操作不等待旧undo表空间的事务提交。如果旧undo表空间有事务未提交,那么旧的undo表空间进入pending offline状态,在这种模式下所有的事务能够继续进行,但是undo表空间不能被其他实例使用,也不能被删除,直到所有的事务提交后, undo表空间才进入offline模式。
l 7. 设置undo_retention
dba可以设置undo_retention初始化参数指定undo回滚表空间保留undo信息的时间。在设置好这个参数时,系统会保留undo信息在指定的时间断后才收回这个空间。
一般情况下,系统会保留undo信息到指定的时间后才回收空间,但是,如果系统
存在大量的事务,也会将未到期的undo空间回收,以供使用。
l 8. Undo 表空间大小的设计规范的计算公式
Undospace = UR * UPS*db_block_size+ 冗余量
UR:表示在undo中保持的最长时间数(秒),由数据库参数UNDO_RETENTION值决定。
UPS:表示在undo中,每秒产生的数据库块数量。
和undo有关的动态性能视图v$undostat 包含undo的统计信息。使用这张视图可以估计系统当前所需的undo大小。
v$rollstat 是undo模式的视图。是undo表空间的undo segments的统计信息
v$transaction 包含undo segments的信息。
dba_undo_extents 包含undo表空间中每一个范围的提交时间。
4 管理回滚段
4.1 回滚段的使用方针
4.1.1 使用多个回滚段
使用多个回滚段来分担回滚段的争用,以提高系统性能。系统采用循环的方式来分配回滚段。当oracle创建数据库时候,系统自动在system中分配一个system rollback segment,用来完成系统的事务,不为大家共用。所以系统最后能有至少一个回滚段存放用户回滚信息。
系统能够加载的用户回滚段数量和以下几个初始化参数有关:
transactions_per_rollback_segment指定每一个回滚段支持的并发数;
max_rollback_segments 指明系统支持的最大的online的回滚段数目;
rollback_segments 指定实例启动时所需要的回滚段;
4.1.2 选择好回滚段的类型
private 必须通过实例指定名称后才能使用。
如:必须在初始化参数中rollback_segments指定后,实例启动才能使用,或者在实例启动后online才能使用。
Public 则是实例启动时系统自动发现,系统根据初始化参数决定系统启动时的回滚段。
4.1.3 为事务指定回滚段
在系统启动时指定所需要的回滚段,
4.1.4 估计回滚段的大小
回滚段大小应该基于系统最大的事务。如果回滚段过小,容易产生ora-01555错误。可以使用optimize选项来限制回滚段自动回收。回滚段的大小应该是最大表的大小的10%,这个可以指定maxextents的数量。
4.1.5 创建范围大小和数量相等的回滚段组
一般来说一个回滚段应该包含10到20个范围。
s=T/n
s是初始化时定义的范围的大小,T是初始化的回滚段大小,n是范围数。由此可以确定定义回滚段的子句的各个参数。
4.1.6 定义optimal的值
设置这个参数可以避免回滚段无限扩展以及系统自动回收空间。最小是两个范围的大小。
设置回滚段在不同的表空间
1:如果系统只有一个回滚表空间,那么回滚段出现问题,影响系统不能运行。
2:包含回滚段的表空间经常分配和去配容易产生碎片。
3:当回滚表空间被离线时,系统将没有回滚表空间可以用。
MINEXTENTS最小等于2
OPTIMAL最小应该设置成两个extents大小
INITIAL和 NEXT最好一样,除了应用使用指定的回滚段;
4.2 回滚段的相关操作
4.2.1 创建回滚段
当创建回滚段时,系统必须要有CREATE ROLLBACK SEGMENT系统权限。
创建的回滚段会online,并指定了存储参数;
create tablespacetest1 datafile '/u01/app/oracle/oradata/orcl/test01.dbf' size 1Gautoextend on extent management local uniform size 16M segment spacemanagement manual;
CREATE ROLLBACK SEGMENTRB01 TABLESPACE RBS1STORAGE (
INITIAL integer K|MNEXT integer K|M MINEXTENTS integer MAXEXTENTS integer OPTIMAL integer K|M );
set transactionuse rollback segment test01;
4.2.2 修改回滚段
修改回滚段当修改回滚段时,系统必须要有ALTER ROLLBACK SEGMENT系统权限。
使回滚段online或者offline;
ALTER ROLLBACK SEGMENTRB01 ONLINE;
修改存储参数;
ALTER ROLLBACK SEGMENTRB01 STORAGE ( MAXEXTENTS 200 OPTIMAL 2048K );
收缩回滚段;
ALTER ROLLBACK SEGMENTRB01 SHRINK;
注意:有OPTIMAL参数时, 缩小到OPTIMAL值; 没有OPTIMAL参数时, 缩小到MINEXTENTS所对应的尺寸
ALTER ROLLBACK SEGMENTRB01 SHRINK TO 2048K;
ALTER ROLLBACK SEGMENTRB01 STAROGE(MAXEXTENTS 120);
4.2.3 删除回滚段
当删除回滚段时,系统必须要有DROP ROLLBACK SEGMENT系统权限。
原则上,INITIAL总应该等于NEXT,除了使用SET TRANSACTION USE ROLLBACKSEGMENT XXX的回滚段。由于INITIAL不能直接修改,只能先drop然后创建。
DROP ROLLBACK SEGMENTRB01;
CREATE ROLLBACKSEGMENT RB01 TABLESPACE RBS1
STORAGE ( INITIAL 100KNEXT 100K MINEXTENTS 20 MAXEXTENTS 121 OPTIMAL 2000K);
在事务中使用特定的回滚段
SET TRANSACTION USEROLLBACK SEGMENT RB_LARGE1;
通过这个命令,可以:
根据事务量的大小,决定使用哪一个回滚段;
将大的查询的事务放入单独的回滚段;
当存在大的查询使用事务时,可以将它放入大的回滚段。
4.3 和回滚段相关的性能视图
DBA_ROLLBACK_GEGS 描述回滚段的信息,包含回滚段的名字和表空间;
DBA_SEGMENTS 描述回滚段的附加信息;
V$ROLLNAME 列出在线回滚段的名称
V$ROLLSTAT 包含回滚段的统计信息
V$TRANSACTION 包含撤销的统计信息
1. 模拟在线UNDO损坏分析与处理
对于Undo 损坏的情况,能用备份恢复最好,如果不能,就只能通过一些特殊的方法来恢复。
1.1 全备份
C:UsersAdministrator>RMAN TARGET / 恢复管理器: Release 11.2.0.1.0 - Production on 星期三 6月 13 11:53:00 2018 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 连接到目标数据库: ORCL (DBID=1502372298) RMAN> BACKUP DATABASE PLUS ARCHIVELOG; 启动 backup 于 13-6月 -18 当前日志已存档 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=74 设备类型=DISK 通道 ORA_DISK_1: 正在启动归档日志备份集 通道 ORA_DISK_1: 正在指定备份集内的归档日志 输入归档日志线程=1 序列=122 RECID=113 STAMP=978003468 输入归档日志线程=1 序列=123 RECID=114 STAMP=978082001 输入归档日志线程=1 序列=124 RECID=115 STAMP=978090709 输入归档日志线程=1 序列=125 RECID=116 STAMP=978126971 输入归档日志线程=1 序列=126 RECID=117 STAMP=978127266 输入归档日志线程=1 序列=127 RECID=118 STAMP=978128757 输入归档日志线程=1 序列=128 RECID=119 STAMP=978170909 输入归档日志线程=1 序列=129 RECID=120 STAMP=978255952 输入归档日志线程=1 序列=130 RECID=121 STAMP=978259623 输入归档日志线程=1 序列=131 RECID=122 STAMP=978366420 输入归档日志线程=1 序列=132 RECID=123 STAMP=978368444 输入归档日志线程=1 序列=133 RECID=124 STAMP=978373110 输入归档日志线程=1 序列=134 RECID=125 STAMP=978513290 输入归档日志线程=1 序列=135 RECID=126 STAMP=978534551 输入归档日志线程=1 序列=136 RECID=127 STAMP=978600031 输入归档日志线程=1 序列=137 RECID=128 STAMP=978630010 输入归档日志线程=1 序列=138 RECID=129 STAMP=978686840 输入归档日志线程=1 序列=139 RECID=130 STAMP=978695591 通道 ORA_DISK_1: 正在启动段 1 于 13-6月 -18 通道 ORA_DISK_1: 已完成段 1 于 13-6月 -18 段句柄=D:APPADMINISTRATORFLASH_RECOVERY_AREAORCLBACKUPSET2018_06_13O1_MF_ANNNN_TAG20180613T115311_FL15985C_.BKP 标记=TAG20180613T115311 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:07 完成 backup 于 13-6月 -18 启动 backup 于 13-6月 -18 使用通道 ORA_DISK_1 通道 ORA_DISK_1: 正在启动全部数据文件备份集 通道 ORA_DISK_1: 正在指定备份集内的数据文件 输入数据文件: 文件号=00001 名称=D:APPADMINISTRATORORADATABAK01DATAFILE_DATA_D-ORCL_I-1502372298_TS-SYSTEM_FNO-1_2JT2KBIK.DBF 输入数据文件: 文件号=00002 名称=D:APPADMINISTRATORORADATABAK02DATAFILE_DATA_D-ORCL_I-1502372298_TS-SYSAUX_FNO-2_2KT2KBIK.DBF 输入数据文件: 文件号=00003 名称=D:APPADMINISTRATORORADATABAK02DATAFILE_DATA_D-ORCL_I-1502372298_TS-UNDOTBS1_FNO-3_2MT2KBJ3.DBF 输入数据文件: 文件号=00005 名称=D:APPADMINISTRATORORADATABAK01DATAFILE_DATA_D-ORCL_I-1502372298_TS-T1_FNO-5_2LT2KBJ3.DBF 输入数据文件: 文件号=00004 名称=D:APPADMINISTRATORORADATABAK02DATAFILE_DATA_D-ORCL_I-1502372298_TS-USERS_FNO-4_2OT2KBJ5.DBF 输入数据文件: 文件号=00006 名称=D:APPBLOCKTEST.DBF 通道 ORA_DISK_1: 正在启动段 1 于 13-6月 -18 通道 ORA_DISK_1: 已完成段 1 于 13-6月 -18 段句柄=D:APPADMINISTRATORFLASH_RECOVERY_AREAORCLBACKUPSET2018_06_13O1_MF_NNNDF_TAG20180613T115319_FL159HH1_.BKP 标记=TAG20180613T115319 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:15 通道 ORA_DISK_1: 正在启动全部数据文件备份集 通道 ORA_DISK_1: 正在指定备份集内的数据文件 备份集内包括当前控制文件 备份集内包括当前的 SPFILE 通道 ORA_DISK_1: 正在启动段 1 于 13-6月 -18 通道 ORA_DISK_1: 已完成段 1 于 13-6月 -18 段句柄=D:APPADMINISTRATORFLASH_RECOVERY_AREAORCLBACKUPSET2018_06_13O1_MF_NCSNF_TAG20180613T115319_FL159ZMH_.BKP 标记=TAG20180613T115319 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01 完成 backup 于 13-6月 -18 启动 backup 于 13-6月 -18 当前日志已存档 使用通道 ORA_DISK_1 通道 ORA_DISK_1: 正在启动归档日志备份集 通道 ORA_DISK_1: 正在指定备份集内的归档日志 输入归档日志线程=1 序列=140 RECID=131 STAMP=978695616 通道 ORA_DISK_1: 正在启动段 1 于 13-6月 -18 通道 ORA_DISK_1: 已完成段 1 于 13-6月 -18 段句柄=D:APPADMINISTRATORFLASH_RECOVERY_AREAORCLBACKUPSET2018_06_13O1_MF_ANNNN_TAG20180613T115336_FL15B0WW_.BKP 标记=TAG20180613T115336 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01 完成 backup 于 13-6月 -18 RMAN> |
1.2 确认当前UNDO
C:UsersAdministrator>SQLPLUS / AS SYSDBA SQL*Plus: Release 11.2.0.1.0 Production on 星期三 6月 13 11:57:40 2018 Copyright (c) 1982, 2010, Oracle. All rights reserved. 连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> SHOW PARAMETER UNDO NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_management string AUTO undo_retention integer 900 undo_tablespace string UNDOTBS1 SQL> SELECT FILE_NAME FROM DBA_DATA_FILES WHERE TABLESPACE_NAME='UNDOTBS1'; FILE_NAME -------------------------------------------------------------------------------- D:APPADMINISTRATORORADATABAK02DATAFILE_DATA_D-ORCL_I-1502372298_TS-UNDOTBS1_FNO-3_2MT2KBJ3.DBF SQL> |
1.3 破坏UNDO
采用UE对UNDO数据文件进行编辑,模拟大面积损坏
SQL> SHUTDOWNIMMEDIATE;
ORA-01122: 数据库文件 3 验证失败
ORA-01110: 数据文件 3:'D:APPADMINISTRATORORADATABAK02DATAFILE_DATA_D-ORCL_I-1502372298_TS-UNDOTBS1_FNO-3_2MT2KBJ3.DBF'
ORA-01210: 数据文件标头发生介质损坏
SQL> INSERT INTO T1SELECT * FROM DBA_OBJECTS;
已创建72195行。
SQL> /
已创建72195行。
SQL> /
已创建72195行。
SQL> /
INSERT INTO T1 SELECT* FROM DBA_OBJECTS
*
第 1 行出现错误:
ORA-03113: 通信通道的文件结尾
进程 ID: 5560
会话 ID: 74 序列号: 538
SQL> SELECTOPEN_MODE FROM v$database;
ERROR:
ORA-03114: 未连接到 ORACLE
SQL> EXIT
从 Oracle Database 11g EnterpriseEdition Release 11.2.0.1.0 - Production
With the Partitioning,OLAP, Data Mining and Real Application Testing options 断开
C:UsersAdministrator>SQLPLUS/ AS SYSDBA
SQL*Plus: Release11.2.0.1.0 Production on 星期三 6月 13 12:06:20 2018
Copyright (c) 1982,2010, Oracle. All rights reserved.
已连接到空闲例程。
SQL>
Read of datafile'D:APPADMINISTRATORORADATABAK02DATAFILE_DATA_D-ORCL_I-1502372298_TS-UNDOTBS1_FNO-3_2MT2KBJ3.DBF'(fno 3) header failed with ORA-01210
Hex dump of (file 3,block 1) in trace filed:appadministratordiagrdbmsorclorcltraceorcl_ckpt_3640.trc
Corrupt block relativedba: 0x00c00001 (file 3, block 1)
Bad header foundduring datafile header read
Data in bad block:
type: 10 format: 3 rdba: 0x0000003e
last change scn: 0x0000.00000000 seq: 0x0 flg:0x00
spare1: 0x51 spare2: 0x4c spare3: 0x0
consistency value in tail: 0x50202d20
check value in block header: 0x0
block checksum disabled
Rereading datafile 3header failed with ORA-01210
Errors in filed:appadministratordiagrdbmsorclorcltraceorcl_ckpt_3640.trc:
ORA-63998: undotablespace file suffered media failure
ORA-01122: databasefile 3 failed verification check
ORA-01110: data file3: 'D:APPADMINISTRATORORADATABAK02DATAFILE_DATA_D-ORCL_I-1502372298_TS-UNDOTBS1_FNO-3_2MT2KBJ3.DBF'
ORA-01210: data fileheader is media corrupt
Errors in filed:appadministratordiagrdbmsorclorcltraceorcl_ckpt_3640.trc:
ORA-63998: undotablespace file suffered media failure
ORA-01122: databasefile 3 failed verification check
ORA-01110: data file3:'D:APPADMINISTRATORORADATABAK02DATAFILE_DATA_D-ORCL_I-1502372298_TS-UNDOTBS1_FNO-3_2MT2KBJ3.DBF'
ORA-01210: data fileheader is media corrupt
CKPT (ospid: 3640):terminating the instance due to error 63998
1.4 处理方案
1.4.1 使用备份
SQL> startup mount; ORACLE 例程已经启动。 Total System Global Area 1071333376 bytes Fixed Size 1375792 bytes Variable Size 654311888 bytes Database Buffers 411041792 bytes Redo Buffers 4603904 bytes 数据库装载完毕。 C:UsersAdministrator>rman target / 恢复管理器: Release 11.2.0.1.0 - Production on 星期三 6月 13 12:09:43 2018 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 已连接到目标数据库: ORCL (DBID=1502372298, 未打开) RMAN> restore tablespace UNDOTBS1; 启动 restore 于 13-6月 -18 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=63 设备类型=DISK 通道 ORA_DISK_1: 正在开始还原数据文件备份集 通道 ORA_DISK_1: 正在指定从备份集还原的数据文件 通道 ORA_DISK_1: 将数据文件 00003 还原到 D:APPADMINISTRATORORADATABAK02DATAFILE_DATA_D-ORCL_I-1502372298_TS-UNDOTBS1_FNO-3_2MT2KBJ3.DBF 通道 ORA_DISK_1: 正在读取备份片段 D:APPADMINISTRATORFLASH_RECOVERY_AREAORCLBACKUPSET2018_06_13O1_MF_NNNDF_TAG20180613T115319_FL159HH1_.BKP 通道 ORA_DISK_1: 段句柄 = D:APPADMINISTRATORFLASH_RECOVERY_AREAORCLBACKUPSET2018_06_13O1_MF_NNNDF_TAG20180613T115319_FL159HH1_.BKP 标记 = TAG20180613T115319 通道 ORA_DISK_1: 已还原备份片段 1 通道 ORA_DISK_1: 还原完成, 用时: 00:00:01 完成 restore 于 13-6月 -18 RMAN> recover tablespace UNDOTBS1; 启动 recover 于 13-6月 -18 使用通道 ORA_DISK_1 正在开始介质的恢复 线程 1 序列 140 的归档日志已作为文件 D:APPADMINISTRATORFLASH_RECOVERY_AREAORCLARCHIVELOG2018_06_13O1_MF_1_140_FL15B0RZ_.ARC 存在于磁盘上 线程 1 序列 141 的归档日志已作为文件 D:APPADMINISTRATORFLASH_RECOVERY_AREAORCLARCHIVELOG2018_06_13O1_MF_1_141_FL15YVLR_.ARC 存在于磁盘上 线程 1 序列 142 的归档日志已作为文件 D:APPADMINISTRATORFLASH_RECOVERY_AREAORCLARCHIVELOG2018_06_13O1_MF_1_142_FL15YXJH_.ARC 存在于磁盘上 归档日志文件名=D:APPADMINISTRATORFLASH_RECOVERY_AREAORCLARCHIVELOG2018_06_13O1_MF_1_140_FL15B0RZ_.ARC 线程=1 序列=140 介质恢复完成, 用时: 00:00:01 完成 recover 于 13-6月 -18 RMAN> alter database open; 数据库已打开 RMAN> SQL> desc t1 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- OWNER VARCHAR2(30) OBJECT_NAME VARCHAR2(128) SUBOBJECT_NAME VARCHAR2(30) OBJECT_ID NUMBER DATA_OBJECT_ID NUMBER OBJECT_TYPE VARCHAR2(19) CREATED DATE LAST_DDL_TIME DATE TIMESTAMP VARCHAR2(19) STATUS VARCHAR2(7) TEMPORARY VARCHAR2(1) GENERATED VARCHAR2(1) SECONDARY VARCHAR2(1) NAMESPACE NUMBER EDITION_NAME VARCHAR2(30) SQL> select count(1)from t1; COUNT(1) ---------- 0 SQL> insert into t1 select *from dba_objects; 已创建72195行。 SQL> / 已创建72195行。 SQL> / 已创建72195行。 SQL> / 已创建72195行。 SQL> / 已创建72195行。 SQL> / 已创建72195行。 SQL> / 已创建72195行。 SQL> / 已创建72195行。 SQL> SQL> rollback; 回退已完成。 |
1.4.2 使用system回滚段
SQL> SHOW PARAMETER UNDO
NAME TYPE VALUE
----------------------------------------------- ------------------------------
undo_management string MANUAL
undo_retention integer 900
undo_tablespace string UNDOTBS1
SQL> ALTER SYSTEM SETundo_tablespace='UNDO01';
ALTER SYSTEM SET undo_tablespace='UNDO01'
*
第 1 行出现错误:
ORA-02097: 无法修改参数, 因为指定的值无效
ORA-30014: 此操作仅在自动还原管理模式中才受支持
ALTER TABLESPACE UNDO01 RENAME TO UNDOTBS1;
ALTER SYSTEM SET undo_management='AUTO'SCOPE=SPFILE;
SQL> STARTUP FORCE
ORACLE 例程已经启动。
Total System Global Area 1071333376 bytes
Fixed Size 1375792 bytes
Variable Size 654311888 bytes
Database Buffers 411041792 bytes
Redo Buffers 4603904 bytes
数据库装载完毕。
数据库已经打开。
(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 undotbs1datafile '/u01/oradata/undotbs1.dbf' size 10M;
(4)关闭数据库,修改pfile参数,然后用新的pfile创建spfile,在正常启动数据库。
*.undo_tablespace='UNDOTBS1'
*.undo_management='AUTO'
#undo_management='MANUAL'
#rollback_segments='SYSTEM'
1.4.3 Offline问题回滚段
在方法一里面,我们使用了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 undotbs1datafile '/u01/oradata/undotbs1.dbf' size 10M;
SQL> alter system setundo_tablespace=undotbs1;
SQL> drop tablespace undotbs;
(4)修改pfile,创建spfile,并正常启动
删除:
*._corrupted_rollback_segments='_SYSSMU17_3258850754$','_SYSSMU18_1560552499$','_SYSSMU19_3750826791$','_SYSSMU20_924472039$','_SYSSMU21_4134287356$','_SYSSMU22_2898004348$','_SYSSMU23_2008707645$','_SYSSMU24_2472805197$','_SYSSMU25_568075632$','_SYSSMU26_3632899113$','_SYSSMU27_50916201$','_SYSSMU28_626286025$'
以上就是UNDO 出现故障的2种处理方法。
select wm_concat(''''||segment_name||'''') from dba_rollback_segs where tablespace_name='UNDOTBS1'
altersystem set"_corrupted_rollback_segments"='_SYSSMU17_3258850754$','_SYSSMU18_1560552499$','_SYSSMU19_3750826791$','_SYSSMU20_924472039$','_SYSSMU21_4134287356$','_SYSSMU22_2898004348$','_SYSSMU23_2008707645$','_SYSSMU24_2472805197$','_SYSSMU25_568075632$','_SYSSMU26_3632899113$','_SYSSMU27_50916201$','_SYSSMU28_626286025$'scope=spfile;
转载:https://blog.csdn.net/xujinyang/article/details/6822947
最后
以上就是细腻纸鹤为你收集整理的UNDO切换、损坏损坏分析整理1 什么是undo2 指定Undo的方式3 管理undo tablespace4 管理回滚段1. 模拟在线UNDO损坏分析与处理的全部内容,希望文章能够帮你解决UNDO切换、损坏损坏分析整理1 什么是undo2 指定Undo的方式3 管理undo tablespace4 管理回滚段1. 模拟在线UNDO损坏分析与处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复