Developpez.com - Oracle
X

Choisissez d'abord la catégorieensuite la rubrique :


Gestion interne des blocs Oracle grâce à BBED

Date de publication : le 14 Décembre 2006

Par Mohammed Bouayoun
 

L'utilisation de BBED est strictement déconseillée dans une base de production, il ne doit être utilisé que par un expert Oracle.

I. Introduction
II. Installation de bbed
III. Paramétrage de BBED
V. Les commandes de bbed
A. HELP
B. SHOW
C. SET
D. (I)NFO
E. MAP
F. (D)UMP
G. (P)RINT
H. E(X)AMINE
I. (F)IND
J. COPY
K. (M)ODIFY
L. ASSIGN
M. SUM
N. PUSH/POP
O. REVERT
P. UNDO
Q. VERIFY
R. CORRUPT
VI. Quelques Exemples
A. Modification des données
B. Récupération d'une ligne supprimée
VII. Remerciements


I. Introduction

Cet article concerne un outil utilisé par le support oracle : BBED. Son rôle est d'éditer les blocs de données oracle et de comprendre leurs structures. Son utilisation est strictement déconseillée pour un non expert oracle car il peut corrompre votre base de données. De plus, il est protégé par un mot de passe.


II. Installation de bbed

On trouve cet utilitaire sous windows, Unix et Linux dans les versions Oracle 7, 8 et 9i. On peut l'adapter facilement sous Oracle 10g.

Sous Unix et linux le code objet de bbed est déjà installé mais non compilé, pour cela, il faut lancer :
Make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

III. Paramétrage de BBED

Vous trouvez ici, la façon de paramétrer bbed : Animation

Pour utiliser bbed, il faudrait saisir le mot de passe. Pour le trouver, il suffit d'éditer le fichier bbed.exe par un éditeur hexadécimal et chercher le mot password :

Pour accéder à bbed, il faut lancer bbed en renseignant le paramètre parfile, puis saisir le mot de passe.
(Je pense que vous l'aviez trouvé, sinon, bbed n'est pas pour vous)
C:\bbed>bbed parfile=bbed.par
Mot de passe :

BBED: Release 2.0.0.0.0 - Limited Production on Ve Nov 17 16:04:24 2006

(c) Copyright 2000 Oracle Corporation.  All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************
En lançant bbed, on peut ajouter les options suivantes :

BLOCKSIZE : définit la taille du bloc.

MODE : définit le mode à utiliser, edit pour le mode d'édition et browse pour le mode de visualisation.

SILENT : Supprime la sortie standard (Y ou N).

SPOOL : Utilisation du spool (Y ou N)

LISTFILE : Liste des fichiers à éditer.

CMDFILE : Liste des commandes à lancer.

BIFILE : Le nom du fichier d'avant modification. Par défaut c'est bifile.bbd.

LOGFILE : Le nom du fichier log. Par défaut c'est log.bbd

PARFILE : Le fichier paramètre.

Le fichier listfile peut être généré par la commande SQL suivantes :
SQL> select file#||' '||name||' '||bytes from v$datafile;

FILE#||''||NAME||''||BYTES
-----------------------------------------------------------------

1 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\SYSTEM01.DBF 534773760
2 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\UNDOTBS01.DBF 36700160
3 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\SYSAUX01.DBF 272629760
4 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\USERS01.DBF 5242880
5 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\EXAMPLE01.DBF 104857600
6 E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF 31457280

6 ligne(s) sélectionnée(s).
Un exemple du fichier paramètre bbed.par :
blocksize = 8192
listfile=c:\bbed\files.log
mode=browse

V. Les commandes de bbed


A. HELP

La première commande que vous pouvez lancer est : HELP ALL.
BBED> help ALL
SET DBA [ dba | file#, block# ]
SET FILENAME 'filename'
SET FILE file#
SET BLOCK [+/-]block#
SET OFFSET [ [+/-]byte offset | symbol | *symbol ]
SET BLOCKSIZE bytes
SET LIST[FILE] 'filename'
SET WIDTH character_count
SET COUNT bytes_to_display
SET IBASE [ HEX | OCT | DEC ]
SET OBASE [ HEX | OCT | DEC ]
SET MODE  [ BROWSE | EDIT ]
SET SPOOL [ Y | N ]
SHOW [ (SET parameter) | ALL ]
INFO
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 ]
(/Nuf):
N - a number which specifies a repeat count.
u - a letter which specifies a unit size:
  b - b1, ub1 (byte)
  h - b2, ub2 (half-word)
  w - b4, ub4(word)
  r - Oracle table/index row
