客戶那邊的數據庫久無人維護,近期反映服務器空間不夠。在檢查服務器空間時,我又偶然發現了數據庫的備份出現問題。
經檢查是數據庫sysaux表空間存在一個壞塊,存在壞塊的表是WRH$_ENQUEUE_STAT,在測試庫上查詢數據後,我確定該表的數據對整個系統的運行影響不大。
此時沒有RMAN備份可以使用,block recover無法使用。於是決定將表刪除重建。不過這麼做之後,原有的數據塊反而變成了遊離塊。爲了修復遊離塊,我就在測試庫上開始做測試。
1、模擬數據庫損壞
1)模擬數據庫的損壞可以使用ddbd,該工具的配置可以參考以下鏈接:
http://www.cnblogs.com/jyzhao/p/5139584.html
2)模擬要損壞的塊
select file_id,block_id from dba_extents where segment_name='WRH$_ENQUEUE_STAT';
結果是file_id=2,block_id=4440
modify /x 62 file 2 block 4440 offset 255;
3)rman命令中,執行 backup validate database或者 backup validate datafile 2;
使用視圖v$database_block_corruption查看backup操作發現的損壞的塊。
select * from v$database_block_corruption;
4)表刪除並且重建,發現file2 4440變成了遊離塊
select * from dba_extents where file_id=2 and 4440 between block_id-1 and block_id+1;#查詢無數據
2、壞塊修復
1)表空間修改爲不能自動增長
alter database datafile 2 autoextend off;
2)在sysaux上創建實體表
create table test(id varchar(50)) tablespace sysaux;
3)插入數據直到報ORA01653的錯誤,連insert into test values('aaaaaaaaaa')都執行失敗
insert into test values('aaaaaaaaaa');
commit;
insert into test
select *
from test;
commit;
4)再創建一張實體表
create table test_2(id varchar(50)) tablespace sysaux;
-- 查看file 2 block_id 4440 是否有數據
select * from dba_extents where file_id=2 and 4440 between block_id-1 and block_id+1;#模擬到此步,file 2 block_id 4440查詢出來爲test_2的數據。
5)刪除測試表
drop table test_1;
drop table test;
6)表空間增長模式改爲自動增長
alter database datafile 2 autoextend on;
7) 在RMAN中測試備份,可以正常執行全備。
RMAN>backup incremental level 0 database;