Accueil » Conseils & tutoriels sites internet » Tutos Prestashop » Un Prestashop neuf sans perte de données !

Un Prestashop neuf sans perte de données !

Posté dans : Tutos Prestashop 17

Procédure de migration SQL pour Prestashop 1.6

Cette procédure sera utile pour tout e-commerçant utilisant Prestashop et souhaitant mettre son site au propre de manière radicale. Elle peut être utiliser lors d’une mise à niveau importante (de 1.4 à 1.6 par exemple), suite à un hack de votre site et une altération de vos fichiers sources ou bien suite à de mauvaises manipulations.

Il est à noter que cette procédure demeure quasiment entièrement d’actualité lorsque vous souhaitez effectuer une mise à jour de Prestashop 1.6 vers 1.7.

Pré-requis :

  • Effectuer un back-up du FTP et de la base de données,
  • Mettre le site en maintenance,
  • Avoir les accès au serveur FTP et à phpMyAdmin à porté de doigts.
  • Copier et garder à disposition la COOKIE_KEY (présente dans le fichier /config/settings.inc.php)
  •  

#1 Mettre la base de données à jour

Pour commencer, sur le site original, il faut mettre la base de données à jour si elle n’est pas déjà adaptée pour la version 1.6 de PrestaShop. Pour cela, il suffit d’utiliser OneClickUpgrade et de suivre les instructions.

#2 Exporter les tables suivantes :

A l’aide de PhpMyAdmin, nous allons exporter les tables contenant les données qui nous intéressent.

Une fois de plus, vous êtes responsable de votre base de données, cliquez ici pour découvrir comment sauvegarder votre site.

Customers :

  • ps_address
  • ps_customer
  • ps_customer_group
  • ps_customer_message
  • ps_customer_thread
  • ps_message
  • ps_message_readed

CMS :

  • ps_cms
  • ps_cms_block
  • ps_cms_block_lang
  • ps_cms_block_page
  • ps_cms_block_shop
  • ps_cms_category
  • ps_cms_category_lang
  • ps_cms_category_shop
  • ps_cms_lang
  • ps_cms_role
  • ps_cms_role_lang
  • ps_cms_shop

Products :

Les attributs :

  • ps_attribute
  • ps_attribute_group
  • ps_attribute_group_lang
  • ps_attribute_group_shop
  • ps_attribute_impact
  • ps_attribute_lang
  • ps_attribute_shop

Les catégories :

  • ps_category
  • ps_category_group
  • ps_category_lang
  • ps_category_product
  • ps_category_shop

Les produits :

  • ps_product
  • ps_product_attachment
  • ps_product_attribute
  • ps_product_attribute_combination
  • ps_product_attribute_image
  • ps_product_attribute_shop
  • ps_product_carrier
  • ps_product_country_tax
  • ps_product_download
  • ps_product_group_reduction_cache
  • ps_product_lang
  • ps_product_sale
  • ps_product_shop
  • ps_product_supplier
  • ps_product_tag

Le stock :

  • ps_stock
  • ps_stock_available
  • ps_stock_mvt
  • ps_stock_mvt_reason
  • ps_stock_mvt_reason_lang

Orders :

Les paniers :

  • ps_cart
  • ps_cart_cart_rule
  • ps_cart_product
  • ps_cart_rule
  • ps_cart_rule_country
  • ps_cart_rule_lang

Les commandes:

  • ps_orders
  • ps_order_carrier
  • ps_order_cart_rule
  • ps_order_detail
  • ps_order_detail_tax
  • ps_order_history
  • ps_order_invoice
  • ps_order_invoice_payment
  • ps_order_invoice_tax
  • ps_order_payment

Taxes/Carriers :

Les transporteurs :
  • ps_carrier
  • ps_carrier_group
  • ps_carrier_lang
  • ps_carrier_shop
  • ps_carrier_tax_rules_group_shop
  • ps_carrier_zone
  • ps_range_price
  • ps_range_weight

