19 detectarea și repararea corupției blocurilor de date

Oracle oferă diferite metode pentru detectarea și corectarea corupției blocurilor de date. O metodă este să renunți și să recreezi un obiect după detectarea corupției; cu toate acestea, acest lucru nu este întotdeauna posibil sau de dorit. Dacă corupția blocului de date este limitată la un subset de rânduri, o altă opțiune este să reconstruiți tabelul selectând toate datele, cu excepția rândurilor corupte.

încă un alt mod de a gestiona corupție bloc de date este de a utiliza pachetul dbms_repair. Puteți utiliza DBMS_REPAIR pentru a detecta și repara blocuri corupte în tabele și indexuri. Folosind această abordare, puteți aborda corupțiile acolo unde este posibil și, de asemenea, puteți continua să utilizați obiecte în timp ce încercați să le reconstruiți sau să le reparați. DBMS_REPAIR utilizează următoarea abordare pentru a aborda corupții:

  • Pasul 1: detectați și raportați Corupțiile
  • Pasul 2: evaluați costurile și beneficiile utilizării DBMS_REPAIR
  • Pasul 3: Faceți obiecte utilizabile
  • Pasul 4: reparați Corupțiile și reconstruiți datele pierdute
    notă:

    orice corupție care implică pierderea datelor necesită analiză și înțelegere a modului în care aceste date se încadrează în sistemul general de baze de date. Prin urmare, DBMS_REPAIR nu este o baghetă magică-trebuie să determinați în continuare dacă abordarea de reparare oferită de acest pachet este instrumentul adecvat pentru fiecare problemă specifică de corupție. În funcție de natura reparației, puteți pierde date și pot fi introduse inconsecvențe logice; prin urmare, trebuie să cântăriți câștigurile și pierderile asociate cu utilizarea DBMS_REPAIR.

conținutul pachetului Dbms_repair

tabelul 19-1 descrie procedurile care alcătuiesc pachetul dbms_repair.

tabelul 19-1 Dbms_proceduri de reparare
denumirea procedurii descriere

check_object

detectează și raportează corupții într-un tabel sau index.

fix_corrupt_blocks

marchează blocurile (care au fost identificate anterior prin procedura check_object) ca fiind corupte.

dump_orphan_keys

rapoarte intrări index care indică rânduri în blocuri de date corupte.

rebuild_freelists

reconstruiește freelists unui obiect.

skip_corrupt_blocks

atunci când este utilizat, ignoră blocuri marcate corupte în timpul scanări de masă și index. Dacă nu este utilizat, veți obține eroare ORA-1578 atunci când se confruntă cu blocuri marcate corupt.

admin_tables

oferă funcții administrative (creare, picătură, purjare) pentru repararea dbms_repair și tabele cheie orfane. Notă: Aceste tabele sunt întotdeauna create în schema SYS.

Pasul 1: detectați și raportați Corupțiile

prima dvs. sarcină, înainte de a utiliza DBMS_REPAIR, ar trebui să fie detectarea și raportarea corupțiilor. Raportarea nu numai că indică ce este în neregulă cu un bloc, dar identifică și Directiva de reparații asociată. Aveți mai multe opțiuni, pe lângă DBMS_REPAIR, pentru detectarea corupțiilor. Tabelul 19-2 descrie diferitele metodologii de detectare.

tabelul 19-2 compararea metodelor de detectare a corupției
metoda de detectare descriere

DBMS_REPAIR

efectuează verificarea bloc pentru un tabel specificat, partiție sau index.

populează un tabel de reparații cu rezultate.

DB_VERIFY

utilitate externă de linie de comandă care efectuează verificarea blocurilor pe o bază de date offline.

analiza

utilizat cu opțiunea validare structură, verifică integritatea structurii unui index, tabel sau cluster; verifică sau verifică dacă tabelele și indexurile sunt sincronizate.

DB_BLOCK_VERIFICARE

identifică blocuri corupte înainte ca acestea de fapt sunt marcate corupt. Verificările sunt efectuate atunci când se fac modificări la un bloc.

DBMS_REPAIR: folosind procedurile check_object și admin_tables

verificările și rapoartele procedurii check_object blochează coruperile pentru un obiect specificat. Similar cu analiza…Validarea declarație structura pentru indexuri și tabele, verificarea bloc se efectuează pentru index și blocuri de date, respectiv.

nu numai că check_object raportează corupții, dar identifică și orice remedieri care ar apărea dacă fix_corrupt_blocks este rulat ulterior pe obiect. Aceste informații sunt puse la dispoziție prin popularea unui tabel de reparații, care trebuie mai întâi creat prin procedura admin_tables.

