成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Oracle 數據壞塊的 N 種修復方式

數據庫 Oracle
今天就給大家講講怎么處理數據表的壞塊情況!對于 Oracle 數據塊物理損壞 的情形,通常可以分為兩種情況:有備份,通過 RMAN 恢復,無備份,通過 DBMS_REPAIR 修復.

[[438673]]

前言

Oracle 數據庫的運行不可避免的會遇到各種各樣的錯誤,就比如數據表出現壞塊,此時,你這張表的數據就無法訪問了,有什么好的辦法可以恢復呢?

什么,你沒有遇到過?😱

😏 那就祝你不久的將來遇到,哈哈開個玩笑~ 玩歸玩,鬧歸鬧,經驗必須要老到!👍🏻

一、介紹

今天就給大家講講怎么處理數據表的壞塊情況!🎉

對于 Oracle 數據塊物理損壞 的情形,通常可以分為兩種情況:

有備份,通過 RMAN 恢復

無備份,通過 DBMS_REPAIR 修復

1、RMAN

有備份的情況下,這是很理想的情形,我們可以直接通過 RMAN 塊介質恢復(BLOCK MEDIA RECOVERY)功能來完成受損塊的恢復。

這里我是不建議恢復整個數據庫或者數據庫文件來修復這些少量受損的數據塊,有點浪費時間。

可參考官方文檔:Block Media Recovery with RMAN

2、DBMS_REPAIR

那如果沒有任何備份怎么辦? (PS:備份大于一切!)

我們可以使用 Oracle 自帶的 DBMS_REPAIR 包來實現修復。

📢 注意: 使用 DBMS_REPAIR 包來修復,并非完全恢復,而是標記壞塊,然后不對其進行訪問,這部分被標記的數據也就丟失了,這是無法避免的。

可參考MOS文檔:DBMS_REPAIR SCRIPT (Doc ID 556733.1)

二、實戰環境準備

1、環境安裝可參考我的一鍵安裝腳本:Oracle 數據庫一鍵安裝,從未如此簡單

  1. cd /Volumes/DBA/voracle/github/single_db 
  2. vagrant up 
  3. vagrant ssh 

2、測試數據準備

創建表空間:

  1. create tablespace eason datafile '/oradata/orcl/eason.dbf' size 1g autoextend on

創建用戶:

  1. create user eason identified by eason default tablespace eason; 
  2. grant dba to eason; 

創建測試表:

  1. create table hyj as select * from dba_objects; 

創建表索引:

  1. create index i_hyj on hyj(object_id); 

3、查看表相關信息

查看表段上的相關信息:

  1. select segment_name , header_file , header_block,blocks from dba_segments where segment_name ='HYJ';  

查出包含行記錄的數據塊:

  1. select distinct dbms_rowid.rowid_block_number(rowid) from eason.hyj order by 1; 
  2.  
  3. DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) 
  4. ------------------------------------ 
  5.                                 1411 
  6.                                 1412 
  7.                                 1413 
  8.         ... 
  9.         ... 
  10.         ...  
  11.                                 2665 
  12.                                 2666 
  13.                                 2667 
  14.  
  15. 1232 rows selected. 

  1. select * from dba_extents where segment_name='HYJ'

📢 注意: 這里看到 HEADER_BLOCK 和 BLOCK_ID 不一致,其實一個 segment 的第一個區的第一個塊是 FIRST LEVEL BITMAP BLOCK,第二個塊是 SECOND LEVEL BITMAP BLOCK,這兩個塊是用來管理 free block 的,第三個塊是 PAGETABLE SEGMENT HEADER,這個塊才是 segment 里的 HEADER_BLOCK。

4、RMAN 備份

