sql >> Databáze >  >> RDS >> Oracle

Ukládání datových bloků

Nedávno jsem pracoval na některých poškozeních datových bloků a potřeboval jsem vypsat některé datové bloky, abych ověřil jejich obsah. Musel jsem oprášit papír, který jsem napsal kdysi dávno a který ukazoval, jak to udělat. Následuje část tohoto papíru:

Chcete-li vypsat blok patřící do tabulky, musíte znát číslo souboru a číslo bloku tohoto bloku. Pokud již znáte číslo souboru a blok, jste připraveni. Pokud neznáte číslo souboru a blok, můžete se na tyto informace zeptat DBA_EXTENTS. Nyní, když víme, který soubor a bloky drží naši tabulku, vynecháme ukázkový blok tabulky. To se provádí následovně:

ORA9I SQL> změnit datový soubor výpisu systému 3 blok 10;

Systém změněn.

Rozsah bloků můžete vypsat pomocí následujícího příkazu:

ORA9I SQL> změnit datový soubor výpisu systému 3 blok min 10 blok max 12;

Systém změněn.

Podívejme se nyní na obsah vyhození jednoho bloku.

Spustit bloky výpisu dat tsn:3 soubor#:3 minblk 10 maxblk 10
vyrovnávací paměť tsn:3 rdba:0x00c0000a (3/10)
scn:0x0000.00046911 seq:0flg4x02 :0x69110602
frmt:0x02 chkval:0x579d typ:0x06=trans data
Výpis hlavičky bloku:0x00c0000a
ID objektu na bloku? Y
seg/obj:0x6d9c csc:0x00.46911 itc:2 flg:O typ:1 – DATA
fsl:0 fnx:0x0 ver:0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 xid:0x0005.02f.0000010c uba:0x00806f10.00ca.28 C--- 0 scn 0x0000.00044630.0<0x0000.0004630.0.0 00000101 uba:0x00800033.0099.04 C--- 0 scn 0x0000.00046906

Toto je začátek výpisu datových bloků. První řádek nám říká, že vyhazujeme soubor #3, počínaje blokem # 10 (minblk) a končícím blokem # 10 (maxblk). Pokud bychom vypsali více než jeden datový blok, tyto hodnoty by představovaly rozsah. Relativní adresa bloku dat (rdba) je 0x00c0000a. Další informace o rdba naleznete v další části tohoto dokumentu. Na konci tohoto řádku vidíme v závorkách, že rdba odpovídá souboru # 3, bloku # 10 (3/10).

Třetí řádek popisuje SCN datového bloku. V našem případě je SCN 0x0000.00046911. Konec datového bloku se skládá z posledních dvou bajtů SCN (6911) připojených k typu (06) a sekvenci (02). Pokud rozklad ocasu neodpovídá těmto třem hodnotám, pak systém ví, že blok je nekonzistentní a je třeba jej obnovit. Zatímco tato koncová hodnota se zobrazuje na začátku výpisu bloku, je fyzicky uložena na konci datového bloku.

Typ bloku se zobrazí na čtvrtém řádku. Některé z platných typů odpovídají následující tabulce:

Typ Význam
0x02 blok zpět
0x06 tabulka nebo blok dat indexu
0x0e zpět záhlaví segmentu
0x10 blok záhlaví datového segmentu
0x17 bitmapové záhlaví datového segmentu

"ID objektu v bloku?" řádek nám říká, zda je tento objekt v SYS.OBJ $. Od Oracle 6 by to mělo být vždy „Y“. Pokud se podíváte na další řádek, hodnota seg/obj nám říká ID objektu segmentu (v hexanech). V našem příkladu je to 0x6d9c. Hexadecimální ‚6D9C‘ je ‚28060‘ v desítkové soustavě. Že se jedná o naši tabulku, můžeme ověřit pomocí následujícího dotazu:

ORA9I SQL> vyberte vlastníka, název_objektu z dba_objektů
2 kde object_id=28060;

VLASTNÍK OBJECT_NAME
---------- ------------------------------
PEASLAND EMP

Jak jsme doufali, toto je náš stůl.

Hodnota csc je číslo změny systému Cleanout. Tato hodnota nám říká, kdy bylo na tomto bloku provedeno vyčištění bloku. Doufejme, že odpovídá SCN datového bloku. Hodnota itc je počet zainteresovaných transakcí. V našem případě se o tento blok zajímají dvě transakce. Zájemci o transakce se objeví na konci našeho příkladu. Můžeme vidět ID transakce (Xid) těchto dvou transakcí. Tato ID transakcí odpovídají segmentům vrácení zpět, které se používají ke zpracování našich transakcí.

Příznak (flg) je buď „-“ nebo „O“, používá se k označení, zda je tento blok na volném seznamu. Pokud je blok na volném seznamu, příznak bude „0“. Pokud není na freelistu, pak příznak bude „-“. Náš dotyčný blok je na freelistu.

No, to bylo docela hodně informací a my jsme se opravdu moc na skládku nedívali. Podívejme se na další část výpisu datových bloků.