după ce executați procedura check_object , o interogare simplă din tabelul de reparații arată directivele de corupere și reparare pentru obiect. Cu aceste informații, puteți evalua modul cel mai bun de abordare a problemelor raportate.

DB_VERIFY: efectuarea unei verificări a bazei de date Offline

de obicei, utilizați db_verify ca utilitar de diagnosticare offline atunci când întâmpinați probleme de corupție a datelor.

Vezi Și: Pentru mai multe informații despre Db_verify, consultați Oracle8i Utilities.

analiza: raportarea corupției

tabelul analiza…Valida structura declarație validează structura obiectului analizat. Dacă Oracle validează cu succes structura, vi se returnează un mesaj care confirmă validarea acesteia. Dacă Oracle întâlnește corupție în structura obiectului, vă este returnat un mesaj de eroare. În acest caz, ar scădea și re-crea obiectul.

consultați și: pentru mai multe informații despre instrucțiunea ANALYZE, consultați referința Oracle8i SQL.

DB_BLOCK_CHECKING (parametrul de inițializare a verificării blocurilor)

puteți seta verificarea blocurilor pentru instanțe prin parametrul db_block_checking (valoarea implicită este TRUE); aceasta verifică blocurile de date și index ori de câte ori sunt modificate. DB_BLOCK_CHECKING este un parametru dinamic, modificabil prin instrucțiunea ALTER SYSTEM SET.

Pasul 2: evaluați costurile și beneficiile utilizării DBMS_REPAIR

înainte de a utiliza DBMS_REPAIR, trebuie să cântăriți beneficiile utilizării sale în raport cu pasivele; de asemenea, ar trebui să examinați alte opțiuni disponibile pentru abordarea obiectelor corupte.

un prim pas este de a răspunde la următoarele întrebări:

  1. care este amploarea corupției?

    pentru a determina dacă există corupții și acțiuni de reparare, executați procedura check_object și interogați tabelul de reparații.

  2. ce alte opțiuni sunt disponibile pentru abordarea corupției bloc?

    presupunând că datele sunt disponibile dintr-o altă sursă, picătură, re-crea și re-popula obiectul. O altă opțiune este emiterea tabelului creare…Ca SELECT declarație din tabelul corupt pentru a crea unul nou.

    puteți ignora corupția excluzând rândurile corupte din declarațiile selectate.

    efectuați recuperarea media.

  3. ce corupții logice sau efecte secundare vor fi introduse atunci când utilizați DBMS_REPAIR pentru a face un obiect utilizabil? Acestea pot fi abordate? Care este efortul necesar pentru a face acest lucru?

    este posibil să nu aveți acces la rânduri în blocuri marcate corupte. Cu toate acestea, un bloc poate fi marcat corupt, chiar dacă există încă rânduri pe care le puteți accesa în mod valabil.

    constrângerile de integritate referențială pot fi rupte atunci când blocurile sunt marcate corupte. Dacă se întâmplă acest lucru, dezactivați și reactivați constrângerea; orice inconsecvențe vor fi raportate. După remedierea tuturor problemelor, ar trebui să puteți reactiva cu succes constrângerea.

    corupția logică poate apărea atunci când există declanșatoare definite pe masă. De exemplu, dacă rândurile sunt reintroduse, ar trebui să se declanșeze declanșatoarele de inserare sau nu? Puteți rezolva aceste probleme numai dacă înțelegeți declanșatoarele și utilizarea lor în instalare.

    blocurile Freelist pot fi inaccesibile. Dacă un bloc corupt este în capul sau coada unui freelist, managementul spațiului reinițializează freelistul. Atunci pot exista blocuri care ar trebui să fie pe un freelist, care nu sunt. puteți aborda acest lucru executând procedura rebuild_freelists.

    indexurile și tabelele pot fi sincronizate. Puteți aborda acest lucru executând mai întâi procedura dump_orphan_keys (pentru a obține informații din cheile care ar putea fi utile în reconstruirea datelor corupte). Apoi emite Declarația online alter INDEX REBUILD pentru a sincroniza tabelul și indexurile acestuia.

  4. dacă repararea implică pierderi de date, pot fi recuperate aceste date?

    puteți prelua date din index atunci când un bloc de date este marcat corupt. Procedurile dump_orphan_keys vă pot ajuta să preluați aceste informații. Desigur, recuperarea datelor în acest mod depinde de cantitatea de redundanță dintre indici și tabel.

Pasul 3: face obiecte utilizabile

