Gestion interne des blocs Oracle grâce à BBEDDate 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):
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é.
|
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. |
|
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.
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.
|