data_block_dump
===============
tsiz:0x1fa0
hsiz:0x2e
pbl:0x024d015c
bdba:0x00c0000a
vlajka=-------------
ntab=1
nrow=14
frre=9
fsbo=0x2e
fseo=0x1b18
avsp=0x1d8a
tosp=0x1d8a
0xe:pti[0] nrow=14 offs=0
0x12:pri[0] offs=0x1c30
0x14:pri[1] offs=0x1f4f
0x16:pri[2] offs=0x1f24
0x18:pri[3] offs=0x1efb
0x1a:pri[4] offs=0x1ece
0x1c:pri[5] offs=0x1ea5
0x1e:pri[6] offs=0x1e7c
0x20:pri[7] offs=0x1e54
0x22:pri[8] offs =0x1e2e
0x24:pri[9] sfll=13
0x26:pri[10] offs=0x1ca4
0x28:pri[11] offs=0x1cf1
0x2a:pri[12 ] offs=0x1b18
0x2c:pri[13] sfll=-1

Hodnota tsiz nám ukazuje množství dostupného místa v bloku pro data. Zde dostáváme „1fa0“, což znamená 8 096 bajtů použitelné místnosti. Zbytek našeho bloku o velikosti 8 192 bajtů se používá pro režii, jako je hlavička bloku.

Hodnota ntab nám ukazuje, kolik tabulek je uloženo v tomto bloku. Pokud tento blok nepatří do clusteru, bude tato hodnota „1“. Hodnota nrow nám říká, kolik řádků dat je uloženo v tomto bloku. Náš datový blok má 14 řádků dat.

Počínaje adresou ‚0xe‘ získáme adresář pro každý řádek. Vidíme, že první řádek (nulový záznam indexu) začíná na offsetové adrese k bloku „0x1c30“. Odtud následuje každý z řad bloků. Tímto způsobem lze řádek najít opravdu rychle. Pamatujte, že ROWID je v podstatě ukazatel na jedinečný řádek. V Oracle 8+ má ROWID tvar O.F.B.R (nebo objectno,relativefno,blockno,rowno). Takže když systém rychle ukazuje na konkrétní blok v konkrétním souboru, číslo řádku ukazuje na slot v tomto adresáři. Adresář pak ukazuje na konkrétní místo v bloku. Toto je začátek tohoto řádku.

Nyní, když máme plán k našemu datovému bloku, podívejme se na zbytek trasovacího souboru, abychom viděli skutečné řádky dat v bloku.

block_row_dump:
tabulátor 0, řádek 0, @0x1c30
tl:39 fb:--H-FL-- lb:0x0 cc:8
sloupec 0:[ 3] c2 4a 46
sloupec 1:[ 5] 53 4d 49 54 48
sloupec 2:[ 5] 43 4c 45 52 4b
sl. 3:[ 3] c2 50 03
sl. 4:[ 7] 77 b4 0c 11 01 01 01
sloupec 5:[ 3] c2 09 19
sloupec 6:*NULL*
sloupec 7:[ 2] c1 15

Skutečná data řádku začínají frází „block_row_dump:“. Poté je uveden řádek dat. Ukázal jsem zde pouze jeden řádek dat, protože zbytek je podobný. Vidíme, že tento řádek patří do tabulky „0“ (tab) našeho clusteru. Protože v našem příkladu není žádný cluster, nemáme více než jednu tabulku, takže tato hodnota bude nula. Můžeme také vidět, že toto je řádek „0“ a adresa tohoto řádku je uvedena. Tato adresa by měla odpovídat naší cestovní mapě uvedené výše.

Hodnota ‚tl‘ nám udává celkový počet bajtů pro tento řádek, včetně případné režie. Vidíme, že tento řádek zabírá 39 bajtů. Hodnota „cc“ nám udává počet sloupců. V tomto řádku máme osm sloupců. To lze snadno ověřit provedením DESCRIBE v tabulce a spočítáním sloupců nebo dotazem USER_TAB_COLUMNS.

Hodnota „fb“ nám dává příznaky o řádku. „H“ znamená, že máme hlavu řady. „F“ znamená, že máme první kus řady. „L“ znamená, že máme také poslední kus řady. Protože se jedná o první a poslední kus řady, řada není zřetězena. Vzhledem k tomu, že toto je také hlava řádku, řádek nebyl migrován.

Zbývající informace pro řádek jsou data pro každý sloupec. Například ve sloupci 1 máme následující kódy znaků ASCII, „53 4d 49 54 48“. Rychlý pohled na převodní tabulku ASCII nám řekne, že tyto znaky jsou „SMITH“. Pokud znáte vzorovou tabulku EMP, budete vědět, že SMITH je jedním z našich zaměstnanců. Všimněte si, že sloupec 6 má hodnotu NULL. Sloupec 4 je sloupec HIREDATE. Toto je datový typ DATE. Z tohoto bloku můžete snadno ověřit, že datový typ DATE vyžaduje sedm bajtů úložiště. Sloupec 0 obsahuje číslo. Zde uvedené tři bajty představují toto číslo.


  1. Jak oříznout řetězce v SQL

  2. Nejlepší datový typ pro ukládání peněžních hodnot v MySQL

  3. Chyba přihlášení k serveru SQL:přihlášení se nezdařilo pro uživatele 'NT AUTHORITY\SYSTEM'

  4. SQLite Select Distinct