首先,我們先做一個全備份,用來演示 RMAN 修復壞塊!

  1. run { 
  2. allocate channel c1 device type disk; 
  3. allocate channel c2 device type disk; 
  4. crosscheck backup; 
  5. crosscheck archivelog all
  6. sql"alter system switch logfile"
  7. delete noprompt expired backup; 
  8. delete noprompt obsolete device type disk; 
  9. backup database include current controlfile format '/backup/backlv_%d_%T_%t_%s_%p'
  10. backup archivelog all DELETE INPUT; 
  11. release channel c1; 
  12. release channel c2; 

5、模擬壞塊

破壞 1468、1688、2468 數據塊的內容:

  1. dd if=/dev/zero of=/oradata/orcl/eason.dbf bs=8192 conv=notrunc seek=1468 count=1 
  2. dd if=/dev/zero of=/oradata/orcl/eason.dbf bs=8192 conv=notrunc seek=1688 count=1 
  3. dd if=/dev/zero of=/oradata/orcl/eason.dbf bs=8192 conv=notrunc seek=2468 count=1 

清除 buffer cache 的內容:

  1. alter system flush buffer_cache; 

再次查詢表 hyj,此時查詢已經報錯,發現有壞塊:

  1. select * from eason.hyj; 

 

當然,也可以使用 bbed 進行壞塊模擬!

6、壞塊檢查

下面再介紹幾種發現壞塊的方式:

(1)使用 DBV 檢查當前文件的壞塊:

  1. dbv file=/oradata/orcl/eason.dbf blocksize=8192; 

使用 DBV檢查,同樣發現了壞塊!

(2)使用 rman 檢查數據庫壞塊:

  1. ## 檢查對應的數據文件 
  2. backup check logical validate datafile 5; 
  3. ## 檢查當前數據庫 
  4. backup validate check logical database

結合 V$DATABASE_BLOCK_CORRUPTION 視圖查看,更加方便:

  1. select * from V$DATABASE_BLOCK_CORRUPTION; 

使用 RMAN 檢查后,同樣發現了壞塊!

(3)通過數據庫的告警日志也可以發現報錯:

(4)通過報錯信息快速查找對應的壞表,依次填寫數據文件 ID 5 和 壞塊 ID 1468:

  1. SELECT tablespace_name, segment_type, owner, segment_name 
  2. FROM dba_extents 
  3.         WHERE file_id = &fileid 
  4. and &blockid between block_id AND block_id + blocks - 1; 

實驗環境準備完畢,下面開始實戰!

三、實戰演示

今天,我打算使用上述介紹的 2 種方式來演示!

1、RMAN 修復

由于我們之前已經備份了,因此直接使用備份來恢復壞塊:

  1. blockrecover datafile 5 block 1468; 

  1. blockrecover datafile 5 block 1688,2468; 

使用同樣的方式,依次修復壞塊 1688,2468,修復成功后,查詢已恢復正常!

再次檢查壞塊情況:

  1. backup validate check logical database
  2. select * from V$DATABASE_BLOCK_CORRUPTION; 

壞塊已經都被恢復,并且數據沒有丟失!

2、DBMS_REPAIR 修復

首先,依然使用 dd 先模擬壞塊:

  1. dd if=/dev/zero of=/oradata/orcl/eason.dbf bs=8192 conv=notrunc seek=3333 count=1 
  2. dd if=/dev/zero of=/oradata/orcl/eason.dbf bs=8192 conv=notrunc seek=3368 count=1 
  3. dd if=/dev/zero of=/oradata/orcl/eason.dbf bs=8192 conv=notrunc seek=4000 count=1 

 

在沒有備份的前提下,我們就無法做到無損修復壞塊了,需要損失對應壞塊的數據。

(1)創建 repair 表,用于記錄需要被修復的表:

  1. begin 
  2. dbms_repair.admin_tables ( 
  3.      table_name => 'REPAIR_TABLE'
  4.      table_type => dbms_repair.repair_table, 
  5.      action => dbms_repair.create_action, 
  6.      tablespace => 'USERS'); 
  7. end

(2)創建 Orphan Key 表,用于記錄在表塊損壞后那些孤立索引,也就是指向壞塊的那些索引 :

  1. begin 
  2. dbms_repair.admin_tables ( 
  3.      table_name => 'ORPHAN_KEY_TABLE'
  4.      table_type => dbms_repair.orphan_table, 
  5.      action => dbms_repair.create_action, 
  6.      tablespace => 'USERS'); 
  7. end

(3)檢查壞塊,檢測對象上受損的情形,并返回受損塊數為 3:

  1. declare 
  2.   num_corrupt int
  3. begin 
  4.   num_corrupt := 0; 
  5. DBMS_REPAIR.CHECK_OBJECT ( 
  6.   schema_name =>'EASON'
  7.   object_name =>'HYJ'
  8.   repair_table_name =>'REPAIR_TABLE'
  9.   corrupt_count =>num_corrupt); 
  10.   dbms_output.put_line('number corrupt:' || to_char(num_corrupt)); 
  11. end

(4)查看受損的塊信息:

  1. select object_name, block_id, corrupt_type, marked_corrupt, repair_description from repair_table; 

📢 注意: 這里 marked_corrupt 被標記為 TRUE,應該是系統在執行 CHECK_OBJECT 過程中自動完成了FIX_CORRUPT_BLOCKS。如果被標記為 FALSE,需要再運行 FIX_CORRUPT_BLOCKS 來完成壞塊的標記工作。

(5)修復被損壞的數據塊,這些被損壞的數據塊是在執行了 check_object 之后生成的:

  1. declare 
  2.   cc number; 
  3. begin 
  4.   dbms_repair.fix_corrupt_blocks(schema_name => 'EASON'
  5.   object_name => 'HYJ'
  6.   fix_count => cc); 
  7.   dbms_output.put_line('Number of blocks fixed: ' || to_char(cc)); 
  8. end

標記了 0 個壞塊,說明 CHECK_OBJECT 完成了標記工作。

(6)使用 DUMP_ORPHAN_KEYS 過程將那些指向壞塊的索引鍵值填充到 ORPHAN_KEY_TABLE:

  1. declare 
  2.    cc number; 
  3. begin 
  4.   dbms_repair.dump_orphan_keys 
  5.   ( 
  6.      schema_name => 'EASON'
  7.      object_name => 'I_HYJ',  
  8.      object_type => dbms_repair.index_object, 
  9.      repair_table_name => 'REPAIR_TABLE'
  10.      orphan_table_name=> 'ORPHAN_KEY_TABLE'
  11.      key_count => cc 
  12.   ); 
  13.   dbms_output.put_line('Number of orphan keys: ' || to_char(cc)); 
  14. end

表明 202 條記錄被損壞丟失!

📢 注意: 此處一定要注意 object_name 是索引名,而不是 table_name,這里 dump 的是損壞的索引信息.如果表有多個索引,需要為每個索引執行 DUMP_ORPHAN_KEYS 操作。

(7)驗證對象是否可以查詢,下面的結果顯示依舊無法查詢:

  1. select count(*) from eason.hyj; 

(8)跳過壞塊:

  1. BEGIN 
  2.   DBMS_REPAIR.SKIP_CORRUPT_BLOCKS ( 
  3.      SCHEMA_NAME => 'EASON'
  4.      OBJECT_NAME => 'HYJ'
  5.      OBJECT_TYPE => dbms_repair.table_object, 
  6.      FLAGS => dbms_repair.skip_flag); 
  7. END

📢 注意: 丟失 202 條記錄,丟失記錄的 rowid 可以在 ORPHAN_KEY_TABLE 表中找到。

(9)重建索引:

  1. alter index eason.I_HYJ rebuild; 

(10)驗證結果

至此,表中數據可以順利被訪問!

由于壞塊并沒有消失,而是被標記跳過,因此還是可以查看壞塊:

  1. select * from V$DATABASE_BLOCK_CORRUPTION; 

用這種方法可以找回部分數據,也可以找回建了索引的值,但是使用dbv再檢查表空間的數據文件時,仍然會顯示有損壞的數據塊。

這時需要把表的數據全部導出,再重建表或者表空間,然后再把找回的數據導入數據庫,推薦用 expdp/impdp 命令做,可以徹底消除 dbv 檢查到的壞塊。

寫在最后

備份大于一切,也是最后的防線,所以請大家一定要做好備份!886

責任編輯:姜華 來源: Lucifer三思而后行
相關推薦

2010-10-13 11:19:11

MySQL數據文件

2010-06-13 17:35:17

MySQL數據表

2009-03-17 13:59:26

ORA-01578壞塊Oracle

2022-03-18 09:42:54

JavaString

2023-03-06 09:20:33

CSS顏色混合

2010-04-07 18:26:43

Oracle數據庫

2011-03-14 13:33:32

Oracle數據庫啟動

2011-02-28 13:31:17

Oracle數據庫

2011-04-12 15:44:08

Oracle數據庫

2025-04-27 08:05:00

Linux時間同步

2023-06-16 15:17:21

sprint工具

2010-04-06 10:52:06

Oracle數據庫

2010-04-15 15:52:12

Oracle數據庫

2010-04-19 16:08:31

Oracle數據庫

2010-10-26 14:06:43

oracle連接遠程數

2010-06-17 09:39:07

Ubuntu Grub

2011-01-24 13:36:11

網絡故障修復

2010-06-13 12:59:15

Ubuntu xp G

2010-06-12 11:26:21

Grub Rescue

2020-09-02 13:22:28

IP訪問Oracle數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91色综合| 日韩一区在线观看视频 | 久久麻豆精品 | 国产最好的av国产大片 | 999久久久久久久久6666 | 日韩欧美第一页 | 成人午夜免费网站 | 成人一级黄色毛片 | 自拍偷拍亚洲视频 | 日韩精品一区二区三区视频播放 | 91视频电影 | 久久久久九九九女人毛片 | 午夜视频在线观看网站 | 久久国产高清 | 亚洲久久 | 成人在线国产 | av在线成人 | 亚洲综合成人网 | 美人の美乳で授乳プレイ | 九一在线 | 成人亚洲在线 | 美女久久久久久久 | 欧美日韩久久久久 | 天天天久久久 | 中文字幕日韩欧美一区二区三区 | 天天想天天干 | 91精品国产一区二区三区 | 黄网免费看 | 国产在线精品一区二区三区 | 欧美乱大交xxxxx另类电影 | 国产精品一区二区三区在线播放 | 国产剧情一区 | 久久久做| 国产在线一区观看 | 国产精品永久免费视频 | 国产精品毛片久久久久久久 | 国产精品高清一区二区 | 国产精品 欧美精品 | 国产成人小视频 | 久久久久久国产精品免费免费狐狸 | 国产羞羞视频在线观看 |