Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zrzucanie bloków danych

Ostatnio pracowałem nad niektórymi uszkodzeniami bloków danych i musiałem zrzucić niektóre bloki danych, aby zweryfikować ich zawartość. Musiałem strzepnąć artykuł, który napisałem dawno temu, który pokazał, jak to zrobić. Poniżej znajduje się fragment tego artykułu:

Aby zrzucić blok należący do tabeli, musisz znać numer pliku i numer bloku tego bloku. Jeśli znasz już numer pliku i blok, to wszystko gotowe. Jeśli nie znasz numeru pliku i bloku, możesz zapytać DBA_EXTENTS o te informacje. Teraz, gdy wiemy, który plik i bloki przechowują naszą tabelę, zrzućmy przykładowy blok tabeli. Odbywa się to w następujący sposób:

ORA9I SQL> zmień plik danych zrzutu systemu 3 blok 10;

Zmieniono system.

Możesz zrzucić zakres bloków za pomocą następującego polecenia:

ORA9I SQL> zmień plik danych zrzutu systemowego 3 blok min 10 blok maks 12;

Zmieniono system.

Przyjrzyjmy się teraz zawartości zrzucania jednego bloku.

Startowe bloki danych zrzutu tsn:3 file#:3 minblk 10 maxblk 10
buffer tsn:3 rdba:0x00c0000a (3/10)
scn:0x0000.00046911 seq:0x02 flg:0x04 tail :0x69110602
frmt:0x02 chkval:0x579d type:0x06=trans data
Zrzut nagłówka bloku:0x00c0000a
Identyfikator obiektu w bloku? Y
seg/obj:0x6d9c csc:0x00.46911 itc:2 flg:O typ:1 - DANE
fsl:0 fnx:0x0 ver:0x01

Itl Xid Flaga Uba Lck Scn/Fsc
0x01 xid:0x0005.02f.0000010c uba:0x00806f10.00ca.28 C--- 0 scn 0x0000.00046900
0x02 xid:0x0003.01c. 00000101 uba:0x00800033.0099.04 C--- 0 scn 0x0000.00046906

To jest początek zrzutu bloku danych. Pierwsza linia mówi nam, że zrzucamy plik nr 3, zaczynając od bloku nr 10 (minblk), a kończąc na bloku nr 10 (maxblk). Gdybyśmy zrzucili więcej niż jeden blok danych, wartości te reprezentowałyby zakres. Względny adres bloku danych (rdba) to 0x00c0000a. Więcej informacji na temat rdba można znaleźć w dalszej części tego dokumentu. Na końcu tej linii możemy zobaczyć w nawiasach, że rdba odpowiada plikowi nr 3, blok nr 10 (3/10).

Trzecia linia opisuje SCN bloku danych. W naszym przypadku SCN to 0x0000.00046911. Ogon bloku danych składa się z dwóch ostatnich bajtów SCN (6911) z dołączonym typem (06) i sekwencją (02). Jeśli rozkład ogona nie odpowiada tym trzem wartościom, system wie, że blok jest niespójny i należy go odzyskać. Chociaż ta wartość ogona pojawia się na początku zrzutu bloku, jest fizycznie przechowywana na końcu bloku danych.

Typ bloku pojawia się w czwartym wierszu. Niektóre z prawidłowych typów odpowiadają poniższej tabeli:

Typ Znaczenie
blok 0x02 cofnij
tabela 0x06 lub blok danych indeksu
0x0e nagłówek segmentu cofnij
blok nagłówka segmentu danych 0x10
nagłówek segmentu danych bitmapowych 0x17

„Identyfikator obiektu w bloku?” linia mówi nam, czy ten obiekt znajduje się w SYS.OBJ$, czy nie. Od Oracle 6 powinno to być zawsze „Y”. Jeśli spojrzysz na następny wiersz, wartość seg/obj powie nam identyfikator obiektu segmentu (w szesnastce). W naszym przykładzie jest to 0x6d9c. Szesnastkowy „6D9C” to „28060” w postaci dziesiętnej. Możemy zweryfikować, że to jest nasza tabela za pomocą następującego zapytania:

ORA9I SQL> wybierz właściciela,object_name z dba_objects
2 gdzie object_id=28060;

WŁAŚCICIEL OBIEKTU_NAZWA
---------- ------------------------------
EMP GROSZKÓW

Tak jak się spodziewaliśmy, to jest nasz stół.

Wartość csc to numer zmiany systemu czyszczenia. Ta wartość informuje nas, kiedy na tym bloku zostało wykonane czyszczenie bloku. Mamy nadzieję, że pasuje do SCN bloku danych. Wartość itc to Licznik Zainteresowanych Transakcji. W naszym przypadku tym blokiem są zainteresowane dwie transakcje. Zainteresowane transakcje pojawiają się na końcu naszego przykładu. Widzimy identyfikator transakcji (Xid) tych dwóch transakcji. Te identyfikatory transakcji odpowiadają segmentom wycofania, które są używane do przetwarzania naszych transakcji.

