19 detekce a Oprava poškození datového bloku

Oracle poskytuje různé metody pro detekci a opravu poškození datového bloku. Jednou z metod je zrušit a znovu vytvořit objekt po zjištění poškození; to však není vždy možné nebo žádoucí. Pokud je poškození datového bloku omezeno na podmnožinu řádků, další možností je znovu sestavit tabulku výběrem všech dat kromě poškozených řádků.

dalším způsobem, jak spravovat poškození datového bloku, je použití balíčku DBMS_REPAIR. DBMS_REPAIR můžete použít k detekci a opravě poškozených bloků v tabulkách a indexech. Pomocí tohoto přístupu můžete řešit poškození, pokud je to možné, a také pokračovat v používání objektů při pokusu o jejich obnovu nebo opravu. DBMS_REPAIR používá následující přístup k řešení korupce:

  • Krok 1: Odhalte a nahlaste poškození
  • Krok 2: vyhodnoťte náklady a přínosy používání DBMS_REPAIR
  • Krok 3: Vytvořte objekty použitelné
  • Krok 4: opravte poškození a obnovte ztracená Data
    Poznámka:

    jakákoli korupce, která zahrnuje ztrátu dat, vyžaduje analýzu a pochopení toho, jak tato data zapadají do celkového databázového systému. Proto DBMS_REPAIR není kouzelná hůlka-stále musíte určit, zda je přístup k opravě poskytovaný tímto balíčkem vhodným nástrojem pro každý konkrétní problém s korupcí. V závislosti na povaze opravy můžete ztratit data a mohou být zavedeny logické nekonzistence; proto je třeba zvážit zisky a ztráty spojené s používáním DBMS_REPAIR.

obsah balení DBMS_REPAIR

tabulka 19-1 popisuje postupy, které tvoří balíček DBMS_REPAIR.

tabulka 19-1 postupy DBMS_REPAIR
název procedury popis

check_object

detekuje a hlásí poškození v tabulce nebo indexu.

fix_corrupt_blocks

označuje bloky (které byly dříve identifikovány procedurou check_object) jako poškozené.

dump_orphan_keys

zprávy položky indexu, které ukazují na řádky v poškozených datových bloků.

rebuild_freelists

přestaví objekt na volné noze.

skip_corrupt_blocks

při použití, ignoruje bloky označené poškozený během tabulky a index skenování. Pokud se nepoužívá, dostanete chybu ORA-1578 při setkání s bloky označenými jako poškozené.

admin_tables

poskytuje administrativní funkce (create, drop, purge) pro DBMS_REPAIR opravy a orphan klíčových tabulek. Poznámka: Tyto tabulky jsou vždy vytvořeny ve schématu SYS.

Krok 1: detekce a hlášení korupce

vaším prvním úkolem před použitím DBMS_REPAIR by měla být detekce a hlášení korupce. Hlášení nejen ukazuje, co je s blokem špatně, ale také identifikuje související směrnici o opravách. Kromě DBMS_REPAIR máte několik možností pro detekci poškození. Tabulka 19-2 popisuje různé metodiky detekce.

tabulka 19-2 porovnání metod detekce korupce
detekční metoda popis

DBMS_REPAIR

provádí kontrolu bloku pro zadanou tabulku, oddíl nebo index.

vyplní tabulku oprav s výsledky.

DB_ verify

externí nástroj příkazového řádku, který provádí kontrolu bloků v offline databázi.

analyzovat

Používá se s volbou VALIDATE STRUCTURE, ověřuje integritu struktury indexu, tabulky nebo clusteru; kontroluje nebo ověřuje, zda jsou vaše tabulky a indexy synchronizovány.

DB_BLOCK_CHECKING

identifikuje poškozené bloky dříve, než jsou skutečně označeny jako poškozené. Kontroly se provádějí, když jsou provedeny změny v bloku.

DBMS_REPAIR: pomocí procedur check_object a admin_tables

