Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Dumping von Datenblöcken

Ich habe kürzlich an einigen Datenblockbeschädigungen gearbeitet und musste einige Datenblöcke ausgeben, um deren Inhalt zu überprüfen. Ich musste ein Papier abwischen, das ich vor langer Zeit geschrieben hatte und das zeigte, wie man das macht. Was folgt, ist ein Teil dieses Papiers:

Um einen zu einer Tabelle gehörenden Block auszugeben, müssen Sie die Dateinummer und die Blocknummer dieses Blocks kennen. Wenn Sie die Dateinummer und den Block bereits kennen, sind Sie fertig. Wenn Sie die Dateinummer und den Block nicht kennen, können Sie DBA_EXTENTS nach diesen Informationen abfragen. Nachdem wir nun wissen, welche Datei und welche Blöcke unsere Tabelle enthalten, lassen Sie uns einen Beispielblock der Tabelle ausgeben. Dies geschieht wie folgt:

ORA9I SQL> alter system dump datafile 3 block 10;

System altered.

Sie können eine Reihe von Blöcken mit dem folgenden Befehl ausgeben:

ORA9I SQL> alter system dump datafile 3 block min 10 block max 12;

System altered.

Schauen wir uns nun den Inhalt des Dumpings eines Blocks an.

Start dump data blocks 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
Block header dump: 0x00c0000a
Object id on Block? 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.00046900
0x02 xid: 0x0003.01c.00000101 uba: 0x00800033.0099.04 C--- 0 scn 0x0000.00046906

Dies ist der Beginn des Datenblock-Dumps. Die erste Zeile sagt uns, dass wir Datei Nr. 3 ablegen, beginnend bei Block Nr. 10 (minblk) und mit Block Nr. 10 (maxblk) enden. Hätten wir mehr als einen Datenblock abgelegt, würden diese Werte einen Bereich darstellen. Die relative Datenblockadresse (rdba) ist 0x00c0000a. Weitere Informationen zu rdba finden Sie in einem späteren Abschnitt in diesem Dokument. Am Ende dieser Zeile sehen wir in Klammern, dass die rdba der Datei Nr. 3, Block Nr. 10 (3/10) entspricht.

Die dritte Zeile beschreibt den SCN des Datenblocks. In unserem Fall lautet der SCN 0x0000.00046911. Das Ende des Datenblocks besteht aus den letzten zwei Bytes des SCN (6911), angehängt mit dem Typ (06) und der Sequenz (02). Wenn die Zerlegung des Endes nicht mit diesen drei Werten übereinstimmt, weiß das System, dass der Block inkonsistent ist und wiederhergestellt werden muss. Während dieser Endwert am Anfang des Blockdumps erscheint, wird er physikalisch am Ende des Datenblocks gespeichert.

Der Blocktyp wird in der vierten Zeile angezeigt. Einige der gültigen Typen entsprechen der folgenden Tabelle:

Type Meaning
0x02 undo block
0x06 table or index data block
0x0e undo segment header
0x10 data segment header block
0x17 bitmapped data segment header

Die „Objekt-ID auf Block?“ line sagt uns, ob sich dieses Objekt in SYS.OBJ$ befindet oder nicht. Seit Oracle 6 sollte dies immer „Y“ sein. Wenn Sie sich die nächste Zeile ansehen, sagt uns der Wert seg/obj die Objekt-ID des Segments (in Hex). In unserem Beispiel ist dies 0x6d9c. Hex „6D9C“ ist „28060“ in Dezimalzahl. Wir können mit der folgenden Abfrage überprüfen, ob dies unsere Tabelle ist:

ORA9I SQL> select owner,object_name from dba_objects
2 where object_id=28060;

OWNER OBJECT_NAME
---------- ------------------------------
PEASLAND EMP

Wie wir gehofft hatten, ist dies unser Tisch.

Der csc-Wert ist die Cleanout-Systemänderungsnummer. Dieser Wert teilt uns mit, wann eine Blockbereinigung für diesen Block durchgeführt wurde. Hoffentlich stimmt es mit dem SCN des Datenblocks überein. Der itc-Wert ist der Interested Transaction List Count. In unserem Fall gibt es zwei Transaktionen, die an diesem Block interessiert sind. Diese interessierten Transaktionen erscheinen am Ende unseres Beispiels. Wir können die Transaktions-ID (Xid) dieser beiden Transaktionen sehen. Diese Transaktions-IDs entsprechen Rollback-Segmenten, die zur Verarbeitung unserer Transaktionen verwendet werden.

Das Flag (flg) ist entweder „-“ oder „O“, das verwendet wird, um anzuzeigen, ob dieser Block auf einer freien Liste ist. Wenn sich der Block auf einer freien Liste befindet, ist das Flag „0“. Wenn es sich nicht auf einer Freelist befindet, ist das Flag „-“. Unser fraglicher Block ist auf der Freelist.