Flaga (flg) to „-” lub „O”, używana do wskazania, czy ten blok znajduje się na wolnej liście. Jeśli blok znajduje się na freeliście, flagą będzie „0”. Jeśli nie znajduje się na freeliście, flagą będzie „-”. Nasz blok, o którym mowa, znajduje się na liście freelist.

Cóż, to było całkiem sporo informacji i tak naprawdę nie przyjrzeliśmy się zbyt dużej części wysypiska. Spójrzmy na następną sekcję zrzutu bloku danych.

data_block_dump
===============
tsiz:0x1fa0
hsiz:0x2e
pbl:0x024d015c
bdba:0x00c0000a
flaga=-------------
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] wył=0x1ea5
0x1e:pri[6] wył=0x1e7c
0x20:pri[7] wył=0x1e54
0x22:pri[8] wył =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

Wartość tsiz pokazuje nam ilość dostępnego miejsca w bloku na dane. Tutaj otrzymujemy „1fa0”, co przekłada się na 8096 bajtów użytecznego miejsca. Reszta naszego 8192-bajtowego bloku jest używana do narzutów, takich jak nagłówek bloku.

Wartość ntab pokazuje nam, ile tabel jest przechowywanych w tym bloku. O ile ten blok nie należy do klastra, ta wartość będzie wynosić „1”. Wartość nrow mówi nam, ile wierszy danych jest przechowywanych w tym bloku. Nasz blok danych ma 14 wierszy danych.

Zaczynając od adresu „0xe”, otrzymujemy katalog do każdego wiersza. Widzimy, że pierwszy wiersz (wpis indeksu zero) zaczyna się od adresu przesunięcia do bloku „0x1c30”. Każdy z rzędów bloków wynika stąd. W ten sposób rząd można znaleźć bardzo szybko. Pamiętaj, że ROWID jest w zasadzie wskaźnikiem do unikalnego wiersza. W Oracle 8+ ROWID ma postać OFBR (lub obiektno,względnefno,blokno,rowno). Więc kiedy system szybko wskazuje konkretny blok w określonym pliku, numer wiersza wskazuje na slot w tym katalogu. Katalog następnie wskazuje na konkretną lokalizację w bloku. To jest początek tego wiersza.

Teraz, gdy mamy mapę drogową do naszego bloku danych, spójrzmy na pozostałą część pliku śledzenia, aby zobaczyć rzeczywiste wiersze danych w bloku.

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

Rzeczywiste dane wiersza zaczynają się od wyrażenia „block_row_dump:”. Następnie podany jest wiersz danych. Pokazałem tutaj tylko jeden wiersz danych, ponieważ reszta jest podobna. Widzimy, że ten wiersz należy do tabeli „0” (zakładka) naszego klastra. Ponieważ w naszym przykładzie nie ma klastra, nie mamy więcej niż jednej tabeli, więc ta wartość będzie wynosić zero. Możemy również zobaczyć, że jest to wiersz „0” i podany jest adres tego wiersza. Ten adres powinien odpowiadać naszej mapie drogowej opisanej powyżej.

Wartość „tl” daje nam całkowitą liczbę bajtów dla tego wiersza, w tym wszelkie narzuty. Widzimy, że ten wiersz zajmuje 39 bajtów. Wartość „cc” daje nam liczbę kolumn. W tym wierszu mamy osiem kolumn. Można to łatwo zweryfikować, wykonując DESCRIBE na tabeli i licząc kolumny lub wysyłając zapytanie do USER_TAB_COLUMNS.

Wartość „fb” daje nam flagi dotyczące wiersza. „H” oznacza, że ​​mamy głowę rzędu. „F” oznacza, że ​​mamy pierwszy kawałek rzędu. „L” oznacza, że ​​mamy również ostatni kawałek rzędu. Ponieważ jest to pierwszy i ostatni element rzędu, rząd nie jest połączony łańcuchem. Ponieważ jest to również nagłówek wiersza, wiersz nie został przeniesiony.

Reszta informacji dla wiersza to dane dla każdej kolumny. Na przykład w kolumnie 1 mamy następujące kody znaków ASCII:„53 4d 49 54 48”. Szybkie spojrzenie na wykres konwersji ASCII powie nam, że te znaki to „SMITH”. Jeśli znasz przykładową tabelę EMP, wiesz, że SMITH jest jednym z naszych pracowników. Zauważ, że kolumna 6 ma wartość NULL. Kolumna 4 to kolumna HIREDATE. To jest typ danych DATE. Z tego bloku możesz łatwo sprawdzić, czy typ danych DATE wymaga siedmiu bajtów pamięci. Kolumna 0 zawiera liczbę. Trzy bajty tutaj są reprezentacją tej liczby.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego nie mogę wprowadzić tej daty do tabeli za pomocą sql?

  2. Baza danych Oracle 21c

  3. Jaka jest minimalna konfiguracja wymagana do wdrożenia aplikacji .NET z klientem Oracle 11?

  4. Kiedy muszę użyć średnika, a kiedy ukośnika w Oracle SQL?

  5. Oracle:jaka jest sytuacja, aby użyć RAISE_APPLICATION_ERROR?