procedura check_object kontroly a hlášení blokují poškození zadaného objektu. Podobně jako analýza…VALIDATE STRUCTURE statement pro indexy a tabulky, bloková kontrola se provádí pro indexové a datové bloky.

nejen, že check_object hlásí poškození, ale také identifikuje všechny opravy, ke kterým by došlo, kdyby byl fix_corrupt_blocks následně spuštěn na objektu. Tyto informace jsou zpřístupněny vyplněním tabulky oprav, která musí být nejprve vytvořena postupem admin_tables.

po spuštění procedury check_object zobrazí jednoduchý dotaz v tabulce oprav direktivy pro poškození a opravu objektu. Pomocí těchto informací můžete posoudit, jak nejlépe řešit hlášené problémy.

DB_VERIFY: provádění Offline kontroly databáze

typicky používáte DB_VERIFY jako offline diagnostický nástroj, když narazíte na problémy s poškozením dat.

Viz Také: Pro více informací o DB_VERIFY, viz Oracle8i Utilities.

analyzovat: hlášení korupce

tabulka analýzy…VALIDATE STRUCTURE statement ověřuje strukturu analyzovaného objektu. Pokud Oracle úspěšně ověří strukturu, vrátí se vám zpráva potvrzující její ověření. Pokud Oracle narazí na poškození ve struktuře objektu, vrátí se vám chybová zpráva. V takovém případě byste objekt upustili a znovu vytvořili.

Viz také: další informace o příkazu ANALYZE naleznete v odkazu Oracle8i SQL.

DB_BLOCK_CHECKING (parametr inicializace kontroly bloků)

můžete nastavit kontrolu bloků pro instance pomocí parametru DB_BLOCK_CHECKING (výchozí hodnota je TRUE); to kontroluje data a indexové bloky, kdykoli jsou upraveny. DB_BLOCK_CHECKING je dynamický parametr, modifikovatelný příkazem ALTER SYSTEM SET.

Krok 2: vyhodnoťte náklady a přínosy používání DBMS_REPAIR

před použitím DBMS_REPAIR musíte zvážit výhody jeho použití ve vztahu k závazkům; měli byste také prozkoumat další možnosti, které jsou k dispozici pro řešení poškozených objektů.

prvním krokem je zodpovězení následujících otázek:

  1. jaký je rozsah korupce?

    Chcete-li zjistit, zda dochází k poškození a opravám, proveďte proceduru check_object a dotazujte se na tabulku oprav.

  2. jaké další možnosti jsou k dispozici pro řešení poškození bloků?

    za předpokladu, že data jsou k dispozici z jiného zdroje, přetáhněte, znovu vytvořte a znovu naplňte objekt. Další možností je vydat vytvořit tabulku…Jako vyberte příkaz z poškozené tabulky a vytvořte nový.

    korupci můžete ignorovat vyloučením poškozených řádků z vybraných příkazů.

    proveďte obnovu médií.

  3. jaké logické poškození nebo vedlejší účinky budou zavedeny, když použijete DBMS_REPAIR, aby byl objekt použitelný? Lze je řešit? Jaké úsilí je k tomu zapotřebí?

    možná nebudete mít přístup k řádkům v blocích označených jako poškozené. Blok však může být označen jako poškozený, i když stále existují řádky, ke kterým můžete platně přistupovat.

    omezení referenční integrity mohou být přerušena, pokud jsou bloky označeny jako poškozené. Pokud k tomu dojde, omezení deaktivujte a znovu povolte; budou hlášeny jakékoli nesrovnalosti. Po vyřešení všech problémů byste měli být schopni úspěšně znovu povolit omezení.

    logické poškození může nastat, pokud jsou v tabulce definovány spouštěče. Pokud jsou například řádky znovu vloženy, měly by být vložené spouštěče vypáleny nebo ne? Tyto problémy můžete řešit pouze tehdy, pokud rozumíte spouštěčům a jejich použití v instalaci.

    Freelist bloky mohou být nepřístupné. Pokud je poškozený blok v čele nebo ocasu freelisty, Správa prostoru znovu inicializuje freelistu. Tam pak mohou být bloky, které by měly být na freelist, které nejsou. můžete to řešit spuštěním procedury rebuild_freelists.

    indexy a tabulky mohou být mimo synchronizaci. Můžete to řešit tak, že nejprve provedete proceduru dump_orphan_keys (Chcete-li získat informace z klíčů, které by mohly být užitečné při obnově poškozených dat). Poté vydejte příkaz ALTER INDEX REBUILD online, abyste získali tabulku a její indexy zpět do synchronizace.

  4. pokud oprava zahrnuje ztrátu dat, lze tato data načíst?

    můžete načíst data z indexu, když je datový blok označen jako poškozený. Postupy dump_orphan_keys vám mohou pomoci získat tyto informace. Načítání dat tímto způsobem samozřejmě závisí na množství redundance mezi indexy a tabulkou.

