您好,登錄后才能下訂單哦!
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
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。
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>
提到了一種方法,就是使用SYSTEM 的回滾段, 步驟如下:
#*.undo_tablespace='UNDOTBS1'
#*.undo_management='AUTO'
#*.undo_tablespace
#*.undo_retention
undo_management='MANUAL'
rollback_segments='SYSTEM'
SQL> STARTUP MOUNT pfile='F:/initorcl.ora' ;
SQL> drop tablespace undotbs;
SQL> create undo tablespace undotbs1 datafile '/u01/oradata/undotbs1.dbf' size 10M;
*.undo_tablespace='UNDOTBS1'
*.undo_management='AUTO'
#undo_management='MANUAL'
#rollback_segments='SYSTEM'
在方法一中,我們使用了system segment。 通過第一部分我們了解到,undo segment 有多個,我們可以通過alert log 來查看正在使用的是哪些segment,這些段有可能損壞了。 我們只需要把這些損壞的segment 跳過,先正常啟動DB,在創建新的UNDO 表空間,在切換一下。
*._corrupted_rollback_segments='_SYSSMU11$','_SYSSMU12$','_SYSSMU13$'
這些字段的值,我們通過alert log 查看。 也可以通過如下命令查看:
#strings system01.dbf | grep _SYSSMU | cut -d $ -f 1 | sort -u
因為跳過了哪些損壞的segment,所以DB 可以正常啟動。
SQL> create undo tablespace undotbs1 datafile '/u01/oradata/undotbs1.dbf' size 10M;
SQL> alter system set undo_tablespace=undotbs1;
SQL> drop tablespace undotbs;
刪除如下:
*._corrupted_rollback_segments='_SYSSMU11$','_SYSSMU12$','_SYSSMU13$'
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/用戶數據文件)壞塊也可用這種方式修復
在沒有備份的情況下,
使用_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 出現故障的幾種處理方法,其中方法二和方法四類似,都是采用參數進行恢復。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。