Analyser et nettoyer les orphelins de la base de données

  • De le 08 octobre 2015
  • Difficulté : 1/4

Analyser et nettoyer les orphelins de la base de données La base de données de Magento peut parfois s'alourdir de données obsolètes : lignes orphelines dans certaines tables. Magento utilisant intelligemment les clés étrangères, il est facile de récupérer ces lignes afin de les supprimer.

Pour toutes les tables de la base de données, Magento utilise les clés étrangères pour lier les données. Par exemple :

Foreign Key Reference
catalog_eav_attribute : attribute_id eav_attribute : attribute_id
salesrule_product_attribute : website_id core_website : website_id

Lors de la création de la table cela ce traduit par :

SHOW CREATE TABLE catalog_eav_attribute

CONSTRAINT `FK_NAME` FOREIGN KEY (`attribute_id`) REFERENCES `eav_attribute` (`attribute_id`) ON DELETE CASCADE ON UPDATE CASCADE

ON DELETE CASCADE ON UPDATE CASCADE permet de spécifier à MySQL que la suppression de l'attribut dans la table eav_attribute entraînera la suppression automatique des lignes de toutes les tables où l'attribut est liée par une contrainte.

Il arrive cependant que certaines lignes restent définitivement orphelines : une entrée liée à une référence inexistante.

Projet

Le projet est accessible via github :

Usage

Shell

sh check.sh -u username -h host -d database

Les droits en lecture sur la table information_schema doivent être attribués à l'utilisateur.

Résultat

Un fichier result.txt est alors créé. Il contient l'ensemble des éléments orphelins, par exemple :

result.txt

attribute_id 79 exists in catalog_eav_attribute but not exists for attribute_id in eav_attribute
store_id 3 exists in catalogsearch_query but not exists for store_id in core_store
website_id 3 exists in salesrule_product_attribute but not exists for website_id in core_website
wishlist_item_id 1 exists in wishlist_item_option but not exists for wishlist_item_id in wishlist_item

Il convient ensuite de prendre les mesures qui s'imposent.

Attention : dans certains cas il n'est pas nécessaire de supprimer les données.

Par exemple la table sales_flat_order_item contient une clé étrangère vers catalog_product_entity. Si le produit a été supprimé, il ne faut surtout pas supprimer l'entrée des produits commandés.

commentaires

Commentez cet article : Analyser et nettoyer les orphelins de la base de données