Krok 3: Make objekty použitelné

v tomto kroku DBMS_REPAIR dělá objekt použitelný ignorováním poškození během skenování tabulky a indexu.

Oprava Korupce: Pomocí postupů fix_corrupt_blocks a skip_corrupt_blocks

vytvoříte poškozený objekt použitelný vytvořením prostředí, které přeskočí poškození, která zůstávají mimo rozsah opravárenských schopností DBMS_REPAIR.

pokud poškození zahrnuje ztrátu dat, například špatný řádek v datovém bloku, jsou všechny tyto bloky označeny jako poškozené procedurou fix_corrupt_blocks. Poté můžete spustit proceduru skip_corrupt_blocks, která přeskočí bloky označené jako poškozené pro objekt. Když je nastaven skip, skenování tabulek a indexů přeskočí všechny bloky označené jako poškozené. To platí pro poškozené bloky médií i softwaru.

důsledky při přeskakování poškozených bloků

pokud index a tabulka nejsou synchronizovány, pak transakce SET Read ONLY transakce může být nekonzistentní v situacích, kdy jeden dotaz sonduje pouze index a následný dotaz sonduje index i tabulku. Pokud je blok tabulky označen jako poškozený, pak dva dotazy vrátí různé výsledky, čímž poruší pravidla transakce pouze pro čtení. Jedním ze způsobů, jak k tomu přistupovat, je nevynechat korupci, když je v nastavené transakci pouze pro čtení.

podobný problém nastává při výběru řádků, které jsou zřetězeny. V podstatě dotaz stejného řádku může nebo nemusí přistupovat k poškození-čímž dává různé výsledky.

Krok 4: opravte poškození a obnovte ztracená Data

po použití objektu můžete provést následující opravy.

Obnovte Data pomocí procedur dump_orphan_keys

procedura dump_orphan_keys hlásí položky indexu, které ukazují na řádky v poškozených datových blocích. Všechny tyto položky indexu jsou vloženy do tabulky osiřelých klíčů, která ukládá klíč a rowid korupce.

po načtení informací o zadání indexu můžete znovu vytvořit index pomocí online příkazu ALTER index REBUILD.

opravy Freelistů pomocí procedury rebuild_freelists

když je v čele nebo ocasu freelist nalezen blok označený „corrupt“, freelist je znovu inicializován a je vrácena chyba. Ačkoli to odstraní urážlivý blok z freelistu, způsobí to, že ztratíte přístup freelistů ke všem blokům, které následovaly po poškozeném bloku.

postup rebuild_freelists můžete použít k opětovnému inicializaci freelistů. Objekt je naskenován a pokud je vhodné, aby byl blok na freelistu, přidá se k master freelist. Freelist skupiny jsou zpracovány meting z bloků spravedlivým způsobem-blok v době. Všechny bloky označené „poškozený“ v objektu jsou ignorovány během přestavby.

omezení a omezení

postupy DBMS_REPAIR mají následující omezení:

  • tabulky s loby, vnořené tabulky, a VARRAYS jsou podporovány, ale out of line sloupce jsou ignorovány.
  • clustery jsou podporovány v procedurách skip_corrupt_blocks a rebuild_freelist, ale ne v proceduře check_object.
  • Index-organizované tabulky a Lob indexy nejsou podporovány.
  • procedura dump_orphan_keys nefunguje na bitmapových indexech nebo indexech založených na funkcích.
  • procedura dump_orphan_keys zpracovává klíče, které jsou maximálně 3 950 bajtů dlouhé.