f - a letter which specifies a display format:
  x - hexadecimal
  d - decimal
  u - unsigned decimal
  o - octal
  c - character (native)
  n - Oracle number
  t - Oracle date
  i - Oracle rowid
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)
(target spec) : [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
(source spec) : [ value | (target spec options) ]
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 ]
Pour afficher l'aide de la commande SET
BBED> HELP SET
SET DBA [ dba | file#, block# ]
SET FILENAME 'filename'
SET FILE file#
SET BLOCK [+/-]block#
SET OFFSET [ [+/-]byte offset | symbol | *symbol ]
SET BLOCKSIZE bytes
SET LIST[FILE] 'filename'
SET WIDTH character_count
SET COUNT bytes_to_display
SET IBASE [ HEX | OCT | DEC ]
SET OBASE [ HEX | OCT | DEC ]
SET MODE  [ BROWSE | EDIT ]
SET SPOOL [ Y | N ]

B. SHOW

La commande SHOW, affiche les paramètres de bbed.
BBED> show
        FILE#           1
        BLOCK#          1
        OFFSET          0
        DBA             0x00400001 (4194305 1,1)
        FILENAME        E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\SYSTEM01.DBF
        BIFILE          bifile.bbd
        LISTFILE        c:/bbed/files.log
        BLOCKSIZE       512
        MODE            Edit
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           512
        LOGFILE         log.bbd
        SPOOL           No
Pour voir seulement la taille du bloc
BBED> SHOW BLOCKSIZE
        BLOCKSIZE       512

C. SET

SET DBA assigne l'adresse du bloc de données.

SET FILENAME assigne le nom de fichier de données.

SET FILE assigne le numéro de fichier de données.

SET BLOCK assigne le numéro de bloc relatif au fichier de données déjà fixé.

SET OFFSET assigne l'offset relatif au bloc déjà fixé.

SET BLOCKSIZE assigne la taille du bloc. La taille du bloc doit être la même taille utilisée pendant la création du fichier de données.

SET LISTFILE assigne le nom de fichier contenant les fichiers de données.

SET WIDTH fixe la taille de l'écran.

SET COUNT fixe le nombre d'octets à afficher dans l'écran par la commande DUMP.

SET IBASE fixe la base à utiliser. Par défaut c'est le décimal.

SET MODE fixe le mode de bbed. BROWSE pour la consultation et EDIT pour l'édition.


D. (I)NFO

La commande INFO, affiche les fichiers de données qui se trouvent dans files.log.
BBED> INFO
 File#  Name                                                        Size(blks)
 -----  ----                                                        ----------
     1  E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\SYSTEM01.DBF            1024000
     2  E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\UNDOTBS01.DBF             71680
     3  E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\SYSAUX01.DBF             491520
     4  E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\USERS01.DBF               10240
     5  E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\EXAMPLE01.DBF            204800
     6  E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF                  204800

E. MAP

La commande map affiche la carte du bloc en cours. Elle peut être combinée avec l'option /v pour avoir plus d'information.

Si la taille du bloc n'est pas bien définie pour le fichier de données en cours, vous aurez le message suivant :
BBED> map
 File: E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 3                                     Dba:0x01800003
------------------------------------------------------------
BBED-00400: invalid blocktype (00)
On aura le même message si c'est le premier bloc, car il contient des informations OS et non pas Oracle.

Par exemple, Le bloc 2 du fichier de données dvp nous donnent :
BBED> map
 File: E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 2                                     Dba:0x01800002
------------------------------------------------------------
 Data File Header

 struct kcvfh, 340 bytes                    @0

 ub4 tailchk                                @8188
Pour avoir encore plus d'informations :
BBED> map /v
 File: E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 2                                     Dba:0x0180000
-----------------------------------------------------------
 Data File Header

 struct kcvfh, 340 bytes                    @0
    struct kcvfhbfh, 20 bytes               @0
    struct kcvfhhdr, 76 bytes               @20
    ub4 kcvfhrdb                            @96
    struct kcvfhcrs, 8 bytes                @100
    ub4 kcvfhcrt                            @108
    ub4 kcvfhrlc                            @112
    struct kcvfhrls, 8 bytes                @116
    ub4 kcvfhbti                            @124
    struct kcvfhbsc, 8 bytes                @128
    ub2 kcvfhbth                            @136
    ub2 kcvfhsta                            @138
    struct kcvfhckp, 36 bytes               @140
    ub4 kcvfhcpc                            @176
    ub4 kcvfhrts                            @180
    ub4 kcvfhccc                            @184
    struct kcvfhbcp, 36 bytes               @188
    ub4 kcvfhbhz                            @224
    struct kcvfhxcd, 16 bytes               @228

 ub4 tailchk                                @8188
On va revenir sur ces structures après.

en lançant de l'aide sur map, on a
BBED> help map
MAP[/v] [ DBA | FILENAME | FILE | BLOCK ]
On peut faire un MAP en mentionnant le dba, le nom du fichier de données, le numéro de fichier de données ou le numéro de bloc.
BBED> map/v dba 6,29
 File: E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 29                                    Dba:0x0180001d
------------------------------------------------------------
 KTB Data Block (Table/Cluster)

 struct kcbh, 20 bytes                      @0
    ub1 type_kcbh                           @0
    ub1 frmt_kcbh                           @1
    ub1 spare1_kcbh                         @2
    ub1 spare2_kcbh                         @3
    ub4 rdba_kcbh                           @4
    ub4 bas_kcbh                            @8
    ub2 wrp_kcbh                            @12
    ub1 seq_kcbh                            @14
    ub1 flg_kcbh                            @15
    ub2 chkval_kcbh                         @16
    ub2 spare3_kcbh                         @18

 struct ktbbh, 72 bytes                     @20
    ub1 ktbbhtyp                            @20
    union ktbbhsid, 4 bytes                 @24
    struct ktbbhcsc, 8 bytes                @28
    b2 ktbbhict                             @36
    ub1 ktbbhflg                            @38
    ub1 ktbbhfsl                            @39
    ub4 ktbbhfnx                            @40
    struct ktbbhitl[2], 48 bytes            @44

 struct kdbh, 14 bytes                      @92
    ub1 kdbhflag                            @92
    b1 kdbhntab                             @93
    b2 kdbhnrow                             @94
    sb2 kdbhfrre                            @96
    sb2 kdbhfsbo                            @98
    sb2 kdbhfseo                            @100
    b2 kdbhavsp                             @102
    b2 kdbhtosp                             @104

 struct kdbt[0], 0 bytes                    @106
    b2 kdbtoffs                             @106
    b2 kdbtnrow                             @108

 sb2 kdbr[0]                                @106

 ub1 freespace[256]                         @106

 ub1 rowdata[7840]                          @362

 ub4 tailchk                                @8188

F. (D)UMP

La commande DUMP décharge le bloc en cours sur votre écran.
BBED> dump
 File: E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 29               Offsets:    0 to  511           Dba:0x0180001d
------------------------------------------------------------------------
 06a20000 1c008001 cd670d00 00000104 96370000 01000000 eacf0000 cd670d00
 00000000 02003200 19008001 09001600 6d010000 b6008000 20013600 00a00000
 42630d00 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00010100 ffff1400 901f7b1f 7b1f0000 0100901f 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 (32 bytes per line)
Une aide sur la commande DUMP, nous donnent
BBED> help dump
DUMP[/v] [ DBA | FILENAME | FILE | BLOCK | OFFSET | COUNT ]
Pour faire une décharge des premiers 128 octets du fichier 6, bloc 29 et l'offset 0 :
BBED> dump /v dba 6,29 offset 0 count 128
 File: E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 29      Offsets:    0 to  127  Dba:0x0180001d
-------------------------------------------------------
 06a20000 1c008001 cd670d00 00000104 l .ó......-g......
 96370000 01000000 eacf0000 cd670d00 l .7......Û¤..-g..
 00000000 02003200 19008001 09001600 l ......2.........
 6d010000 b6008000 20013600 00a00000 l m...Â... .6..á..
 42630d00 00000000 00000000 00000000 l Bc..............
 00000000 00000000 00000000 00000000 l ................
 00000000 00010100 ffff1400 901f7b1f l ........  ....{.
 7b1f0000 0100901f 00000000 00000000 l {...............
 (16 bytes per line)
On peut utiliser la structure de l'entête du bloc pour decoder les 16 octets.


G. (P)RINT

C'est la plus utilisées, elle consiste à afficher la structure de données dans une format brute ou dans une format bien structurée. On peut mentionner les options DBA, Filename, File, Block et/ou Offset.

Comme la commande MAP nous montrent les structures des blocs, la commande PRINT nous donne en détail la structure de ces blocs.
BBED> p
kcbh.type_kcbh
--------------
ub1 type_kcbh                               @0        0x06
Il est possible d'utilise la commande PRINT pour afficher les structures de données individuellement en spécifiant le nom de la structure. Par exemple, pour afficher la structure de l'entête du bloc :
BBED> p kcbh
struct kcbh, 20 bytes                       @0
   ub1 type_kcbh                            @0        0x06
   ub1 frmt_kcbh                            @1        0xa2
   ub1 spare1_kcbh                          @2        0x00
   ub1 spare2_kcbh                          @3        0x00
   ub4 rdba_kcbh                            @4        0x0180001c
   ub4 bas_kcbh                             @8        0x000d67cd
   ub2 wrp_kcbh                             @12       0x0000
   ub1 seq_kcbh                             @14       0x01
   ub1 flg_kcbh                             @15       0x04 (KCBHFCKV)
   ub2 chkval_kcbh                          @16       0x3796
   ub2 spare3_kcbh                          @18       0x0000
On peut trouver le nombre de lignes dans le bloc en affichant la structure kdbh.
BBED> p kdbh
struct kdbh, 14 bytes                       @92
   ub1 kdbhflag                             @92       0x00 (NONE)
   b1 kdbhntab                              @93       0
   b2 kdbhnrow                              @94       0
   sb2 kdbhfrre                             @96       0
   sb2 kdbhfsbo                             @98       0
   sb2 kdbhfseo                             @100      256
   b2 kdbhavsp                              @102      1
   b2 kdbhtosp                              @104     -1
On peut être plus précis en affichant qu'un seul élément de la structure de données.
BBED> p kdbhnrow
b2 kdbhnrow                                 @94       0
BBED> set block 2255
        BLOCK#          2255

BBED> p *kdbr[0]
rowdata[0]
----------
ub1 rowdata[0]                              @106      0x0e
BBED>  d /v dba 6,2245 offset 8159 count 32
 File: E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 2245    Offsets: 8159 to 8190  Dba:0x018008c5
-------------------------------------------------------
 05546573 74323c02 01055465 7374313c l .Test2(...Test1(
 02010a44 6576656c 6f707065 7a01063b l ...Developpez..;

 (16 bytes per line)
BBED>  p *kdbr[0]
freespace[22]
-------------
ub1 freespace[22]                           @128      0x5d

BBED>  d /v dba 6,2245 offset 128 count 32
 File: E:\ORACLE\PRODUCT\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 2245    Offsets:  128 to  159  Dba:0x018008c5
-------------------------------------------------------
 5d1f541f 4b1f421f 00000000 00000000 l ].T.K.B.........
 00000000 00000000 00000000 00000000 l ................

(16 bytes per line)

H. E(X)AMINE

La commande EXAMINE affiche les données d'un bloc depuis une format brute. Comme la commande PRINT, elle ne peut pas interpréter les structures de données, par contre, elle peut être utilisées pour afficher l'information d'une ligne. Si on connaît le type de données de la ligne, on peut facilement retrouver complètement la ligne depuis un bloc.

La commande EXAMINE doit être utilisé avec les switches suivants :

Switch Format
/b b1, ub1 (byte)
/h b2, ub2 (half-word)
/w b4, ub4 (word)
/l b8, ub8 (long)
/r Oracle table/index row
Pour afficher la ligne d'une table
BBED> p *kdbr[3]
rowdata[36]
-----------
ub1 rowdata[36]                             @4044     0x2c

BBED> x /rcnn
rowdata[36]                                 @4044
-----------
flag@4044: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@4045: 0x01
cols@4046:    1

col    0[8] @4047: A26N
Pour afficher plusieurs lignes d'une table, on utilise la commande (ici 3 lignes):
BBED> x /3rcnn

I. (F)IND

La commande FIND est utilisées pour trouver une donnée dans un bloc. On peut chercher une valeur hexadécimal, chaîne de caractères ou numérique. On peut chercher depuis le début du bloc (offset 0) en utilisant le directive TOP, ou depuis la position en cours en utilisant CURR.

On utilise les switches pour déterminer le type de recherche.

Switch Type de données
/x Hexadécimal
/d Décimal
/u Décimal non signé
/o Octal
/c Chaîne de caractères
Pour chercher la chaîne A26S dans le fichier 9 et le bloc 4 :
BBED> set file 9
        FILE#           9

BBED> set block 4
        BLOCK#          4

BBED> set offset 0
        OFFSET          0

BBED> find /c A26S TOP
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\REF.DBF (9)
 Block: 4                Offsets: 4060 to 4095           Dba:0x02400004
------------------------------------------------------------------------
 41323653 20202020 2c010108 41342020 20202020 2c010108 41323920 20202020
 01063b99

 (32 bytes per line)
BBED à trouver la chaîne de caractères dans l'offset 4060. On peut le vérifier par la commande DUMP :
BBED> d /v offset 4060
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\REF.DBF (9)
 Block: 4       Offsets: 4060 to 4095  Dba:0x02400004
-------------------------------------------------------
 41323653 20202020 2c010108 41342020 l A26S    ,...A4
 20202020 2c010108 41323920 20202020 l     ,...A29
 01063b99                            l ..;.

J. COPY

La commande COPY est utilisée pour copier un bloc d'un emplacement à un autre. Par exemple, pour copier le bloc 20 du fichier 5 vers le fichier 4 :
BBED> copy dba 6,20 to dba 5,20

Warning: contents of previous BIFILE will be lost. Proceed? (Y/N)

K. (M)ODIFY

La commande MODIFY est utilisée pour modifier une donnée dans un bloc. On peut utiliser les mêmes switches que la commande FIND.

Par exemple, pour modifier la chaîne de caractères A26S en DVP3 :
BBED> modify /c DVP3 dba 9,4 offset 4060
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\REF.DBF (9)
 Block: 4                Offsets: 4060 to 4095           Dba:0x02400004
------------------------------------------------------------------------
 44565033 20202020 2c010108 41342020 20202020 2c010108 41323920 20202020
 01063b99
Pour vérifier la modification, on utilise la commande DUMP suivante :
BBED> dump /v dba 9,4 offset 4060
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\REF.DBF (9)
 Block: 4       Offsets: 4060 to 4095  Dba:0x02400004
-------------------------------------------------------
 44565033 20202020 2c010108 41342020 l DVP3    ,...A4
 20202020 2c010108 41323920 20202020 l     ,...A29
 01063b99                            l ..;.

L. ASSIGN

La commande ASSIGN, effectue un assignement symbolique. Par exemple la commande suivante, assigne une structure depuis l'offset courant au fichier 9, bloc 2, première entrée ITL.
BBED> assign dba 9,2 ktbbhitl[0]

M. SUM

La commande SUM est utilisée pour vérifier est appliquer le checksum d'un bloc. On peut toujours spécifier dans la commande les options DBA, Filename, File, Block et/ou Offset. S'ils ne sont pas spécifiés, le fichier, le bloc et l'offset en cours qui sont pris en comptes.

BBED> sum dba 6,29
Check value for File 6, Block 29:
current = 0x3696, required = 0x3796
On ajoute l'option apply pour appliquer le checksum.
BBED> sum dba 6,29 apply
Check value for File 6, Block 29:
current = 0x3796, required = 0x3796

N. PUSH/POP

Les commandes PUSH et POP sont utilisées comme moyen de pousser un fichier, un bloc et un offset dans une pile de mémoire et POP fait l'inverse. Cela permet à l'emplacement courant d'être éditer et temporairement sauvegarder tandis qu'un autre emplacement sera examiné et modifié.

warning La pile stocke seulement l'emplacement et non pas le contenu.
Dans cette exemple, on va examiner le fichier 9, bloc 4, offset 4060. L'emplacement sera stocké par la commande PUSH. Après, on se déplace dans le fichier 6, bloc 29 et en retourne par la commande POP dans le fichier 9, bloc 4.
BBED> push dba 9,4
        DBA             0x02400004 (37748740 9,4)
        OFFSET          4060

BBED> set dba 6,29
        DBA             0x0180001d (25165853 6,29)

BBED> pop
        DBA             0x02400004 (37748740 9,4)
        OFFSET          4060
On utilise la commande POP ALL pour supprimer toutes les entrées effectués par PUSH.


O. REVERT

La commande REVERT est utilisé pour restaurer un numéro de fichier, un nom de fichier, un bloc ou le DBA dans leurs états d'origine, c'est à dire, au démarrage de bbed.

Il faut que le mode soit EDIT, sinon :
BBED> revert dba 6,29
BBED-00215: editing not allowed in BROWSE mode
BBED> set mode edit
        MODE            Edit

BBED> revert dba 6,29
No changes to rollback.
BBED> revert dba 6,29
All

P. UNDO

La commande UNDO annule la dernière modification. Ici un exemple d'utilisation de la commande UNDO :
BBED> modify /c DVP3 dba 9,4 offset 4060
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\REF.DBF (9)
 Block: 4                Offsets: 4060 to 4095           Dba:0x02400004
------------------------------------------------------------------------
 44565033 20202020 2c010108 41342020 20202020 2c010108 41323920 20202020
 01063b99

BBED> dump /v dba 9,4 offset 4060
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\REF.DBF (9)
 Block: 4       Offsets: 4060 to 4095  Dba:0x02400004
-------------------------------------------------------
 44565033 20202020 2c010108 41342020 l DVP3    ,...A4
 20202020 2c010108 41323920 20202020 l     ,...A29
 01063b99                            l ..;.

BBED> undo
BBED> modify /x 41323653 filename 'E:\oracle\product\10.2.0\ORADATA\B10R2\REF.DB
F' block 4. offset 4060.
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\REF.DBF (9)
 Block: 4                Offsets: 4060 to 4095           Dba:0x02400004
------------------------------------------------------------------------
 41323653 20202020 2c010108 41342020 20202020 2c010108 41323920 20202020
 01063b99

BBED> dump /v dba 9,4 offset 4060
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\REF.DBF (9)
 Block: 4       Offsets: 4060 to 4095  Dba:0x02400004
-------------------------------------------------------
 41323653 20202020 2c010108 41342020 l A26S    ,...A4
 20202020 2c010108 41323920 20202020 l     ,...A29
 01063b99                            l ..;.

Q. VERIFY

La commande VERIFY est utilisé pour vérifier l'intégrité du bloc de données. Elle effectue la même fonction que l'utilitaire DBVERIFY.
BBED> verify dba 6,29
DBVERIFY - DÚmarrage de vÚrification
FILE = E:\oracle\product\10.2.0\ORADATA\B10R2\DVP.DBF
BLOCK = 28

Le bloc 28 est altéré
***
Corrupt block relative dba: 0x0180001c (file 0, block 28)
Bad header found during verification
Data in bad block -
 type: 6 format: 162 rdba: 0x0180001c
 last change scn: 0x0000.000d67cd seq: 0x1 flg: 0x04
 consistency value in tail: 0x67cd0601
 check value in block header: 0x3796, computed block checksum: 0x0
 spare1: 0x0, spare2: 0x0, spare3: 0x0
***


DBVERIFY - VÚrification terminée

Nombre total de blocs examinés         : 1
Nombre total de blocs traités (données) : 0
Nombre total de blocs en échec   (données) : 0
Nombre total de blocs traités (index): 0
Nombre total de blocs en échec   (index): 0
Nombre total de blocs vides            : 0
Nombre total de blocs marqués endommagés   : 1
Nombre total de blocs remplis           : 0

R. CORRUPT

La commande CORRUPT est utilisé pour marquer un bloc comme corrompu. Par exemple :
BBED> corrupt dba 6, 29
Block marked media corrupt.
idea La commande UNDO n'annule pas une bloc marqué corrompu. C'est la commande REVERT qui le fait.

VI. Quelques Exemples


A. Modification des données

Soit la table T2 de l'utilisateur DVP qui contient les données suivantes
SQL> select * from t2;

NOM
--------------------
Developpez
Cherchons le ROWID de la ligne contenant la chaîne de caractères Developpez
SQL> select rowid from t2;

ROWID
------------------
AAANQYAAGAAAAjGAAA
Pour trouver le numéro de fichier de données et le numéro de bloc contenant la valeur Developpez, on utilise le paquetage DBMS_ROWID.

Le numéro de fichier de donnés est : 6
SQL> select DBMS_ROWID.ROWID_RELATIVE_FNO('AAANQYAAGAAAAjGAAA') from dual;

DBMS_ROWID.ROWID_RELATIVE_FNO('AAANQYAAGAAAAJGAAA')
---------------------------------------------------
                                                  6
Le numéro de bloc est 2246 + 1 = 2247 , car dans BBED il faut toujours ajouter le premier bloc contenant les informations OS
SQL> select DBMS_ROWID.ROWID_BLOCK_NUMBER('AAANQYAAGAAAAjGAAA') from dual;

DBMS_ROWID.ROWID_BLOCK_NUMBER('AAANQYAAGAAAAJGAAA')
---------------------------------------------------
                                               2246
Ici on va modifier le bloc 2247 du fichier de données 6
BBED> set DBA 6,2247
        DBA             0x018008c7 (25168071 6,2247)
On cherche le mot Developpez dans le bloc
BBED> find /c Developpez
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 2247             Offsets: 8178 to 8191           Dba:0x018008c7
------------------------------------------------------------------------
 44657665 6c6f7070 657a0106 68e8

 (32 bytes per line)
On utilise la commande dump pour vérifier le mot recherché, et repérer l'offset exacte des données à modifier.
BBED> dump /v dba 6,2247 offset 8178 count 64
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 2247    Offsets: 8178 to 8191  Dba:0x018008c7
-------------------------------------------------------
 44657665 6c6f7070 657a0106 68e8     l Developpez..hÞ

 (16 bytes per line)
Ici, on va modifier le mot Developpez par le mot MarcLussac, le commutateur /c indique une modification d'une chaîne de caractères.
BBED> modify /c MarcLussac dba 6, 2247 offset 8178
BBED-00215: editing not allowed in BROWSE mode
Il faut être en mode édition pour modifier un bloc de données
BBED> set mode EDIT
        MODE            Edit

BBED> modify /c MarcLussac dba 6, 2247 offset 8178
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) Y
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 2247             Offsets: 8178 to 8191           Dba:0x018008c7
------------------------------------------------------------------------
 4d617263 4c757373 61630106 68e8

 (32 bytes per line)
On vérifie la modification en utilisant la commande dump.
BBED> dump /v dba 6,2247 offset 8178 count 64
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 2247    Offsets: 8178 to 8191  Dba:0x018008c7
-------------------------------------------------------
 4d617263 4c757373 61630106 68e8     l MarcLussac..hÞ

 (16 bytes per line)
Avant qu'Oracle puisse lire le bloc, le checksum du bloc doit être mis à jours. La commande SUM est utilisée pour vérifier et initialiser le checksum du bloc.
BBED> sum dba 6, 2247
Check value for File 6, Block 2247:
current = 0x6409, required = 0x6623

BBED> sum dba 6, 2247 apply
Check value for File 6, Block 2247:
current = 0x6623, required = 0x6623
Sous SQL, on a toujours l'ancien mot.
SQL> select * from dvp.t2;

NOM
--------------------
Developpez
Essayons de voir dans un éditeur hexadécimal ce qui passe

Il faut vider la mémoire cache pour afficher la ligne modifiée.
SQL> alter system flush buffer_cache;

Système modifié.

SQL> select * from t2;

NOM
--------------------
MarcLussac
Ce qui montre qu'on peut modifier des données dans une base fermé et sans avoir un compte Oracle. Il faut donc toujours protéger l'accès à ces fichiers.


B. Récupération d'une ligne supprimée

Dans l'exemple suivant, on va monter comment récupérer une ligne supprimée.

Quand une ligne est supprimée, les données de la ligne ne sont pas écrasées tout de suite. La ligne est simplement marquée comme supprimée et son statut est stocké dans l'entête de ligne (Row Header) qui occupe les premiers octets de chaque ligne.

L'entête de ligne est constitué d'un Indicateur de Ligne (Row Flag), d'un Octet de Verrous (Lock Byte) (entrée ITL) et d'un Compteur de Ligne (Column Count). Le premier octet de l'entête de ligne détient un masque de bit (bitmask) qui contient le statut de la ligne. Ce masque est décodé comme il suit :

Clé de Cluster Membre d'une table Clustrée Entête d'un morceau de ligne Supprimé Morceau de la première donnée Morceau de la dernière donnée 1ere Colonne Dernière colonne
128 64 32 16 8 4 2 1
Les colonnes s'ajustant dans un simple bloc, qui ne sont pas chaînées, ni migrées ou partie d'une table clustrée et ne sont pas supprimées devraient avoir les attributs suivants :

  • Pièce d'un Entête de Ligne
  • Pièce de la Première donnée
  • Pièce de la dernière donnée
Dans ce cas l'Idicateur de Ligne est 32 + 8 + 4 = 44 = 0x2c. On peut voir un échantillon d'une décharge de bloc en lançant la commande :
SQL> alter system dump  datafile 6 block 2247;

SystÞme modifié.
Le resultat de la décharge se trouve dans le répertoire udump.

tl: 17 fb: --H-FL-- lb: 0x0 cc: 1
col 0: [13] 53 68 65 69 6b 59 65 72 62 6f 75 74 69
On insère une nouvelle ligne dans la table T2. On lance un checkpoint pour être sûr que la ligne est bien enregistrée dans le fichier de données.
SQL> insert into t2 values ('SheikYerbouti');

1 ligne créée.

SQL> commit;

Validation effectuée.

SQL> alter system checkpoint;

Système modifié.
On cherche le rowid de la ligne ajoutée, son numéro de fichier et son numéro de bloc.
SQL> select rowid, nom from t2 where nom='SheikYerbouti';

ROWID              NOM
------------------ --------------------
AAANQYAAGAAAAjHAAA SheikYerbouti

SQL> select DBMS_ROWID.ROWID_RELATIVE_FNO('AAANQYAAGAAAAjHAAA') from dual;

DBMS_ROWID.ROWID_RELATIVE_FNO('AAANQYAAGAAAAJHAAA')
---------------------------------------------------
                                                  6

SQL> select DBMS_ROWID.ROWID_BLOCK_NUMBER('AAANQYAAGAAAAjHAAA') from dual;

DBMS_ROWID.ROWID_BLOCK_NUMBER('AAANQYAAGAAAAJHAAA')
---------------------------------------------------
                                               2247
Donc la ligne ajoutée se trouve dans le fichier de données 6 et dans le bloc 2247+1=2248. On fait une recherche avec la commande FIND pour trouver l'offset exacte et on vérifie le contenu du bloc avec la commande DUMP.
BBED> set dba 6, 2248
        DBA             0x018008c8 (25168072 6,2248)

BBED> find /c SheikYerbouti
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 2248             Offsets: 8175 to 8190           Dba:0x018008c8
------------------------------------------------------------------------
 53686569 6b596572 626f7574 69010641

 (32 bytes per line)


BBED> dump /v dba 6,2248 offset 8175 count 64
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 2248    Offsets: 8175 to 8191  Dba:0x018008c8
-------------------------------------------------------
 53686569 6b596572 626f7574 69010641 l SheikYerbouti..A
 b3                                  l ?

 (16 bytes per line)
On supprime la ligne contenant le mot SheikYerbouti et on lance une décharge du bloc contenant cette ligne.
SQL> delete from t2 where nom='SheikYerbouti';

1 ligne supprimée.

SQL> commit;

Validation effectuée.

SQL> alter system dump  datafile 6 block 2247;

Système modifié.
Dans le fichier de décharge on a le resultat suivant :

tl: 2 fb: --HDFL-- lb: 0x2
end_of_block_dump
Donc, l'indicateur de ligne sera égale à 32 + 16 + 8 + 4 = 60 = 0x3c

Maintenant, on va trouver l'offset contenant le mot SheikYerbouti et par la commande DUMP on décharge le bloc.
BBED> set dba 6, 2248
        DBA             0x018008c8 (25168072 6,2248)

BBED> find /c SheikYerbouti TOP
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 2248             Offsets: 8175 to 8191           Dba:0x018008c8
------------------------------------------------------------------------
 53686569 6b596572 626f7574 69010641 b3

 (32 bytes per line)

BBED> dump /v dba 6, 2248 offset 8159
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 2248    Offsets: 8159 to 8191  Dba:0x018008c8
-------------------------------------------------------
 00000000 00000000 00000000 3c02010d l ............(...
 53686569 6b596572 626f7574 690106dc l SheikYerbouti..?
 b8                                  l ©

 (16 bytes per line)
Normalement, notre ligne commence depuis l'offset 8171 = 8175 - 4 (4 octet contient l'entête de ligne).
BBED> dump /v dba 6, 2248 offset 8171
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 2248    Offsets: 8171 to 8191  Dba:0x018008c8
-------------------------------------------------------
 3c02010d 53686569 6b596572 626f7574 l (...SheikYerbout
 690106dc b8                         l i..?©

 (16 bytes per line)
Dans l'offset 8171 on trouve bien la valeur 0x3c

Dans ce qui suit, on modifie l'offset 8171 par la valeur 0x2c et on applique le checksum.
BBED> modify /x 2c offset 8171
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) Y
 File: E:\oracle\product\10.2.0\ORADATA\B10R2\DVP.DBF (6)
 Block: 2248             Offsets: 8171 to 8191           Dba:0x018008c8
------------------------------------------------------------------------
 2c02010d 53686569 6b596572 626f7574 690106dc b8

 (32 bytes per line)

BBED> sum dba 6,2248 apply
Check value for File 6, Block 2248:
current = 0xfae8, required = 0xfae8
On vide le buffer cache et on retrouve bien la ligne supprimée.
SQL> alter system flush buffer_cache;

SystÞme modifiÚ.

SQL> select nom from t2;

NOM
--------------------
MarcLussac
SheikYerbouti

VII. Remerciements

Je tiens à remercier toute l'équipe de Developpez.com pour son aide dans la relecture et l'amélioration du présent tutoriel, en particulier Xo pour la correction de l'orthographe.



Valid XHTML 1.1!Valid CSS!

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
Contacter le responsable de la rubrique Oracle