SQL> show parameter undo
創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比黎城網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式黎城網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋黎城地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。
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。肯定會影響數(shù)據(jù)庫的性能。 所以O(shè)racle 是建議使用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的查詢結(jié)果,我們可以看出,有10個undo segment來存放undo records。
以上我們是通過dba_segment視圖查看的結(jié)果。而也可以通過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,在創(chuàng)建新的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
--修復(fù)壞塊
RMAN> blockrecover datafile 22 block 32120 from backupset;
--打開數(shù)據(jù)庫
alter database open;
注:其它文件(system/sysaux/用戶數(shù)據(jù)文件)壞塊也可用這種方式修復(fù)
在沒有備份的情況下,
使用_offline_rollback_segments和_corrupted_rollback_segments
1.先把數(shù)據(jù)文件offline,在mount狀態(tài)下執(zhí)行:
alter database datafile '/oracle/app/oracle/oradata/cus/undotbs01.dbf' offline;
alter database open;
2.查詢哪些undo段是需要恢復(fù)(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,添加隱含參數(shù)
--根據(jù)第2步查詢需要恢復(fù)的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.去掉隱含參數(shù),重新啟動數(shù)據(jù)庫
將pfile.txt文件去掉前面兩個隱含參數(shù)_offline_rollback_segments和_corrupted_rollback_segments,然后重新啟動數(shù)據(jù)庫
shutdown immediate;
startup pfile='/home/oracle/pfile.txt';
create spfile from pfile='/home/oracle/pfile.txt';
shutown immediate;
startup;
以上就是UNDO 出現(xiàn)故障的幾種處理方法,其中方法二和方法四類似,都是采用參數(shù)進行恢復(fù)。