Les taxes :

  • ps_tax
  • ps_tax_lang
  • ps_tax_rule
  • ps_tax_rules_group
  • ps_tax_rules_group_shop

#3 Faire une nouvelle installation de Prestashop 1.6

Après avoir exporté nos tables, il nous faut une nouvelle base de données pour la réception. Pour cela, nous allons installer un Prestashop tout propre après avoir supprimé l’ancien de notre serveur FTP ainsi que l’ancienne base de données (/!\ d’avoir effectué une sauvegarde au préalable). Après avoir installé la nouvelle version de PrestaShop, pensez à :

  • Mettre le site en maintenance,
  • Activer le mode « debug »,
  • Désactiver le cache,
  • Forcer la compilation Smarty.

#4 Supprimer les tables correspondantes aux tables à importer dans la nouvelle base de données

Dans cette nouvelle base de données, nous reprenons la liste des tables que nous avons exportées et nous les supprimons. Cela nous permet ensuite de pouvoir importer nos tables originales tranquillement.

Voici donc la requête SQL à envoyer (attention, celle-ci est irréversible)

DROP TABLE IF EXISTS ps_address;
DROP TABLE IF EXISTS ps_attribute;
DROP TABLE IF EXISTS ps_attribute_group;
DROP TABLE IF EXISTS ps_attribute_group_lang;
DROP TABLE IF EXISTS ps_attribute_group_shop;
DROP TABLE IF EXISTS ps_attribute_impact;
DROP TABLE IF EXISTS ps_attribute_lang;
DROP TABLE IF EXISTS ps_attribute_shop;
DROP TABLE IF EXISTS ps_carrier;
DROP TABLE IF EXISTS ps_carrier_group;
DROP TABLE IF EXISTS ps_carrier_lang;
DROP TABLE IF EXISTS ps_carrier_shop;
DROP TABLE IF EXISTS ps_carrier_tax_rules_group_shop;
DROP TABLE IF EXISTS ps_carrier_zone;
DROP TABLE IF EXISTS ps_cart;
DROP TABLE IF EXISTS ps_cart_cart_rule;
DROP TABLE IF EXISTS ps_cart_product;
DROP TABLE IF EXISTS ps_cart_rule;
DROP TABLE IF EXISTS ps_cart_rule_country;
DROP TABLE IF EXISTS ps_cart_rule_lang;
DROP TABLE IF EXISTS ps_cart_rule_product_rule;
DROP TABLE IF EXISTS ps_cart_rule_product_rule_group;
DROP TABLE IF EXISTS ps_cart_rule_product_rule_value;
DROP TABLE IF EXISTS ps_cart_rule_shop;
DROP TABLE IF EXISTS ps_category;
DROP TABLE IF EXISTS ps_category_group;
DROP TABLE IF EXISTS ps_category_lang;
DROP TABLE IF EXISTS ps_category_product;
DROP TABLE IF EXISTS ps_category_shop;
DROP TABLE IF EXISTS ps_customer;
DROP TABLE IF EXISTS ps_customer_group;
DROP TABLE IF EXISTS ps_customer_message;
DROP TABLE IF EXISTS ps_customer_thread;
DROP TABLE IF EXISTS ps_manufacturer;
DROP TABLE IF EXISTS ps_manufacturer_lang;
DROP TABLE IF EXISTS ps_manufacturer_shop;
DROP TABLE IF EXISTS ps_message;
DROP TABLE IF EXISTS ps_message_readed;
DROP TABLE IF EXISTS ps_order_carrier;
DROP TABLE IF EXISTS ps_order_cart_rule;
DROP TABLE IF EXISTS ps_order_detail;
DROP TABLE IF EXISTS ps_order_detail_tax;
DROP TABLE IF EXISTS ps_order_history;
DROP TABLE IF EXISTS ps_order_invoice;
DROP TABLE IF EXISTS ps_order_invoice_payment;
DROP TABLE IF EXISTS ps_order_invoice_tax;
DROP TABLE IF EXISTS ps_order_payment;
DROP TABLE IF EXISTS ps_orders;
DROP TABLE IF EXISTS ps_product;
DROP TABLE IF EXISTS ps_product_attachment;
DROP TABLE IF EXISTS ps_product_attribute;
DROP TABLE IF EXISTS ps_product_attribute_combination;
DROP TABLE IF EXISTS ps_product_attribute_image;
DROP TABLE IF EXISTS ps_product_attribute_shop;
DROP TABLE IF EXISTS ps_product_carrier;
DROP TABLE IF EXISTS ps_product_country_tax;
DROP TABLE IF EXISTS ps_product_download;
DROP TABLE IF EXISTS ps_product_group_reduction_cache;
DROP TABLE IF EXISTS ps_product_lang;
DROP TABLE IF EXISTS ps_product_sale;
DROP TABLE IF EXISTS ps_product_shop;
DROP TABLE IF EXISTS ps_product_supplier;
DROP TABLE IF EXISTS ps_product_tag;
DROP TABLE IF EXISTS ps_range_price;
DROP TABLE IF EXISTS ps_range_weight;
DROP TABLE IF EXISTS ps_stock;
DROP TABLE IF EXISTS ps_stock_available;
DROP TABLE IF EXISTS ps_stock_mvt;
DROP TABLE IF EXISTS ps_stock_mvt_reason;
DROP TABLE IF EXISTS ps_stock_mvt_reason_lang;
DROP TABLE IF EXISTS ps_supplier;
DROP TABLE IF EXISTS ps_supplier_lang;
DROP TABLE IF EXISTS ps_supplier_shop;
DROP TABLE IF EXISTS ps_tax;
DROP TABLE IF EXISTS ps_tax_lang;
DROP TABLE IF EXISTS ps_tax_rule;
DROP TABLE IF EXISTS ps_tax_rules_group;
DROP TABLE IF EXISTS ps_tax_rules_group_shop;

