Vous êtes sur la page 1sur 4

Diagnostiquer et Réparer une base endommagée

dimanche 7 avril 2002, par Collectif, Philippe Makowski

[1]De nombreux cas de bases endommagées peuvent être résolus en utilisant gfix (alice) et gbak (burp). Cependant, dans certains cas rares, ces outils ne suffisent pas. Si vous essayez de réparer une base avec la méthode décrite ici et que cela ne fonctionne pas, vous pouvez contacter IbPhoenix en envoyant un email à preeves@ibphoenix.com.

La méthode

en envoyant un email à preeves@ibphoenix.com . La méthode 1. Définir les deux variables suivantes, pour

1. Définir les deux variables suivantes, pour vous faciliter la vie, comme cela vous n’aurez pas à

retaper le nom utilisateur et le mot de passe à chaque commande lancée.

SET ISC_USER=SYSDBA

SET ISC_PASSWORD=masterkey

lancée. SET ISC_USER=SYSDBA SET ISC_PASSWORD=masterkey 2. Travaillez toujours sur une copie de la base, âs la

2. Travaillez toujours sur une copie de la base, âs la base en production. Utilisez le système

d’exploitation pour faire cette copie. Pour cela, vous devez avoir un accès exclusif à la base.

copy employee.gdb database.gdb

accès exclusif à la base. copy employee.gdb database.gdb 3. Vérifiez maintenant si la base est corrompue.

3. Vérifiez maintenant si la base est corrompue. Vous devez avoir un accès exclusif à la base,

mais comme vous travaillez avec une copie, ce n’est pas un problème :)

gfix -v -full database.gdb

ce n’est pas un problème :) gfix -v -full database.gdb 4. Si la commande précédente vous

4. Si la commande précédente vous indique q’il y a un problème avec la base, vous devez la

corriger.

gfix -mend -full -ignore database.gdb

devez la corriger. gfix -mend -full -ignore database.gdb 5. Vérifiez maintenant si correction a bien été

5. Vérifiez maintenant si correction a bien été effectuée.

gfix -v -full database.gdb

a bien été effectuée. gfix -v -full database.gdb 6. Si vous trouvez encore des erreurs, vous

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

suivante : gbak -backup -v -ignore database.gdb database.gbk 7. Cependant, si gbak ne fonctionne pas du

7. Cependant, si gbak ne fonctionne pas du fait de données périmées, utilisez la commande

suivante :

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

: gbak -backup -v -ignore -garbage database.gdb database.gbk 8. S’il le faut, utilisez le paramètre -limbo

8. S’il le faut, utilisez le paramètre -limbo (ignore les transactions instables) :

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

-backup -v -ignore -garbage -limbo database.gdb database.gbk 9. Créez maintenant une nouvelle base depuis la sauvegarde

9. Créez maintenant une nouvelle base depuis la sauvegarde :

gbak -create -v database.gbk database_new.gdb

10. Si des problèmes aparaissent à la restauration, essayez les paramètres suivants :gbak -create -v database.gbk database_new.gdb - inactive, si c’est des problèmes d’index, cela restaure la base,

-inactive, si c’est des problèmes d’index, cela restaure la base, mais n’active 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 recupérer au moins quelques données.

La méthode de secours

Si la méthode ci-dessus ne fonctionne pas, mais que vous accédez encore à la base abimée, utilisez QLI pour transférer les données dans une nouvelle base.

1. Créez une base vide.

1. Créez une base vide.

2. Modifiez le code suivant (get_tables.sql) pour pointer la base abimée.

2. Modifiez le code suivant (get_tables.sql) pour pointer la base abimée.

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$';

where rdb$relation_name not starting with 'RDB$'; 3. Modifiez le fichier de sortie pour qu’il ressemble à

3. Modifiez le fichier de sortie pour qu’il 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

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;

tgt.CUSTOMER

= src.CUSTOMER;

tgt.SALES

= src.SALES;

tgt.PROJ_DEPT_BUDGET

= src.PROJ_DEPT_BUDGET;

tgt.SALARY_HISTORY

= src.SALARY_HISTORY;

tgt.SALARY_HISTORY = src.SALARY_HISTORY; 4. Utilisez l’utilitaire QLI pour lancer ce script

4. Utilisez l’utilitaire 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 détail 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