postupy DBMS_REPAIR

tato část obsahuje podrobný popis postupů DBMS_REPAIR.

check_object

procedura check_object zkontroluje zadané objekty a vyplní tabulku oprav informacemi o korupci a směrnicích pro opravy. Validace spočívá v blokové kontrole všech bloků v objektu. Pokud chcete zkontrolovat část objektu, můžete volitelně zadat rozsah, název oddílu nebo název subpartition.

procedure check_object(schema_name IN varchar2, object_name IN varchar2, partition_name IN varchar2 DEFAULT NULL, object_type IN binary_integer DEFAULT TABLE_OBJECT, repair_table_name IN varchar2 DEFAULT 'REPAIR_TABLE', flags IN binary_integer DEFAULT NULL, relative_fno IN binary_integer DEFAULT NULL, block_start IN binary_integer DEFAULT NULL, block_end IN binary_integer DEFAULT NULL, corrupt_count OUT binary_integer)

tabulka 19-3 postup check_object
Argument popis

schema_name

název schématu objektu, který má být zkontrolován.

object_name

název tabulky nebo indexu, který má být zkontrolován.

partition_name (optional)

oddíl nebo název subpartition, které mají být kontrolovány. Pokud se jedná o objekt s oddíly a partition_name není zadán, zkontrolují se všechny oddíly a podčásti. Pokud se jedná o objekt s oddíly a zadaný oddíl obsahuje subpartitions, pak jsou zaškrtnuty všechny subpartitions.

object_type (optional)

typ objektu, který má být zpracován. Musí být buď TABLE_OBJECT nebo INDEX_OBJECT. Výchozí hodnota je TABLE_OBJECT.

repair_table_name (optional)

název tabulky oprav, která má být vyplněna. Tabulka musí existovat ve schématu SYS. Pomocí postupu admin_tables vytvořte tabulku oprav. Výchozí název je ‚REPAIR_TABLE‘.

flags (optional)

vyhrazeno pro budoucí použití.

relative_fno (optional)

relativní číslo souboru. Používá se při určování rozsahu bloků.

block_start (optional)

první blok, který se má zpracovat, pokud specifikuje rozsah bloků. Může být zadán pouze v případě, že objekt je jedna tabulka, oddíl, nebo subpartition.

block_end (optional)

poslední blok, který se má zpracovat, pokud specifikuje rozsah bloků. Může být zadán pouze v případě, že objekt je jedna tabulka, oddíl, nebo subpartition.

pokud je zadán pouze jeden z block_start nebo block_end, pak ostatní výchozí pro první nebo poslední blok v souboru.

corrupt_count

počet hlášených korupcí.

fix_corrupt_blocks

použijte tento postup k opravě poškozených bloků v určených objektech na základě informací v tabulce oprav, která byla dříve vygenerována procedurou check_object. Před provedením jakékoli změny bloku je blok zkontrolován, aby se zajistilo, že blok je stále poškozen. Poškozené bloky jsou opraveny označením blokového softwaru poškozeného. Po provedení opravy je přidružený řádek v tabulce oprav aktualizován časovým razítkem opravy.

procedure fix_corrupt_blocks( schema_name IN varchar2, object_name IN varchar2, partition_name IN varchar2 DEFAULT NULL, object_type IN binary_integer DEFAULT TABLE_OBJECT, repair_table_name IN varchar2 DEFAULT 'REPAIR_TABLE', flags IN boolean DEFAULT NULL, fix_count OUT binary_integer)

tabulka 19-4 postup fix_corrupt_blocks
Argument popis

schema_name

název schématu.

object_name

název objektu s poškozenými bloky, které mají být opraveny.

partition_name (optional)

