oracle數據庫壞塊修復
瀏覽量: 次 發布日期:2018-01-25 15:33:46
oracle數據庫修復壞塊
1.檢測Oracle 數據庫修復壞快的方法有以下2種:
a)DBV(DB File Verify)工具
外部命令,物理介質數據結構完整性檢查;
只能用于數據文件(offline或online),不支持控制文件和重做日志文件的塊檢查;
也可以驗證備份文件(rman的copy命令備份或操作系統CP命令備份);
b)RMAN(Recovery Manger)工具
邏輯數據結構完整性檢查;
在線使用Recovery Manager掃描壞塊和備份時,需要數據庫運行在歸檔模式(archive log),否則只能在數據庫未打開(mount)的情況下進行;
oracle 數據庫修復熱線:400-666-3702
數據庫修復
行RMAN冷備的過程中報如下錯,某個表空間備份失敗。
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on ch00 channel at 04/25/2015 22:02:30
ORA-19566: exceeded limit of 0 corrupt blocks for file +DATA/dbrac/datafile/tbs_11.11.435678937
經過分析發現壞塊導致,且壞塊不屬于任何對象(空塊),以下是本次壞塊修復步驟:
1、查找壞塊
1)使用RMAN查找壞塊
驗證整個數據庫:
Rman> backup validate check logical database ;
注:當數據庫版本低于11g且非歸檔模式,以上命令必須在數據庫處于mounted狀態執行
驗證單個datafile
Rman> backup validate check logical datafile 11 ;
而后執行以下SQL查看壞塊:
SQL>Select * from v$database_block_corruption ;
例如:
validate.sh
#!/bin/bash
source /home/Oracle/.bash_profile
$ORACLE_HOME/bin/rman log=/home/oracle/users/validate.log <<EOF
connect target /
Backup validate check logical datafile 11 ;
exit;
EOF
2)使用DBV查找壞塊:
dbv userid=system/system file='+DATA/dbrac/datafile/tbs_11.11.435678937' blocksize=32768
2、確認壞塊是否不屬于任何對象
select segment_name, segment_type, owner
from dba_extents
where file_id = <Absolute file number>
and <corrupted block number> between block_id
and block_id + blocks -1;
例如:
alter session force parallel query parallel 10;
select segment_name, segment_type, owner
from dba_extents
where file_id = 11
and 184959440 between block_id
and block_id + blocks -1;
3、確認塊在 dba_free_space存在
Select * from dba_free_space where file_id= <Absolute file number>
and <corrupted block number> between block_id and block_id + blocks -1;
例如:
Select * from dba_free_space where file_id= 11 and 184959440 between block_id and block_id + blocks -1;
4、創建表
create table s (
n number,
c varchar2(4000)
) nologging tablespace <tablespace name having the corrupt block> pctfree 99;
例如:
create table users.s (
n number,
c varchar2(4000)
) nologging tablespace TBS_11 pctfree 99;
select segment_name,tablespace_name from dba_segments
where segment_name='S' ;
Select table_name,tablespace_name from dba_tables where table_name='S' ;
5、創建觸發器
CREATE OR REPLACE TRIGGER corrupt_trigger
AFTER INSERT ON users.s
REFERENCING OLD AS p_old NEW AS new_p
FOR EACH ROW
DECLARE
corrupt EXCEPTION;
BEGIN
IF (dbms_rowid.rowid_block_number(:new_p.rowid)=&blocknumber)
and (dbms_rowid.rowid_relative_fno(:new_p.rowid)=&filenumber) THEN
RAISE corrupt;
END IF;
EXCEPTION
WHEN corrupt THEN
RAISE_APPLICATION_ERROR( -20000, 'Corrupt block has been formatted');
END;
/
6、分配空間創建在有壞塊的datafile上的表
注:
i)因為ASSM會自動確定下一個區段的大小,所以在ASSM的表空間上,需要創建多個表及
不斷的分配空間給這些表,直到壞塊被分配至其中一個對象。
ii)設置datafile的AUTOEXTEND為OFF
1)查找壞塊的extent size
Select BYTES from dba_free_space where file_id=<file no> and <corrupt block no> between
block_id and block_id + blocks -1;
例如:
alter database datafile '+DATA/dbrac/datafile/tbs_11.11.435678937' autoextend off;
SQL> Select BYTES from dba_free_space where file_id=11 and 184959440 between
2 block_id and block_id + blocks -1;
BYTES
----------
29360128
2)不斷allocate直到壞塊是S表的一部分
如果步驟1輸出結果是64K,執行以下SQL:
alter table users.s
allocate extent (DATAFILE '+DATA/dbrac/datafile/tbs_11.11.435678937' SIZE 64K);
如果大于64K使用以下
BEGIN
for i in 1..1000000 loop
EXECUTE IMMEDIATE 'alter table users.s allocate extent (DATAFILE '||'''+DATA/dbrac/datafile/tbs_11.11.435678937'''||'SIZE 64K) ';
end loop;
end ;
/
使用如下SQL查詢壞塊是否已屬于某個對象:
select segment_name, segment_type, owner
from dba_extents
where file_id = <Absolute file number>
and <corrupt block number> between block_id
and block_id + blocks -1 ;
例如:
select segment_name, segment_type, owner
from dba_extents
where file_id = 11
and 184959440 between block_id
and block_id + blocks -1 ;
3)插入數據初始化壞塊
Begin
FOR i IN 1..1000000000 loop
for j IN 1..100000 loop
Insert into users.s VALUES(i,'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
end loop;
commit;
END LOOP;
END;
7、驗證是否存在壞塊
Rman> Backup validate check logical datafile <fileno> ;
或者validate datafile <fileno> block <blockno reported corrupt>, <blockno reported corrupt> ;
Select * from v$database_block_corruption ;
例如:
validate datafile 11 block 184959440, 184961480,184961481 ;
Select * from v$database_block_corruption ;
8、當第7步確認壞塊已消除,即可刪除測試表
DROP TABLE users.s purge;
9、切換多次日志及checkpoint
Alter system switch logfile ;
Alter system checkpoint ;
10、刪除觸發器
DROP trigger CORRUPT_TRIGGER ;
DROP trigger corrupt_trigger1 ;
DROP trigger corrupt_trigger2 ;
. oracle歸檔日志設置,Oracle數據庫歸檔日志設置詳解
. oracle drop表數據恢復,Oracle數據庫中drop表數據恢復方法詳解
. oracle 刪除數據文件,Oracle 數據文件刪除指南
. 如何查看oracle錯誤日志,Oracle數據庫錯誤日志查看指南
. oracle刪除的數據怎么恢復,Oracle數據庫中刪除數據恢復指南
. oracle一個實例多個數據庫,Oracle數據庫實例與多個數據庫的配置與管理
. ora-01578:oracle 數據塊損壞,oracle數據塊損壞
. oracle恢復歸檔日志文件,Oracle數據庫恢復歸檔日志文件的方法與技巧
. Oracle database 完全恢復,全面解析與操作指南