Nun, das waren ziemlich viele Informationen und wir haben uns nicht wirklich viel von der Müllkippe angesehen. Schauen wir uns den nächsten Abschnitt des Datenblock-Dumps an.

data_block_dump
===============
tsiz: 0x1fa0
hsiz: 0x2e
pbl: 0x024d015c
bdba: 0x00c0000a
flag=-------------
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

Der tsiz-Wert zeigt uns den verfügbaren Platz im Block für Daten. Hier erhalten wir „1fa0“, was 8.096 Bytes nutzbaren Raum entspricht. Der Rest unseres 8.192-Byte-Blocks wird für Overhead wie den Block-Header verwendet.

Der ntab-Wert zeigt uns, wie viele Tabellen in diesem Block gespeichert sind. Sofern dieser Block nicht zu einem Cluster gehört, ist dieser Wert „1“. Der nrow-Wert sagt uns, wie viele Datenzeilen in diesem Block gespeichert sind. Unser Datenblock hat 14 Datenzeilen.

Beginnend bei der Adresse „0xe“ erhalten wir ein Verzeichnis für jede Zeile. Wir können sehen, dass die erste Zeile (Indexeintrag Null) an der Offset-Adresse zum Block „0x1c30“ beginnt. Von hier aus folgt jede der Blockreihen. So lässt sich eine Zeile sehr schnell finden. Denken Sie daran, dass eine ROWID im Grunde ein Zeiger auf eine eindeutige Zeile ist. In Oracle 8+ hat die ROWID die Form O.F.B.R (oder objectno,relativefno,blockno,rowno). Wenn also das System schnell auf einen bestimmten Block in einer bestimmten Datei zeigt, zeigt die Zeilennummer auf einen Slot in diesem Verzeichnis. Das Verzeichnis zeigt dann auf eine bestimmte Stelle im Block. Dies ist der Beginn dieser Zeile.

Nachdem wir nun eine Roadmap zu unserem Datenblock haben, schauen wir uns den Rest der Ablaufverfolgungsdatei an, um die tatsächlichen Datenzeilen im Block zu sehen.

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

Die eigentlichen Zeilendaten beginnen mit dem Ausdruck „block_row_dump:“. Dann wird eine Reihe von Daten angegeben. Ich habe hier nur eine Datenzeile gezeigt, da der Rest ähnlich ist. Wir können sehen, dass diese Zeile zur Tabelle „0“ (Tabulator) unseres Clusters gehört. Da in unserem Beispiel kein Cluster vorhanden ist, haben wir nicht mehr als eine Tabelle, sodass dieser Wert Null ist. Wir können auch sehen, dass dies die Zeile ‘0’ ist und die Adresse dieser Zeile angegeben ist. Diese Adresse sollte unserer oben erwähnten Roadmap entsprechen.

Der „tl“-Wert gibt uns die Gesamtzahl der Bytes für diese Zeile an, einschließlich etwaiger Overheads. Wir können sehen, dass diese Zeile 39 Bytes belegt. Der Wert „cc“ gibt uns eine Spaltenanzahl. Wir haben acht Spalten in dieser Zeile. Dies kann leicht überprüft werden, indem ein DESCRIBE für die Tabelle durchgeführt und die Spalten gezählt werden, oder indem USER_TAB_COLUMNS abgefragt wird.

Der 'fb'-Wert gibt uns Flags über die Zeile. „H“ bedeutet, dass wir den Kopf der Reihe haben. „F“ bedeutet, dass wir das erste Stück der Reihe haben. „L“ bedeutet, dass wir auch das letzte Stück der Reihe haben. Da dies das erste und letzte Stück der Reihe ist, wird die Reihe nicht verkettet. Da dies auch der Zeilenkopf ist, wurde die Zeile nicht migriert.

Die restlichen Informationen für die Zeile sind die Daten für jede Spalte. In Spalte 1 haben wir beispielsweise die folgenden ASCII-Zeichencodes:„53 4d 49 54 48“. Ein kurzer Blick auf ein ASCII-Umwandlungsdiagramm zeigt uns, dass diese Zeichen „SMITH“ sind. Wenn Sie mit der EMP-Beispieltabelle vertraut sind, wissen Sie, dass SMITH einer unserer Mitarbeiter ist. Beachten Sie, dass Spalte 6 NULL ist. Spalte 4 ist die HIREDATE-Spalte. Dies ist ein DATE-Datentyp. Anhand dieses Blocks können Sie leicht überprüfen, ob der Datentyp DATE sieben Byte Speicherplatz benötigt. Spalte 0 enthält eine Zahl. Die drei Bytes hier sind die Darstellung dieser Zahl.