název oddílu nebo podčásti, který má být zpracován. Pokud se jedná o objekt s oddíly a partition_name není zadán, zpracují se všechny oddíly a podčásti. Pokud se jedná o objekt s oddíly a zadaný oddíl obsahuje subpartitions, jsou zpracovány všechny subpartitions.

object_type (optional)

typ objektu, který má být zpracován. Musí být buď TABLE_OBJECT nebo INDEX_OBJECT. Výchozí hodnota je TABLE_OBJECT.

repair_table_name (optional)

název tabulky oprav se směrnicemi pro opravy. Musí existovat ve schématu SYS.

flags (optional)

vyhrazeno pro budoucí použití.

fix_count

počet bloků pevné.

Dump_orphan_keys

zprávy o položkách indexu, které ukazují na řádky v poškozených datových blocích. Pro každou takovou položku indexu, se kterou se setkáme, je do zadané tabulky osiřelých vložen řádek.

je-li zadána tabulka oprav, pak všechny poškozené bloky spojené se základní tabulkou jsou zpracovány kromě všech datových bloků, které jsou označeny software corrupt. V opačném případě jsou zpracovány pouze bloky, které jsou označeny jako poškozené.

tyto informace mohou být užitečné pro obnovení ztracených řádků v tabulce a pro diagnostické účely.

procedure dump_orphan_keys( schema_name IN varchar2, object_name IN varchar2, partition_name IN varchar2 DEFAULT NULL, object_type IN binary_integer DEFAULT INDEX_OBJECT, repair_table_name IN varchar2 DEFAULT 'REPAIR_TABLE', orphan_table_name IN varchar2 DEFAULT 'ORPHAN_KEY_TABLE', key_count OUT binary_integer)

tabulka 19-5 postup dump_orphan_keys
Argument popis

schema_name

název schématu.

object_name

název objektu.

partition_name (optional)

název oddílu nebo podčásti, který má být zpracován. Pokud se jedná o objekt s oddíly a partition_name není zadán, zpracují se všechny oddíly a podčásti. Pokud se jedná o objekt s oddíly a zadaný oddíl obsahuje subpartitions, jsou zpracovány všechny subpartitions.

object_type (optional)

typ objektu, který má být zpracován. Výchozí hodnota je INDEX_OBJECT.

repair_table_name (optional)

název tabulky oprav, která obsahuje informace o poškozených blocích v základní tabulce. Zadaná tabulka musí existovat ve schématu SYS. K vytvoření tabulky se používá postup admin_tables.

orphan_table_name (optional)

název tabulky osiřelých klíčů, která se má naplnit informacemi o každé položce indexu, která odkazuje na řádek v poškozeném datovém bloku. Zadaná tabulka musí existovat ve schématu SYS. K vytvoření tabulky se používá postup admin_tables.

key_count

počet zpracovaných položek indexu.

rebuild_freelists

přestaví freelists pro zadaný objekt. Všechny volné bloky jsou umístěny na master freelist. Všichni ostatní nezávislí jsou vynulováni. Pokud má objekt více freelistických skupin,pak jsou volné bloky rozděleny mezi všechny freelisty a přidělují se různým skupinám kulatým způsobem.

procedure rebuild_freelists( schema_name IN varchar2, object_name IN varchar2, partition_name IN varchar2 DEFAULT NULL, object_type IN binary_integer DEFAULT TABLE_OBJECT);

tabulka 19-6 postup rebuild_freelists
Argument popis

schema_name

název schématu.

object_name

název objektu, jehož nezávislí mají být přestavěni.

partition_name (optional)

oddíl nebo název podčásti, jehož nezávislí mají být přestavěni. Pokud se jedná o objekt s oddíly a partition_name není zadán, zpracují se všechny oddíly a podčásti. Pokud se jedná o objekt s oddíly a zadaný oddíl obsahuje subpartitions, jsou zpracovány všechny subpartitions.

object_type (optional)

typ objektu, který má být zpracován. Musí být buď TABLE_OBJECT nebo INDEX_OBJECT. Výchozí hodnota je TABLE_OBJECT.

skip_corrupt_blocks