în acest pas DBMS_REPAIR face obiectul utilizabil ignorând corupții în timpul scanărilor de masă și index.

Repararea Corupției: Folosind procedurile fix_corrupt_blocks și skip_corrupt_blocks

faceți un obiect corupt utilizabil stabilind un mediu care omite corupțiile care rămân în afara domeniului de aplicare al capacităților de reparare DBMS_REPAIR.

dacă corupțiile implică o pierdere de date, cum ar fi un rând rău într-un bloc de date, toate aceste blocuri sunt marcate corupte de procedura fix_corrupt_blocks. Apoi, puteți rula procedura skip_corrupt_blocks, care va sări peste blocurile marcate corupte pentru obiect. Când skip este setat, tabel și index scanează sări peste toate blocurile marcate corupt. Acest lucru se aplică atât blocurilor corupte media, cât și software-ului.

implicații la omiterea blocurilor corupte

dacă un index și un tabel nu sunt sincronizate, atunci o tranzacție setată numai în citire poate fi inconsistentă în situațiile în care o interogare sondează doar indexul și apoi o interogare ulterioară sondează atât indexul, cât și tabelul. Dacă blocul de tabel este marcat corupt, atunci cele două interogări vor returna rezultate diferite, încălcând astfel regulile unei tranzacții numai în citire. O modalitate de a aborda acest lucru este de a nu sări peste corupții atunci când într-o tranzacție set Read Only tranzacție.

o problemă similară apare la selectarea rândurilor care sunt înlănțuite. În esență, o interogare a aceluiași rând poate sau nu să acceseze corupția-dând astfel rezultate diferite.

Pasul 4: reparați Corupțiile și reconstruiți datele pierdute

după ce faceți un obiect utilizabil, puteți efectua următoarele activități de reparare.

recuperați datele utilizând procedurile dump_orphan_keys

procedura dump_orphan_keys raportează intrările index care indică rândurile din blocurile de date corupte. Toate aceste intrări index sunt inserate într-un tabel cheie orfan care stochează cheia și rowid corupției.

după ce informațiile de intrare index au fost preluate, puteți reconstrui indexul folosind instrucțiunea ALTER index REBUILD ONLINE.

repara Freelists folosind procedura rebuild_freelists

atunci când un bloc marcat „corupt” se găsește la capul sau coada unui freelist, freelist este reinitialized și o eroare este returnat. Deși acest lucru ia blocul ofensatoare de pe freelist, te face să-și piardă acces freelist la toate blocurile care au urmat blocul corupt.

puteți utiliza procedura rebuild_freelists pentru a reinițializa freelists. Obiectul este scanat și, dacă este potrivit ca un bloc să fie pe freelist, acesta este adăugat la master freelist. Freelist grupuri sunt manipulate de meting afară blocuri într-un mod echitabil–un bloc la un moment dat. Orice blocuri marcate „corupte” în obiect sunt ignorate în timpul reconstruirii.

limitări și restricții

procedurile DBMS_REPAIR au următoarele limitări:

  • tabelele cu lobi, tabele imbricate și VARRAYS sunt acceptate, dar coloanele din linie sunt ignorate. Clusterele
  • sunt acceptate în procedurile skip_corrupt_blocks și rebuild_freelist, dar nu în procedura check_object.
  • index-tabele organizate și indici LOB nu sunt acceptate.
  • procedura dump_orphan_keys nu funcționează pe indici bitmap sau indexuri bazate pe funcții.
  • procedura dump_orphan_keys procesează chei care au cel mult 3.950 de octeți.

proceduri DBMS_REPAIR

aceste secțiuni conțin descrieri detaliate ale procedurilor dbms_repair.

check_object

procedura check_object verifică obiectele specificate și populează tabelul de reparații cu informații despre corupții și directivele de reparații. Validarea constă în blocarea verificării tuturor blocurilor din obiect. Puteți specifica opțional un interval, un nume de partiție sau un nume de subpartiție atunci când doriți să verificați o porțiune a unui obiect.

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)

tabelul 19-3 procedura check_object
Argument descriere

schema_name

numele schemei obiectului care trebuie verificat.

object_name

numele tabelului sau indexului care trebuie verificat.

partition_name (optional)

numele partiției sau subpartiției care trebuie verificat. Dacă acesta este un obiect partiționat și partition_name nu este specificat, atunci toate partițiile și subpartițiile sunt verificate. Dacă acesta este un obiect partiționat și partiția specificată conține subpartiții, atunci toate subpartițiile sunt verificate.

object_type (optional)

