sql >> Base de Datos >  >> RDS >> Oracle

Volcado de bloques de datos

Recientemente estuve trabajando en algunas corrupciones de bloques de datos y necesitaba volcar algunos bloques de datos para verificar su contenido. Tuve que borrar un artículo que escribí hace mucho tiempo que mostraba cómo hacer esto. Lo que sigue es una parte de ese documento:

Para volcar un bloque que pertenece a una tabla, necesitará saber el número de archivo y el número de bloque de ese bloque. Si ya conoce el número de archivo y el bloque, ya está todo listo. Si no conoce el número de archivo y el bloque, puede consultar DBA_EXTENTS para obtener esa información. Ahora que sabemos qué archivos y bloques contienen nuestra tabla, descarguemos un bloque de muestra de la tabla. Esto se hace de la siguiente manera:

ORA9I SQL> alter system dump datafile 3 block 10;

System altered.

Puede volcar un rango de bloques con el siguiente comando:

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

System altered.

Veamos ahora el contenido de volcar un bloque.

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

Este es el comienzo del volcado del bloque de datos. La primera línea nos dice que estamos volcando el archivo n.° 3, comenzando en el bloque n.° 10 (minblk) y terminando con el bloque n.° 10 (maxblk). Si hubiéramos volcado más de un bloque de datos, estos valores representarían un rango. La dirección relativa del bloque de datos (rdba) es 0x00c0000a. Para obtener más información sobre la rdba, consulte una sección posterior de este documento. Al final de esta línea, podemos ver entre paréntesis que la rdba corresponde al archivo # 3, bloque # 10 (3/10).

La tercera línea describe el SCN del bloque de datos. En nuestro caso, el SCN es 0x0000.00046911. La cola del bloque de datos se compone de los dos últimos bytes del SCN (6911) anexados con el tipo (06) y la secuencia (02). Si la descomposición de la cola no coincide con estos tres valores, entonces el sistema sabe que el bloque es inconsistente y necesita recuperarse. Si bien este valor final aparece al comienzo del volcado de bloque, se almacena físicamente al final del bloque de datos.

El tipo de bloque aparece en la cuarta línea. Algunos de los tipos válidos corresponden a la siguiente tabla:

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

El "¿Id. de objeto en bloque?" line nos dice si este objeto está o no en SYS.OBJ$. Desde Oracle 6, esto siempre debe ser "Y". Si observa la siguiente línea, el valor seg/obj nos dice la identificación del objeto del segmento (en hexadecimal). En nuestro ejemplo, esto es 0x6d9c. El hexadecimal '6D9C' es '28060' en decimal. Podemos verificar que esta es nuestra tabla con la siguiente consulta:

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

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

Como esperábamos, esta es nuestra mesa.

El valor csc es el número de cambio del sistema de limpieza. Este valor nos dice cuándo se realizó la limpieza del bloque en este bloque. Con suerte, coincide con el SCN del bloque de datos. El valor de itc es el Recuento de la lista de transacciones interesadas. En nuestro caso, hay dos transacciones interesadas en este bloque. Esas transacciones interesadas aparecen al final de nuestro ejemplo. Podemos ver la identificación de la transacción (Xid) de esas dos transacciones. Esos identificadores de transacción corresponden a segmentos de reversión que se utilizan para procesar nuestras transacciones.

La bandera (flg) es "-" o "O", y se usa para indicar si este bloque está en una lista libre. Si el bloque está en una lista libre, la bandera será "0". Si no está en una lista libre, la bandera será "-". Nuestro bloque en cuestión está en la lista libre.

Bueno, esa fue mucha información y realmente no hemos mirado demasiado del vertedero. Veamos la siguiente sección del volcado del bloque de datos.

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

El valor tsiz nos muestra la cantidad de espacio disponible en el bloque para datos. Aquí, obtenemos '1fa0' que se traduce en 8096 bytes de espacio utilizable. El resto de nuestro bloque de 8192 bytes se usa para sobrecarga, como el encabezado del bloque.

El valor ntab nos muestra cuántas tablas están almacenadas en este bloque. A menos que este bloque pertenezca a un clúster, este valor será '1'. El valor nrow nos dice cuántas filas de datos se almacenan en este bloque. Nuestro bloque de datos tiene 14 filas de datos.

Comenzando en la dirección '0xe', obtenemos un directorio para cada fila. Podemos ver que la primera fila (entrada de índice cero) comienza en la dirección de desplazamiento al bloque '0x1c30'. Cada una de las filas de bloques sigue desde aquí. De esta manera, se puede encontrar una fila muy rápidamente. Recuerde que ROWID es básicamente un puntero a una fila única. En Oracle 8+, el ROWID tiene la forma O.F.B.R (u objectno,relativefno,blockno,rowno). Entonces, cuando el sistema apunta rápidamente a un bloque en particular en un archivo en particular, el número de fila apunta a una ranura en este directorio. Luego, el directorio apunta a una ubicación específica en el bloque. Este es el comienzo de esa fila.

Ahora que tenemos una hoja de ruta para nuestro bloque de datos, veamos el resto del archivo de rastreo para ver las filas reales de datos en el bloque.

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

Los datos de fila reales comienzan con la frase "block_row_dump:". Luego se da una fila de datos. Solo he mostrado una fila de datos aquí, ya que el resto es similar. Podemos ver que esta fila pertenece a la tabla '0' (pestaña) de nuestro clúster. Dado que no hay clúster en nuestro ejemplo, no tenemos más de una tabla, por lo que este valor será cero. También podemos ver que esta es la fila '0' y se proporciona la dirección de esa fila. Esta dirección debe corresponder a nuestra hoja de ruta mencionada anteriormente.

El valor 'tl' nos da el número total de bytes para esta fila, incluidos los gastos generales. Podemos ver que esta fila ocupa 39 bytes. El valor 'cc' nos da un recuento de columnas. Tenemos ocho columnas en esta fila. Esto se puede verificar fácilmente haciendo un DESCRIBE en la tabla y contando las columnas, o consultando USER_TAB_COLUMNS.

El valor 'fb' nos da indicadores sobre la fila. 'H' significa que tenemos la cabeza de la fila. 'F' significa que tenemos la primera pieza de la fila. 'L' significa que también tenemos la última pieza de la fila. Dado que esta es la primera y última pieza de la fila, la fila no está encadenada. Dado que este también es el encabezado de la fila, la fila no se ha migrado.

El resto de la información de la fila son los datos de cada columna. Por ejemplo, en la columna 1, tenemos los siguientes códigos de caracteres ASCII, “53 4d 49 54 48”. Una mirada rápida a una tabla de conversión ASCII nos dirá que estos caracteres son "SMITH". Si está familiarizado con la tabla EMP de muestra, sabrá que SMITH es uno de nuestros empleados. Observe que la columna 6 es NULL. La columna 4 es la columna HIREDATE. Este es un tipo de datos DATE. Desde este bloque, puede verificar fácilmente que el tipo de datos DATE requiere siete bytes de almacenamiento. La columna 0 contiene un número. Los tres bytes aquí son la representación de ese número.