Attention : toute suppression est définitive !

#5 Importer les tables

Effectuer l’import des tables d’origine dans la nouvelle base de données.

Si vous avez changé le préfixe des tables, vous pouvez utiliser ces requêtes SQL :

ALTER TABLE ps_address RENAME newprefix_address; 
ALTER TABLE ps_attribute RENAME newprefix_attribute; 
ALTER TABLE ps_attribute_group RENAME newprefix_attribute_group; 
ALTER TABLE ps_attribute_group_lang RENAME newprefix_attribute_group_lang; 
ALTER TABLE ps_attribute_group_shop RENAME newprefix_attribute_group_shop; 
ALTER TABLE ps_attribute_impact RENAME newprefix_attribute_impact; 
ALTER TABLE ps_attribute_lang RENAME newprefix_attribute_lang; 
ALTER TABLE ps_attribute_shop RENAME newprefix_attribute_shop; 
ALTER TABLE ps_carrier RENAME newprefix_carrier; 
ALTER TABLE ps_carrier_group RENAME newprefix_carrier_group; 
ALTER TABLE ps_carrier_lang RENAME newprefix_carrier_lang; 
ALTER TABLE ps_carrier_shop RENAME newprefix_carrier_shop; 
ALTER TABLE ps_carrier_tax_rules_group_shop RENAME newprefix_carrier_tax_rules_group_shop; 
ALTER TABLE ps_carrier_zone RENAME newprefix_carrier_zone; 
ALTER TABLE ps_cart RENAME newprefix_cart; 
ALTER TABLE ps_cart_cart_rule RENAME newprefix_cart_cart_rule; 
ALTER TABLE ps_cart_product RENAME newprefix_cart_product; 
ALTER TABLE ps_cart_rule RENAME newprefix_cart_rule; 
ALTER TABLE ps_cart_rule_country RENAME newprefix_cart_rule_country; 
ALTER TABLE ps_cart_rule_lang RENAME newprefix_cart_rule_lang; 
ALTER TABLE ps_cart_rule_product_rule RENAME newprefix_cart_rule_product_rule; 
ALTER TABLE ps_cart_rule_product_rule_group RENAME newprefix_cart_rule_product_rule_group; 
ALTER TABLE ps_cart_rule_product_rule_value RENAME newprefix_cart_rule_product_rule_value; 
ALTER TABLE ps_cart_rule_shop RENAME newprefix_cart_rule_shop; 
ALTER TABLE ps_category RENAME newprefix_category; 
ALTER TABLE ps_category_group RENAME newprefix_category_group; 
ALTER TABLE ps_category_lang RENAME newprefix_category_lang; 
ALTER TABLE ps_category_product RENAME newprefix_category_product; 
ALTER TABLE ps_category_shop RENAME newprefix_category_shop; 
ALTER TABLE ps_customer RENAME newprefix_customer; 
ALTER TABLE ps_customer_group RENAME newprefix_customer_group; 
ALTER TABLE ps_customer_message RENAME newprefix_customer_message; 
ALTER TABLE ps_customer_thread RENAME newprefix_customer_thread; 
ALTER TABLE ps_manufacturer RENAME newprefix_manufacturer; 
ALTER TABLE ps_manufacturer_lang RENAME newprefix_manufacturer_lang; 
ALTER TABLE ps_manufacturer_shop RENAME newprefix_manufacturer_shop; 
ALTER TABLE ps_message RENAME newprefix_message; 
ALTER TABLE ps_message_readed RENAME newprefix_message_readed; 
ALTER TABLE ps_order_carrier RENAME newprefix_order_carrier; 
ALTER TABLE ps_order_cart_rule RENAME newprefix_order_cart_rule; 
ALTER TABLE ps_order_detail RENAME newprefix_order_detail; 
ALTER TABLE ps_order_detail_tax RENAME newprefix_order_detail_tax; 
ALTER TABLE ps_order_history RENAME newprefix_order_history; 
ALTER TABLE ps_order_invoice RENAME newprefix_order_invoice; 
ALTER TABLE ps_order_invoice_payment RENAME newprefix_order_invoice_payment; 
ALTER TABLE ps_order_invoice_tax RENAME newprefix_order_invoice_tax; 
ALTER TABLE ps_order_payment RENAME newprefix_order_payment; 
ALTER TABLE ps_orders RENAME newprefix_orders; 
ALTER TABLE ps_product RENAME newprefix_product; 
ALTER TABLE ps_product_attachment RENAME newprefix_product_attachment; 
ALTER TABLE ps_product_attribute RENAME newprefix_product_attribute; 
ALTER TABLE ps_product_attribute_combination RENAME newprefix_product_attribute_combination; 
ALTER TABLE ps_product_attribute_image RENAME newprefix_product_attribute_image; 
ALTER TABLE ps_product_attribute_shop RENAME newprefix_product_attribute_shop; 
ALTER TABLE ps_product_carrier RENAME newprefix_product_carrier; 
ALTER TABLE ps_product_country_tax RENAME newprefix_product_country_tax; 
ALTER TABLE ps_product_download RENAME newprefix_product_download; 
ALTER TABLE ps_product_group_reduction_cache RENAME newprefix_product_group_reduction_cache; 
ALTER TABLE ps_product_lang RENAME newprefix_product_lang; 
ALTER TABLE ps_product_sale RENAME newprefix_product_sale; 
ALTER TABLE ps_product_shop RENAME newprefix_product_shop; 
ALTER TABLE ps_product_supplier RENAME newprefix_product_supplier; 
ALTER TABLE ps_product_tag RENAME newprefix_product_tag; 
ALTER TABLE ps_range_price RENAME newprefix_range_price; 
ALTER TABLE ps_range_weight RENAME newprefix_range_weight; 
ALTER TABLE ps_stock RENAME newprefix_stock; 
ALTER TABLE ps_stock_available RENAME newprefix_stock_available; 
ALTER TABLE ps_stock_mvt RENAME newprefix_stock_mvt; 
ALTER TABLE ps_stock_mvt_reason RENAME newprefix_stock_mvt_reason; 
ALTER TABLE ps_stock_mvt_reason_lang RENAME newprefix_stock_mvt_reason_lang; 
ALTER TABLE ps_supplier RENAME newprefix_supplier; 
ALTER TABLE ps_supplier_lang RENAME newprefix_supplier_lang; 
ALTER TABLE ps_supplier_shop RENAME newprefix_supplier_shop; 
ALTER TABLE ps_tax RENAME newprefix_tax; 
ALTER TABLE ps_tax_lang RENAME newprefix_tax_lang; 
ALTER TABLE ps_tax_rule RENAME newprefix_tax_rule; 
ALTER TABLE ps_tax_rules_group RENAME newprefix_tax_rules_group; 
ALTER TABLE ps_tax_rules_group_shop RENAME newprefix_tax_rules_group_shop; 

 