tipul obiectului care urmează să fie procesat. Trebuie să fie TABLE_OBJECT sau INDEX_OBJECT. Valoarea implicită este TABLE_OBJECT.

repair_table_name (optional)

numele tabelului de reparații care urmează să fie populat. Tabelul trebuie să existe în schema SYS. Utilizați procedura admin_tables pentru a crea un tabel de reparații. Numele implicit este ‘REPAIR_TABLE’.

flags (optional)

rezervat pentru utilizare viitoare.

relative_fno (optional)

numărul fișierului relativ. Utilizat la specificarea unui interval de blocuri.

block_start (optional)

primul bloc pentru a procesa în cazul în care se specifică un interval de bloc. Poate fi specificat numai dacă obiectul este un singur tabel, partiție sau subpartiție.

block_end (optional)

ultimul bloc de procesat dacă specificați un interval de blocuri. Poate fi specificat numai dacă obiectul este un singur tabel, partiție sau subpartiție.

dacă este specificat doar unul dintre block_start sau block_end, atunci celălalt este implicit la primul sau ultimul bloc din fișier.

corrupt_count

Numărul de corupții raportate.

fix_corrupt_blocks

utilizați această procedură pentru a remedia blocurile corupte din obiectele specificate pe baza informațiilor din tabelul de reparații care au fost generate anterior de procedura check_object. Înainte de a efectua orice modificare a unui bloc, blocul este verificat pentru a se asigura că blocul este încă corupt. Blocuri corupte sunt reparate prin marcarea software-ul bloc corupt. Când se efectuează o reparație, rândul asociat din tabelul de reparații este actualizat cu un marcaj de timp fix.

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)

tabelul 19-4 procedura fix_corrupt_blocks
Argument descriere

schema_name

numele schemei.

object_name

numele obiectului cu blocuri corupte care urmează să fie stabilite.

partition_name (optional)

numele partiției sau subpartiției care urmează să fie procesată. Dacă acesta este un obiect partiționat și partition_name nu este specificat, atunci toate partițiile și subpartițiile sunt procesate. Dacă acesta este un obiect partiționat și partiția specificată conține subpartiții, atunci toate subpartițiile sunt procesate.

object_type (optional)

tipul obiectului care urmează să fie procesat. Trebuie să fie TABLE_OBJECT sau INDEX_OBJECT. Valoarea implicită este TABLE_OBJECT.

repair_table_name (optional)

numele tabelului de reparații cu directivele de reparații. Trebuie să existe în schema SYS.

flags (optional)

rezervat pentru utilizare viitoare.

fix_count

Numărul de blocuri fixe.

dump_orphan_keys

rapoarte privind intrările index care indică rânduri în blocuri de date corupte. Pentru fiecare astfel de intrare de index întâlnită, se introduce un rând în tabelul orfan specificat.

dacă este specificat tabelul de reparații, atunci toate blocurile corupte asociate tabelului de bază sunt tratate în plus față de toate blocurile de date care sunt marcate software corupt. În caz contrar, numai blocurile care sunt marcate corupte sunt tratate.

aceste informații pot fi utile pentru reconstruirea rândurilor pierdute în tabel și în scopuri de diagnosticare.

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)

tabelul 19-5 procedura dump_orphan_keys
Argument descriere

schema_name

numele schemei.

object_name

numele obiectului.

partition_name (optional)

numele partiției sau subpartiției care urmează să fie procesată. Dacă acesta este un obiect partiționat și partition_name nu este specificat, atunci toate partițiile și subpartițiile sunt procesate. Dacă acesta este un obiect partiționat și partiția specificată conține subpartiții, atunci toate subpartițiile sunt procesate.

object_type (optional)

tipul obiectului care urmează să fie procesat. Valoarea implicită este INDEX_OBJECT.

repair_table_name (optional)

numele tabelului de reparare care conține informații despre blocurile corupte din tabelul de bază. Tabelul specificat trebuie să existe în schema SYS. Procedura admin_tables este utilizată pentru a crea tabelul.

orphan_table_name (optional)

numele tabelului cheie orfană pentru a popula cu informații referitoare la fiecare intrare de index care se referă la un rând dintr-un bloc de date corupt. Tabelul specificat trebuie să existe în schema SYS. Procedura admin_tables este utilizată pentru a crea tabelul.

key_count

numărul de intrări index procesate.

rebuild_freelists

reconstruiește freelists pentru obiectul specificat. Toate blocurile gratuite sunt plasate pe maestrul freelist. Toate celelalte freelists sunt zero. Dacă obiectul are mai multe grupuri freelist, atunci blocurile libere sunt distribuite între toți freelists, alocând diferitelor grupuri în mod round-robin.

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);

