Life is DUL... without need of it

DUL ed altre storie

Una delle utility piu' potenti e piu' nascoste dell'RBMS Oracle e' il DUL (Data UnLoader).
DUL consente di recuperare i dati da un database corrotto e non piu' ripristinabile leggendo direttamente i dati in binario dai datafile.

DUL viene utilizzato solo dal personale Oracle in casi estremi quando tutte le altre modalita' di recupero dei dati hanno fallito.

Glider Questo e gli altri strumenti descritti o anche solo citati in questo documento sono particolamente complessi, potenzialmente molto dannosi e tutti proibiti.

DUL

DUL viene utilizzato solo dal personale Oracle in casi estremi quando tutte le altre modalita' di recupero dei dati dal DB Oracle hanno fallito. L'unico modo per usufruire di tale servizio e' contattare la struttura Oracle di supporto ed aprire una SR (Service Request).
Data la gravita' dei casi in cui viene impiegato e' importante conoscere come funziona in modo da poter fornire velocemente tutti gli elementi necessari per il recupero. DUL e' praticamente non documentato nel sito di supporto Oracle (MOS), cercando con attenzione si trovano solo alcune tracce del DUL... quindi lo descrivamo in questa pagina!

Fondamentalmente DUL opera direttamente su datafile di Oracle conoscendo la struttura interna dei blocchi di dati e del data dictionary. I parametri interni di configurazione della base dati (dimensione del blocco dati, versione di database, ...) vanno impostati in un file di configurazione. E' inoltre necessario disporre dell'elenco dei datafile da recuperare.
Oltre a questo ogni ulteriore informazione e' utile. Ad esempio: la struttura della base dati, versioni di dettaglio e patch, quali sono gli utenti, la dimensione delle tabelle, l'utilizzo di funzionalita' particolari quali LOB, TDE, partitioning, UDT, ...
Oracle distribuisce la semplice utility DBVerify [NdE comando dbv] che consente il controllo di eventuali blocchi corrotti. Puo' essere utile per verificare la consistenza del danno. Ma quando si utilizza il DUL siamo ben oltre alla semplice corruzione di qualche blocco di dati o di indici. Non funziona piu' nulla e la base dati non riparte.

Vediamo ora la pratica!
Determinare i datafile e' facile (la query funziona anche con un DB in stato di mount):

set trimspool on pagesize 0 linesize 256 feedback off column name format a200 spool control.dul select ts#, rfile#, name from v$datafile; spool off

Lo script SQL genera il file control.dul che contiene i nomi di tutti i datafile.

Nel file init.dul vanno impostati i parametri fisici della base dati da analizzare. Questi dipendono dall'architettura e della configurazione (eg. COMPATIBLE e' la versione di Oracle). Alcuni sono difficili da trovare (eg. select dump(chartorowid('0.0.1')) from dual; -> osd_dba_file_bits), ma i default suggeriti sono quelli piu' comuni:

osd_big_endian_flag=false
osd_dba_file_bits=10
osd_c_struct_alignment=32
osd_file_leader_size=1
osd_word_size = 32
dc_columns=2000000
dc_tables=10000
dc_objects=1000000
dc_users=400
dc_segments=100000
db_block_size=8192
export_mode=true
COMPATIBLE=10
LDR_PHYS_REC_SIZE =0

Ora che tutte le impostazioni sono terminate e' possibile utilizzare interattivamente il DUL per estrarre i dati. I dati vengono estratti in formato .dmp o SQL*Loader. Naturalmente bisogna disporre di spazio sufficiente per l'estrazione e di una nuova base dati per ricaricare i dati.

Se tutto e' stato configurato correttamente l'utilizzo di DUL in modalita' interattiva non e' complesso:

./dul DUL> scan database; DUL> UNLOAD TABLE Owner.Table; DUL> UNLOAD USER Owner; DUL> UNLOAD DATABASE;

L'attivita' di recupero dipende dal tipo di corruzione presente. Se il DUL riesce a recuperare il tablespace di SYSTEM allora accede al data dictionary e recupera in modo piu' semplice le strutture ed i dati. DUL puo' anche recuperare un singolo datafile indovinando i datatype delle colonne e recuperando cosi' comunque alcuni dati. Nei casi piu' gravi (eg. rottura fisica di un disco) e' opportuno incrociare i dati ottenuti dall'estrazione dai tablespace dei dati e di quelli degli indici per quantificare il numero di righe non piu' recuperabili.

Uno dei documenti piu' completi sul DUL rintracciabili in rete e scritto dall'autore del programma, e' questo.

BBED

Avete presente fsdb per i file system ed adb per gli eseguibili? BBED e' l'analogo per Oracle: un editor binario dei blocchi del database Oracle.
Oracle Block Browser and Editor tool (BBED) si compila facilmente su una 9i o una 10g di Oracle e, copiando qualche file, anche su una 11g. Come? Basta vedere il sorgente... BBED richiede una password fissa che si ricava facilmente con strings.

BBED ha un'interfaccia a carattere che consente di analizzare e modificare i blocchi oracle:

$ ./bbed Password: BBED: Release 2.0.0.0.0 - Limited Production on Fri Feb 14 14:14:14 2014 Copyright (c) 1982, 2007, Oracle. All rights reserved. ************* !!! For Oracle Internal Use only !!! *************** BBED> help ALL SET DBA [ dba | file#, block# ] SET FILENAME 'filename' ... SET MODE [ BROWSE | EDIT ] MAP[/v] [ DBA | FILENAME | FILE | BLOCK ] DUMP[/v] [ DBA | FILENAME | FILE | BLOCK | OFFSET | COUNT ] PRINT[/x|d|u|o|c] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ] EXAMINE[/Nuf] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ] FIND[/x|d|u|o|c] numeric/character string [ TOP | CURR ] COPY [ DBA | FILE | FILENAME | BLOCK ] TO [ DBA | FILE | FILENAME | BLOCK ] MODIFY[/x|d|u|o|c] numeric/character string [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ] ASSIGN[/x|d|u|o] target spec=source spec SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ] PUSH [ DBA | FILE | FILENAME | BLOCK | OFFSET ] POP [ALL] REVERT [ DBA | FILE | FILENAME | BLOCK ] UNDO HELP [ <bbed command> | ALL ] VERIFY [ DBA | FILE | FILENAME | BLOCK ] CORRUPT [ DBA | FILE | FILENAME | BLOCK ]

BBED puo' essere lanciato con un parfile in cui inserire parametri fissi:

blocksize=8192
listfile=/u01/app/oracle/oracle/product/10.2.0/demo/rdbms/lib/listfile.txt
mode=browse

Nella modalita' BROWSE BBED va in sola lettura ed e' utile per studiare il formato dati di Oracle. I comandi piu' utilizzati sono DUMP, PRINT, MAP e FIND. Nella modalita' EDIT BBED scrive sui datafile e puo' corrompere facilmente i dati, in questo caso puo' essere utile per studiare gli strumenti di recovery ed il DB Verify. I comandi utilizzati per modificare i dati sono MODIFY, COPY, CORRUPT: tutti da utilizzare con cautela.

Con BBED si possono fare cose altrimenti impossibili: ripristinare righe cancellate, modificare gli SCN dei blocchi, copiare blocchi di dati, ... e distruggere irrimediabilmente una base dati.

Vediamo ora la pratica!
Una conoscenza profonda delle strutture dati Oracle e' fondamentale per riuscire ad utilizzare BBED. Per ottenere i riferimenti ai blocchi da controllare e' utile la stored procedure ROWID_INFO. Ad esempio:

$ sqlplus system/QuestaLaSo@MyDB SQL> select rowid, users#, name, password from SYS.USER$; ROWID USER# NAME PASSWORD ------------------ ---------- ------------------------------ ------------------------------ AAAAAKAABAAAABaAAB 0 SYS 54D927168F1BB3C6 AAAAAKAABAAAABaAAG 5 SYSTEM C665474974ED9744 ... SET SERVEROUTPUT ON declare rowid_type NUMBER; object_number NUMBER; relative_fno NUMBER; block_number NUMBER; row_number NUMBER; begin DBMS_ROWID.ROWID_INFO('AAAAAKAABAAAABaAAG', rowid_type, object_number, relative_fno, block_number, row_number, 'SMALLFILE'); DBMS_OUTPUT.PUT_LINE('RowID: '|| 'AAAAAKAABAAAABaAAG'); DBMS_OUTPUT.PUT_LINE('Type: '|| rowid_type); DBMS_OUTPUT.PUT_LINE('Object#: '|| rowid_type); DBMS_OUTPUT.PUT_LINE('Rel_FNO: '|| relative_fno); DBMS_OUTPUT.PUT_LINE('Block#: '|| block_number); DBMS_OUTPUT.PUT_LINE('Row#: '|| row_number); end; / RowID: AAAAAKAABAAAABaAAG Type: 1 Object#: 1 Rel_FNO: 1 Block#: 90 Row#: 6

Ora che sappiamo cosa cercare e cosa sostituire lavoriamo sui datafile di un altro database con BBED:

$ ./bbed ... BBED> set dba 1,90 BBED> print kdbr sb2 kdbr[0] @118 8074 sb2 kdbr[1] @120 8009 sb2 kdbr[2] @122 7899 sb2 kdbr[3] @124 7810 sb2 kdbr[4] @126 7720 sb2 kdbr[5] @128 7629 sb2 kdbr[6] @130 7543 ... BBED> p *kdbr[6] rowdata[4498] ------------- ub1 rowdata[4498] @7721 0xac BBED> dump /v dba 1,90 offset 7721 ... BBED> find /c SYSTEM File: /u01/data/systemDB007.dbf (1) Block: 90 Offsets: 3267 to 3778 Dba:0x0040005a ------------------------------------------------------------------------ 53595354 454d02c1 02104330 xxxxxxxx xxxxxxxx 45443935 34340180 02c10407 786d0a02 0a0e3307 786d0a02 0a0e33ff ff0180ff 02c102ff ff018001 80164445 4641554c 545f434f 4e53554d 45525f47 524f5550 ff01806c 00130506 53595354 454d02c1 02104330 36353437 34393734 45443935 34340180 02c10407 786d0a02 0a0e3307 786d0a02 0a0e33ff ff0180ff 02c102ff ff018002 c1021644 45464155 ... BBED> dump /v File: /u01/data/systemDB007.dbf (1) Block: 90 Offsets: 3267 to 3778 Dba:0x0040005a ------------------------------------------------------- 53595354 454d02c1 02104330 xxxxxxxx l SYSTEM.?..XXXXXX xxxxxxxx 45443935 34340180 02c10407 l XXXXXXXXXX...?.. 786d0a02 0a0e3307 786d0a02 0a0e33ff l xm....3.xm....3? ff0180ff 02c102ff ff018001 80164445 l ?..?.?.??.....DE ... BBED> set offset 3277 BBED> modify /c C665474974ED9744 $ sqlplus system/QuestaLaSo@DB007 Connected

Come si capisce chiaramente il comando PRINT riconosce le strutture dei blocchi Oracle ed accede ai sui puntatori. E' cosi' facile trovare le righe all'interno di un blocco (notate che sono scritte dal basso all'alto) ed puntare esattamente al byte dove si vogliono modificare i dati...

