Vous êtes sur la page 1sur 4

Diagnostiquer et Rparer une base endommage

dimanche 7 avril 2002, par Collectif, Philippe Makowski

[1]De nombreux cas de bases endommages peuvent tre rsolus en


utilisant gfix (alice) et gbak (burp). Cependant, dans certains cas rares,
ces outils ne suffisent pas. Si vous essayez de rparer une base avec la
mthode dcrite ici et que cela ne fonctionne pas, vous pouvez contacter
IbPhoenix en envoyant un email preeves@ibphoenix.com.

La mthode

1. Dfinir les deux variables suivantes, pour vous faciliter la vie, comme cela vous naurez pas
retaper le nom utilisateur et le mot de passe chaque commande lance.

SET ISC_USER=SYSDBA

SET ISC_PASSWORD=masterkey

2. Travaillez toujours sur une copie de la base, s la base en production. Utilisez le systme
dexploitation pour faire cette copie. Pour cela, vous devez avoir un accs exclusif la base.

copy employee.gdb database.gdb

3. Vrifiez maintenant si la base est corrompue. Vous devez avoir un accs exclusif la base,
mais comme vous travaillez avec une copie, ce nest pas un problme :)

gfix -v -full database.gdb

4. Si la commande prcdente vous indique qil y a un problme avec la base, vous devez la
corriger.

gfix -mend -full -ignore database.gdb

5. Vrifiez maintenant si correction a bien t effectue.

gfix -v -full database.gdb

6. Si vous trouvez encore des erreurs, vous devez faire une sauvegarde / restauration. La
commande de sauvegarde doit tre la suivante :

gbak -backup -v -ignore database.gdb database.gbk

7. Cependant, si gbak ne fonctionne pas du fait de donnes primes, utilisez la commande


suivante :

gbak -backup -v -ignore -garbage database.gdb database.gbk

8. Sil le faut, utilisez le paramtre -limbo (ignore les transactions instables) :

gbak -backup -v -ignore -garbage -limbo database.gdb database.gbk

9. Crez maintenant une nouvelle base depuis la sauvegarde :

1
gbak -create -v database.gbk database_new.gdb

10. Si des problmes aparaissent la restauration, essayez les paramtres suivants :

-inactive, si cest des problmes dindex, cela restaure la base, mais nactive aucun index, vous
pourrez tle faire manuellement, un par un.

-one_at_a_time, cela restaure la base table par table, et commit table par table, vous pourrez ainsi
recuprer au moins quelques donnes.

La mthode de secours

Si la mthode ci-dessus ne fonctionne pas, mais que vous accdez encore la base abime, utilisez
QLI pour transfrer les donnes dans une nouvelle base.
1. Crez une base vide.
2. Modifiez le code suivant (get_tables.sql) pour pointer la base abime.

connect database.gdb user 'sysdba' password 'masterkey';

select 'define relation tgt.', rdb$relation_name,

' based on relation src.', rdb$relation_name, ';'

from rdb$relations where rdb$relation_name

not starting with 'RDB$';

commit;

select 'tgt.', rdb$relation_name, ' = src.',

rdb$relation_name, ';'

from rdb$relations where rdb$relation_name

not starting with 'RDB$';

3. Modifiez le fichier de sortie pour quil ressemble quelque chose comme cela :

ready old.gdb as src;

ready new.gdb as tgt;

define relation tgt.COUNTRY

based on relation src.COUNTRY;

define relation tgt.JOB

2
based on relation src.JOB;

define relation tgt.DEPARTMENT

based on relation src.DEPARTMENT;

define relation tgt.EMPLOYEE

based on relation src.EMPLOYEE;

define relation tgt.PROJECT

based on relation src.PROJECT;

define relation tgt.PHONE_LIST

based on relation src.PHONE_LIST;

define relation tgt.EMPLOYEE_PROJECT

based on relation src.EMPLOYEE_PROJECT;

define relation tgt.CUSTOMER

based on relation src.CUSTOMER;

define relation tgt.SALES

based on relation src.SALES;

define relation tgt.PROJ_DEPT_BUDGET

based on relation src.PROJ_DEPT_BUDGET;

define relation tgt.SALARY_HISTORY

based on relation src.SALARY_HISTORY;

tgt.COUNTRY = src.COUNTRY;

tgt.JOB = src.JOB;

tgt.DEPARTMENT = src.DEPARTMENT;

tgt.EMPLOYEE = src.EMPLOYEE;

tgt.PROJECT = src.PROJECT;

tgt.PHONE_LIST = src.PHONE_LIST;

tgt.EMPLOYEE_PROJECT = src.EMPLOYEE_PROJECT;

3
tgt.CUSTOMER = src.CUSTOMER;

tgt.SALES = src.SALES;

tgt.PROJ_DEPT_BUDGET = src.PROJ_DEPT_BUDGET;

tgt.SALARY_HISTORY = src.SALARY_HISTORY;

4. Utilisez lutilitaire QLI pour lancer ce script move.sql.

QLI>@move.sql

Ce que fait gfix

Pour vous permettre de comprendre ce que fait exactement gfix, voici un extrait du code source,
qui explique en dtail ce qui ce passe.

Voir http://www.firebird-fr.eu.org/article.php3?id_article=13

This paper was updated by Paul Beach in September 2000, and is copyright Paul Beach and
IBPhoenix Inc. You may republish it verbatim, including this notation. You may update, correct, or
expand the material, provided that you include a notation that this work was produced by Paul
Beach and IBPhoenix Inc.

[1] texte original en anglais en provenance de IbPhoenix

Vous aimerez peut-être aussi