模擬壞塊故障並搶救資料(一.普通表)
DB:Oracle 11.2.0.4.0
已建立示例表空間CCDATA,schema為cc,資料檔案o1_mf_ccdata_bn8l5x7l_.dbf
找到該表空間中的一個表CUSTACCOUNTS,看看它的block_id範圍
點選(此處)摺疊或開啟
-
select owner, segment_name, segment_type,
-
extent_id, file_id, block_id, blocks
-
from dba_extents
- where owner='CC' and segment_name='CUSTACCOUNTS'
OWNER | SEGMENT_NAME | SEGMENT_TYPE | EXTENT_ID | FILE_ID | BLOCK_ID | BLOCKS |
CC | CUSTACCOUNTS | TABLE | 0 | 5 | 896 | 128 |
CC | CUSTACCOUNTS | TABLE | 1 | 5 | 1152 | 128 |
CC | CUSTACCOUNTS | TABLE | 2 | 5 | 1408 | 128 |
CC | CUSTACCOUNTS | TABLE | 3 | 5 | 1664 | 128 |
CC | CUSTACCOUNTS | TABLE | 4 | 5 | 1792 | 128 |
CC | CUSTACCOUNTS | TABLE | 5 | 5 | 2048 | 128 |
CC | CUSTACCOUNTS | TABLE | 6 | 5 | 2304 | 128 |
CC | CUSTACCOUNTS | TABLE | 7 | 5 | 2560 | 128 |
CC | CUSTACCOUNTS | TABLE | 8 | 5 | 2688 | 128 |
CC | CUSTACCOUNTS | TABLE | 9 | 5 | 2944 | 128 |
CC | CUSTACCOUNTS | TABLE | 10 | 5 | 3200 | 128 |
CC | CUSTACCOUNTS | TABLE | 11 | 5 | 3456 | 128 |
CC | CUSTACCOUNTS | TABLE | 12 | 5 | 3712 | 128 |
使用UE開啟資料檔案。怎麼確定block_id=1000在資料檔案的哪個位置呢。塊大小8192位元組,8192×1000=8192,000,轉換成16進製為007D 0000。隨意改這一行第一個數字為FF,儲存退出。
注:以上操作要在Oracle關閉狀態下操作,別且要做好備份。
開啟資料庫,試試查詢該表。
點選(此處)摺疊或開啟
- SQL> select * from CUSTACCOUNTS;
CAID CAVALIDFROM CAVALIDTO
---------- ------------------- -------------------
CANAME
----------------------------------------------------------------
CAPIN
----------------------------------------------------------------
CALASTLOGIN CAFAILEDLOGINS CALASTFAILEDLOGIN
------------------- -------------- -------------------
10763 1970-01-01 00:00:00 4312-12-31 23:59:59
0000000000010763
1234
1970-01-01 00:00:00 0 1970-01-01 00:00:00
--查詢進行了一段時間後,報錯
ERROR:
ORA-01578: ORACLE data block corrupted (file # 5, block # 1000)
ORA-01110: data file 5: '/oradata/APR/datafile/o1_mf_ccdata_bn8l5x7l_.dbf'
這時,如果有RMAN備份,恢復很簡單
點選(此處)摺疊或開啟
- RMAN> blockrecover datafile 5 block 1000;
壞塊檢查
當前已出現的壞塊記錄在檢視v$database_block_corruption
點選(此處)摺疊或開啟
- select * from v$database_block_corruption
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTION_TYPE
---------- ---------- ---------- ------------------ ------------------
5 1000 1 0 CORRUPT
點選(此處)摺疊或開啟
-
[oracle@apr datafile]$ dbv file=o1_mf_ccdata_bn8l5x7l_.dbf
-
-
DBVERIFY: Release 11.2.0.4.0 - Production on Sat May 2 16:54:32 2015
-
-
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
-
-
DBVERIFY - Verification starting : FILE = /oradata/APR/datafile/o1_mf_ccdata_bn8l5x7l_.dbf
-
Page 10000 is marked corrupt
-
Corrupt block relative dba: 0x01402710 (file 5, block 10000)
-
Bad header found during dbv:
-
Data in bad block:
-
type: 255 format: 2 rdba: 0x01402710
-
last change scn: 0x0000.0011261f seq: 0x1 flg: 0x06
-
spare1: 0x0 spare2: 0x0 spare3: 0x0
-
consistency value in tail: 0x261f0601
-
check value in block header: 0x7764
-
computed block checksum: 0xf9
-
-
-
-
DBVERIFY - Verification complete
-
-
Total Pages Examined : 222848
-
Total Pages Processed (Data) : 103647
-
Total Pages Failing (Data) : 0
-
Total Pages Processed (Index): 54090
-
Total Pages Failing (Index): 0
-
Total Pages Processed (Other): 2756
-
Total Pages Processed (Seg) : 0
-
Total Pages Failing (Seg) : 0
-
Total Pages Empty : 62354
-
Total Pages Marked Corrupt : 1
-
Total Pages Influx : 0
-
Total Pages Encrypted : 0
- Highest block SCN : 1135578 (0.1135578)
根據羅敏的《感悟Oracle核心技術》,推薦用ROWID掃描方法搶救資料。
//2016.04.08更新
首先需要定位到壞塊屬於哪個資料庫物件。
點選(此處)摺疊或開啟
-
select owner,segment_name,segment_type,block_id,blocks from dba_extents
where file_id = 5
and block_id 10000;
SELECT dbms_rowid.rowid_create(1, , , , 0) LOW_RID from DUAL;
最大ROW_ID
SELECT dbms_rowid.rowid_create(1, , , +1, 0) HI_RID from DUAL;
點選(此處)摺疊或開啟
- SQL> SELECT OBJECT_ID FROM DBA_OBJECTS WHERE OWNER='CC' AND OBJECT_NAME='CUSTACCOUNTS';
OBJECT_ID
----------
87524
點選(此處)摺疊或開啟
-
SQL> SELECT dbms_rowid.rowid_create(1, 87524, 5, 1000, 0) LOW_RID from DUAL;
-
LOW_RID
------------------------------------
AAAVXkAAFAAAAPoAAA
- SQL> SELECT dbms_rowid.rowid_create(1, 87524, 5, 1001, 0) HI_RID from DUAL;
-
HI_RID
------------------------------------
AAAVXkAAFAAAAPpAAA
點選(此處)摺疊或開啟
-
--將壞塊所在的錶轉存到另一“安全”的表空間
-
CREATE TABLE ccbak.CUSTACCOUNTS_BAK
-
TABLESPACE ccbak
-
AS SELECT /*+ ROWID(A) */ * FROM CC.CUSTACCOUNTS A
- WHERE ROWID < 'AAAVXkAAFAAAAPoAAA';
- --繼續
- INSERT INTO ccbak.CUSTACCOUNTS_BAK
-
SELECT /*+ ROWID(A) */ * FROM CC.CUSTACCOUNTS A
- WHERE ROWID >= 'AAAVXkAAFAAAAPpAAA';
-
commit;
點選(此處)摺疊或開啟
-
drop table CC.CUSTACCOUNTS;
- purge recyclebin;
點選(此處)摺疊或開啟
-
SQL> create directory ccdir as '/home/oracle/ccdir';
- [oracle@apr ~]$ expdp system/oracle@apr schemas=cc dumpfile=cc.dmp DIRECTORY=ccdir
點選(此處)摺疊或開啟
- SQL> drop tablespace ccdata including contents AND datafiles;
點選(此處)摺疊或開啟
-
SQL> create tablespace ccdata datafile size 1G autoextend on;
-
- SQL> alter user cc default tablespace ccdata;
點選(此處)摺疊或開啟
- impdp system/oracle@apr DIRECTORY=ccdir DUMPFILE=cc.dmp SCHEMAS=cc
注:ROWID掃描方法適用於使用者表和分割槽表段內的壞塊,對段頭和系統表壞塊不適用。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22621861/viewspace-1619107/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 普通表空間資料檔案壞塊Oracle
- Oracle中模擬修復資料塊損壞Oracle
- 搶救零磁軌損壞的軟盤資料 (轉)
- 【EM】資料表誤刪除故障模擬及恢復
- oracle壞塊模擬處理(筆記)Oracle筆記
- 模擬一則ORA-600 [4194][][]故障並處理
- 是用bbed工具模擬對塊的破壞,並使用rman bock recover進行塊恢復
- Oracle資料庫壞塊(corruption)-物理壞塊Oracle資料庫
- 【故障分析】通過壞塊提示資訊確定損壞的資料庫物件資訊資料庫物件
- 記一次mysql生產誤刪表搶救操作MySql
- 模擬oracle裡的各種型別的壞塊Oracle型別
- 修復資料庫壞塊之一資料庫
- 壞塊標記並skip
- 資料庫壞塊解決案例一則資料庫
- [20150811]模擬壞塊處理.txt
- ORA-01578 壞塊原因模擬及解決方法
- ORA-01578(資料塊損壞)跳過壞塊
- 資料塊損壞ORA-1578(發現損壞塊)
- 資料庫壞塊處理資料庫
- 普通資料和圖片不能在一塊上傳
- Laravel 高併發搶購模擬Laravel
- 一次ORACLE資料庫undo壞塊處理Oracle資料庫
- 修復損壞的資料塊
- Oracle資料庫壞塊修復Oracle資料庫
- 爬蟲之普通的模擬登陸爬蟲
- ORACLE資料庫壞塊的處理 (一次壞快處理過程)Oracle資料庫
- Oracle資料庫壞塊典型案例分析Oracle資料庫
- 跳過Oracle資料庫壞塊方法Oracle資料庫
- ORACLE中修復資料塊損壞Oracle
- 檢查資料塊損壞(Block Corruption)BloC
- 修復資料庫壞塊之五資料庫
- 修復資料庫壞塊之四資料庫
- 修復資料庫壞塊之三資料庫
- 修復資料庫壞塊之二資料庫
- Curl模擬提交資料
- 前端資料模擬方案前端
- Oralce建立模擬資料
- 【EM】鎖等待故障模擬及排查