Other

Vi sono una serie di programmi alternativi a DUL realizzati da terze parti. Tipicamente viene fornito il servizio di recupero dati o una licenza one-shot per un solo database e per un periodo limitato di tempo.

Naturalmente non vi e' nessuna garanzia che funzionino... ma nessuno puo' onestamente fornirla, neanche DUL.
Utilizzando programmi non forniti da Oracle vanno tenuti in conto tutti gli aspetti relativi alla riservatezza dei dati ed al Copyright...

ODU

ODU (Oracle Database Unloader) e' un'alternativa al DUL distribuito da OracleODU. I suoi punti di forza sono: supporta l'ASM, e' disponibile una versione trial che consente di verificarne il funzionamento, i file di configurazione sono piu' semplici di quelli del DUL. ODU e' scritto in C e genera file caricabili con SQL*Loader: e' molto veloce.

Nel file control.txt vanno indicati i datafile, sul file asmdisk.txt vanno indicati gli eventuali dischi ASM. Il file config.txt contiene la configurazione, generalmente l'unica modifica necessaria e' quella del PATH su cui scaricare i dati. Il file oductl.dat e' in formato binario e viene fornito da OracleODU quando viene acquistata la licenza.

$ ./odu ... ODU> unload dict ... ODU> unload user scott
ODU salva il contenuti del data dictionary come file di testo (eg. user.odu, table.odu, lob.odu, ...). Questi dati servono come riferimento per i passi di recupero successivi. Per ogni tabella recuperata ODU genera 3 file: .sql con la DDL di creazione della tabella, .txt con i dati, .ctl con lo comando SQL*Loader.
Maggiori informazioni in questa paginetta.

jDUL/DUDE

jDUL/DUDE (Database Unloading by Data Extraction) e' una nota versione Java di DUL.

Per evitare utilizzi non autorizzati e' necessario inviare i dati di dettaglio della base dati da recuperare (probe), quindi si ottiene una copia del programma in grado di operare solo sul sistema e sulla base dati analizzata.
Il probe della base dati si effettua configurando il file DUDE_PROBE.cfg con i datafile da estrarre e lanciando il programma DUDE_PROBE.jar. Il file ottenuto puo' essere inviato dal sito ORA-600 oppure via email e si ottiene in risposta il programma definitivo (DUDE.tar). Scaricato il programma per eseguirlo basta lanciare: java DUDE.

AUL(MyDUL)

AUL(MyDUL) e' un'altra recente alternativa a DUL. AUL e' disponibile sulle principali piattaforme e, senza licenza, estrae 1GB dal tablespace di SYSTEM e 512MB dagli altri tablespace. Forse e' un poco piu' complesso da utilizzare degli altri tool... ma forse anche meno costoso!

DBRECOVER

DBRECOVER, chiamato in precedenza PRM-DUL e' un'altra versione in java del programma che e' anche disponibile su Sourceforge [NdA ma la versione pubblica e' limitata a 10.000 righe estratte].

Note

Il DUL e' tenuto ben nascosto... anche nei siti di supporto Oracle. Se ne trovano tracce in: COLD RMAN backup fails: Ora-19602 even after SHUTDOWN IMMEDIATE and STARTUP MOUNT (Doc ID 373828.1), ...

Glider DUL e' stato scritto da Bernard van Duijnen per Oracle. DUDE e' stato scritto da Kurt Van Meerbeeck di ORA-600. ODU e' stato scritto da Xiong Jun ed e' supportato da Cui Hua. I miei complimenti a tutti loro!

Un documento introduttivo alle problematiche di recupero dei dati su Oracle e' Attivita' di recovery sull'RDBMS Oracle.

Altri documenti di questo tipo su questa pagina Hack


Titolo: DUL. Life is DUL without need of it
Livello: Hack (5/5)
Data: 14 Febbraio 2014
Versione: 1.0.1 - 14 Febbraio 2015
Autore: mail [AT] meo.bogliolo.name