#6 Transférer la COOKIE_KEY sur le nouveau site

Dans le fichier config/settings.inc.php de notre site original se trouve une constante appelée COOKIE_KEY. Nous allons copier celle-ci et l’insérer dans le fichier config/settings.inc.php à la place de la nouvelle clé.

Cela permet à Prestashop de comparer correctement les mots de passe des clients qui ont été cryptés en MD5 avec la COOKIE_KEY de notre site original.

NB : Cette manipulation rend notre compte administrateur inutilisable car ayant été crypté avec une nouvelle clé (celle de la nouvelle installation), notre mot de passe est maintenant en erreur. Pour corriger cela, il suffit de nous rendre sur la table ps_employee via phpMyAdmin, d’éditer l’entrée de notre compte, de copier la COOKIE_KEY dans le champ « password » et de la faire suivre directement avec notre nouveau mot de passe. On enregistre et nous avons de nouveau accès à l’administration de notre site.

Vous pouvez retrouver un tutoriel sur cette étape en cliquant ici !

#7 Importer le dossier img/

Pour pouvoir afficher les images que nous avions sur notre site d’origine, il nous suffit de copier la totalité du dossier img/ sur la nouvelle installation. Il y a déjà un dossier de ce nom. Nous pouvons le renomer ou bien le compresser afin de l’avoir à disposition (ça peut servir).