povolí nebo zakáže přeskakování poškozených bloků během skenování indexu a tabulky zadaného objektu. Pokud je objekt tabulkou, skip se vztahuje na tabulku a její indexy. Pokud je objekt clusterem, vztahuje se na všechny tabulky v clusteru a jejich příslušné indexy.

procedure skip_corrupt_blocks( schema_name IN varchar2, object_name IN varchar2, partition_name IN varchar2 DEFAULT NULL, object_type IN binary_integer DEFAULT TABLE_OBJECT, flags IN boolean DEFAULT SKIP_FLAG);

tabulka 19-7 postup skip_corrupt_blocks
Argument popis

schema_name

název schématu objektu, který má být zpracován.

object_name

název objektu.

partition_name (optional)

název oddílu nebo podčásti, který má být zpracován. Pokud se jedná o objekt s oddíly a partition_name není zadán, zpracují se všechny oddíly a podčásti. Pokud se jedná o objekt s oddíly a zadaný oddíl obsahuje subpartitions, jsou zpracovány všechny subpartitions.

object_type (optional)

typ objektu, který má být zpracován. Musí být buď TABLE_OBJECT nebo CLUSTER_OBJECT. Výchozí hodnota je TABLE_OBJECT.

flags (optional)

je-li uvedeno SKIP_FLAG, zapne přeskočení softwaru poškozených bloků pro objekt během index a tabulky skenů. Pokud je zadán NOSKIP_FLAG, skenování, které narazí na poškozené bloky softwaru, vrátí ora-1578.

admin_tables

poskytuje administrativní funkce pro opravy a orphan klíčových tabulek.

procedure admin_tables( table_name IN varchar2, table_type IN binary_integer, action IN binary_integer, tablespace IN varchar2 DEFAULT NULL); 

tabulka 19-8 procedura admin_tables
Argument popis

table_name

název tabulky, která má být zpracována. Výchozí ‚ORPHAN_KEY_TABLE‘ nebo ‚REPAIR_TABLE‘ na základě zadaného table_type. Pokud je zadán, musí mít název tabulky příslušnou předponu ‚ORPHAN_‘ nebo ‚REPAIR_‘.

table_type

typ tabulky, musí být jeden z ORPHAN_TABLE nebo REPAIR_TABLE.

action

označuje, jaké správní kroky je třeba provést. Musí být CREATE_ACTION, PURGE_ACTION nebo DROP_ACTION. Pokud tabulka již existuje a je zadána CREATE_ACTION, vrátí se chyba. PURGE_ACTION označuje odstranění všech řádků v tabulce, které jsou spojeny s neexistujícími objekty. Pokud tabulka neexistuje a je zadána DROP_ACTION, vrátí se chyba.

jsou-li zadány CREATE_ACTION a DROP_ACTION, vytvoří se přidružený pohled s názvem DBA_<table_name>. Pohled je definován tak, aby byly odstraněny řádky spojené s neexistujícími objekty.

vytvořeno ve schématu SYS.

tablespace (optional)

označuje plochu stolu, kterou chcete použít při vytváření tabulky. Ve výchozím nastavení se používá výchozí prostora SYS. Chyba je vrácena, pokud je zadán prostor tabulky a akce není CREATE_ACTION.

výjimky DBMS_REPAIR

942 tabulka oprav neexistuje
1418 zadaný index neexistuje
24120 neplatný parametr
24121 nelze určit CASCADE_FLAG a rozsah bloků
24122 neplatný rozsah bloků
24124 zadán neplatný parametr akce
24126 CASCADE_FLAG zadaný a objekt není tabulka
24127 tabulka je zadána a akce není CREATE_ACTION
24128 oddíl určený pro objekt bez rozdělení
24129 neplatný název tabulky klíčů pro sirotky – musí mít předponu ‚ORPHAN_‘
24129 zadaná tabulka oprav nezačíná předponou ‚REPAIR_‘
24131 tabulka oprav má nesprávné sloupce
24132 název opravné tabulky je příliš dlouhý

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.