tabelul 19-6 procedura rebuild_freelists
Argument descriere

schema_name

numele schemei.

object_name

numele obiectului al cărui freelists urmează să fie reconstruit.

partition_name (optional)

partiție sau subpartition nume ale căror freelists urmează să fie reconstruit. Dacă acesta este un obiect partiționat și partition_name nu este specificat, atunci toate partițiile și subpartițiile sunt procesate. Dacă acesta este un obiect partiționat și partiția specificată conține subpartiții, atunci toate subpartițiile sunt procesate.

object_type (optional)

tipul obiectului care urmează să fie procesat. Trebuie să fie TABLE_OBJECT sau INDEX_OBJECT. Valoarea implicită este TABLE_OBJECT.

skip_corrupt_blocks

Activează sau dezactivează omiterea blocurilor corupte în timpul scanărilor index și tabel ale obiectului specificat. Când obiectul este un tabel, skip se aplică tabelului și indexurilor acestuia. Când obiectul este un cluster, se aplică tuturor tabelelor din cluster și indexurilor lor respective.

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);

tabelul 19-7 procedura skip_corrupt_blocks
Argument descriere

schema_name

numele schemei obiectului care urmează să fie procesat.

object_name

numele obiectului.

partition_name (optional)

numele partiției sau subpartiției care urmează să fie procesată. Dacă acesta este un obiect partiționat și partition_name nu este specificat, atunci toate partițiile și subpartițiile sunt procesate. Dacă acesta este un obiect partiționat și partiția specificată conține subpartiții, atunci toate subpartițiile sunt procesate.

object_type (optional)

tipul obiectului care urmează să fie procesat. Trebuie să fie TABLE_OBJECT sau CLUSTER_OBJECT. Valoarea implicită este TABLE_OBJECT.

flags (optional)

dacă este specificat SKIP_FLAG, pornește skip de blocuri corupte de software pentru obiect în timpul scanărilor index și tabel. Dacă este specificat NOSKIP_FLAG, scanează care se confruntă cu software-ul blocuri corupte returna un ORA-1578.

admin_tables

oferă funcții administrative pentru repararea și tabele cheie orfane.

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

tabelul 19-8 procedura admin_tables
Argument descriere

table_name

numele tabelului care urmează să fie procesat. Implicit la ‘ ORPHAN_KEY_TABLE ‘sau’ REPAIR_TABLE ‘ pe baza table_type specificat. Când este specificat, numele tabelului trebuie să aibă prefixul corespunzător, ‘ORPHAN_’ sau ‘REPAIR_’.

table_type

tipul de tabel, trebuie să fie unul dintre ORPHAN_TABLE sau REPAIR_TABLE.

action

indică ce acțiune administrativă trebuie efectuată. Trebuie să fie CREATE_ACTION, PURGE_ACTION, sau DROP_ACTION. Dacă tabelul există deja și CREATE_ACTION este specificat, atunci este returnată o eroare. PURGE_ACTION indică ștergerea tuturor rândurilor din tabel care sunt asociate cu obiecte inexistente. Dacă tabelul nu există și DROP_ACTION este specificat, atunci este returnată o eroare.

când CREATE_ACTION și DROP_ACTION sunt specificate, o vizualizare asociată numită dba_< nume_ table_> este creată și, respectiv, abandonată. Vizualizarea este definită astfel încât rândurile asociate cu obiecte inexistente să fie eliminate.

creat în schema SYS.

tablespace (optional)

indică spațiul de tabel de utilizat la crearea unui tabel. În mod implicit, se utilizează spațiul de tabelă implicit al SYS. O eroare este returnată dacă spațiul de masă este specificat și acțiunea nu este CREATE_ACTION.

excepții DBMS_REPAIR

942 tabelul de reparații nu există
1418 indicele specificat nu există
24120 parametru nevalid
24121 nu se poate specifica CASCADE_FLAG și un interval de bloc
24122 interval de blocare nevalid
24124 parametru de acțiune nevalid specificat
24126 CASCADE_FLAG specificat și obiect nu este un tabel
24127 tablespace specificat și acțiunea nu este CREATE_ACTION
24128 partiție specificată pentru obiect nepartiționat
24129 Nume tabel cheie orfană nevalid – trebuie să aibă prefixul ‘ORPHAN_’
24129 tabelul de reparații specificat nu începe cu prefixul’ REPAIR_’
24131 tabelul de reparații are coloane incorecte
24132 numele mesei de reparații este prea lung

Lasă un răspuns

Adresa ta de email nu va fi publicată.