#8 Vérification du bon fonctionnement

Nous pouvons maintenant tester si le site fonctionne correctement. Nous allons essayer de créer un compte, de passer une commande, de nous connecter avec un ancien compte pour vérifier que la COOKIE_KEY est bien en place. Nous allons aussi vérifier le bon fonctionnement du Back-Office. Est-ce que nous voyons bien les anciennes commandes et tout les produits ?

Un problème que j’ai rencontré lors de cette procédure est un décalage entre l’ID de la catégorie principale (home) et l’ID de cette même catégorie sur la nouvelle installation. Le message d’erreur était « Root category must be an integer value ». La solution était alors de corriger l’ID de la catégorie principale dans la table « ps_shop ». Elle est à « 2 » sur les nouvelles installations de Prestashop mais dans notre cas (nous sommes passé de PS 1.4 à PS 1.6) l’ID de la catégorie « home » était égale à « 1 ».

#9 Enjoy !

Il ne reste plus qu’à désactiver le mode maintenance ainsi que le mode « debug » et à reprendre la production là où elle avait été laissée.

J’espère que ce tutoriel vous aura été utile. Si vous souhaitez que nous nous occupions de votre mise à jour, contactez-nous !

Imprimer Imprimer

17 Responses

  1. Fil
    | Répondre

    Bonjour,

    Bon tuto, cependant, il manque les tables fournisseur, fabriquant ? Si on utilise un module synchronisation avec un fournisseur?

    Merci

    • Cyril CHALAMON
      | Répondre

      En effet, le choix des tables dépend de l’utilisation que l’on fait des données à récupérer. Attention au passage sur la version 1.7, il demeure préférable de réaliser un ALTER TABLE avant réimport des données

  2. mike
    | Répondre

    super tuto !
    ton fonctionne sauf l’import des produits
    comment faire please

    • Cyril CHALAMON
      | Répondre

      Les produits sont très lourds, et il y a des modifications selon les versions de Prestashop (je pense à la 1.7 notamment). Avez-vous des messages d’erreur qui s’affichent suite à la migration ?

      • mike
        | Répondre

        non aucun message d’erreur
        mais je migre de la V7.1 a la V7.3.3
        dans ma basse de donnée product tous mes produits apparaissent mais dans le back office non aucun

        • Cyril CHALAMON
          | Répondre

          Hello, et navré pour le délai de réponse
          Le cache a-t-il été intégralement vidé ? Il faudrait également vérifier la liste des tables, des fois qu’une ait été omise par mégarde (comme product_shop par exemple). Je ne doute pas un seul instant que vous avez vérifié le préfixe des tables, puisque vous semblez avoir suivi avec brio ce tutoriel 🙂

  3. mike
    | Répondre

    non aucun message d’erreur
    et dans mon back office aucun produits
    mais parcontre dans la base de donnée les produits apparaissent bien dans les table reference prix etc…

  4. Thibault
    | Répondre

    Bonjour,
    si je puis me permettre il manque les pages cms !
    Cordialement

    • Cyril CHALAMON
      | Répondre

      Haha bien vu, comme quoi il faut se permettre !
      Je les ajoute à la liste. Merci 🙂

  5. mike
    | Répondre

    bonjours cyril , en cherchant a droite a gauche g pu comprende qu’il y avait des diffrence de structures de tables entre la 1.6 et la 1.7 g trouver ce bout de requet sql mais ca ne marche pas ou mieux va vaire un tour par la :

    https://www.prestashop.com/forums/topic/636877-almost-complete-tutorial-how-to-migrate-data-products-customers-orders-from-prestashop-16-to-prestashop-17-version/

    help me please

  6. mike
    | Répondre

    Merci cyril,
    mais j’av vu deja ce post qui ne m’a pas tres convaincue en voyant les reponse il est vrai que je ne l’ai pas essayé
    je v faire un test et je tiens au courant merci pour ta reponse 😉

  7. Vincent
    | Répondre

    Bonjour et un grand merci de partager votre savoir dans vos articles.
    J’ai utilisé pour une migration 1.6 –> 1.7 la suppresion des datas à travers la requête que vous fournissez, et j’utilise le module migrationPro qui fonctionne plutôt bien. Mais en nettoyant la bdd avec cette requête, les enregistrements (produits, etc.) ne s’affiche pas dans le BO. Auriez-vous une idée ou un conseil s’il vous plait ?
    Merci beaucoup de votre aide.

    • Cyril CHALAMON
      | Répondre

      Bonjour,
      Pour nettoyer la base de données, vous avez à disposition le module PS Cleaner qui fait très bien le job. Une fois les données nettoyées, normalement le module Migration Pro s’occupe très bien des données à réimporter, la database étant désormais « clean »

      • Vincent g
        | Répondre

        Encore merci.
        Parlons-nous bien sur ce module : https://github.com/PrestaShop/pscleaner s’il vous plait ?

        • Cyril CHALAMON
          | Répondre

          Oui c’est bien celui-ci, mais vous devriez pouvoir le récupérer depuis votre onglet de modules sur Prestashop (très probablement l’onglet affichant les modules de Prestashop Addons)

  8. Vincent g
    | Répondre

    Merci énormément pour votre conseil, je commence à désespérer.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.