Carnet Wiki

Passage de SQLite à MySQL (et réciproque)

Version 11 — Avril 2018 — Nicolas Hoizey

Cette page explique la meilleure méthode de passage de SQLite à MySQL en l’état de SPIP 3.0.7 - Merci de na pas la modifier sans discussion préalable sur son forum privé.

Le passage de MySQL vers SQLite (via dump SQLite) est simple et sans risque

Si vous avez un site test sous MySQL il suffit de faire une sauvegarde depuis le site et de la réimporter dans un site installé avec SQLite. Le passage dans ce sens est généralement très bien supporté et ne pose pas de problèmes. salut c’est nul.

Le passage de SQLite à MySQL (via un dump SQLite) est problématique

La structure d’une base SQLite est plus pauvre que celle d’une base MySQL et il est difficile de recréer la structure de la base MySQL à partir de celle de SQLite sans risque de bugs ultérieurs.

En attendant que le passage de MySQL à SQLite soit automatiquement pris en charge, il existe une procédure manuelle.

Procédure manuelle pour passer sa base de SQLite à MySQL :

  • Sur le site 1 installé avec SQLite faire une sauvegarde dans tmp/dump/dump1.sqlite
  • Installer un site 2 avec MySQL avec tous les mêmes plugins (mêmes tables dans la base de données)
  • Sur ce site 2 (installé avec MySQL) faire une sauvegarde dans tmp/dump/dump2.sqlite
  • Exporter la table spip_meta du dump2.sqlite dans un fichier :
    echo ".dump spip_meta" | sqlite3 dump2.sqlite > metadump2.txt
  • Supprimer la meta de structure dans dump1.sqlite :
    echo "delete from spip_meta where nom='dump_structure_temp';" | sqlite3 dump1.sqlite
  • Mettre à jour la table spip_meta dans dump1.sqlite :
    sqlite3 dump1.sqlite < metadump2.txt
  • Importer le dump1.sqlite dans le site 2 sous MySQL depuis l’interface SPIP.

Cette procédure repose sur le fait que les bases du site 1 et du site 2 ont les mêmes tables avec les mêmes champs. Il faut donc faire bien attention à avoir tous les mêmes plugins installés.

Procédure manuelle simplifiée (v2) pour passer sa base de SQLite à MySQL :

  • Sur le site 1 installé avec SQLite faire une sauvegarde dans tmp/dump/dump1.sqlite
  • Supprimer la meta de structure dans dump1.sqlite :
    echo "delete from spip_meta where nom='dump_structure_temp';" | sqlite3 dump1.sqlite
  • Installer un site 2 avec MySQL avec tous les mêmes plugins actifs (mêmes tables dans la base de donnée)
  • Importer le dump1.sqlite dans le site 2 sous MySQL depuis l’interface SPIP.

Autre solution (signalée par G.Vincent ) : voir http://stackoverflow.com/a/13365275 (nécessite Python).

Autre Solution : passer par le plugin Adminer. [Gilles]

  1. Exporter via Adminer tout le premier site SQLite en ne prenant QUE les données
  2. Créer le site sous MySQL, déplacer le contenu (plugins, squelettes et IMG), activer les mêmes plugins que sur le site d’origine (dont Adminer)
  3. Adminer ajoute des guillemets double (anglais) autour des champs, il faut donc les virer dans le dump téléchargé à l’étape 1). C’est plus ou moins compliqué (dans mon cas c’était simple car je n’en avais pas dans mon contenu).
  4. Pour ne pas toucher aux données qui sont déjà dans la nouvelle base, j’ai choisi de remplacer tous les INSERT INTO par des INSERT IGNORE INTO : cela permet de s’assurer par exemple que l’auteur n°1 est bien celui qui a été créé lors de l’installation mysql
  5. Importer dans mysql. Ca peut se faire dans Adminer, mais si le fichier est gros, on a intérêt à passer par l’excellent script BigDump.php
  6. J’ai eu une fois des doublons dans la liste des plugins : il a suffit de supprimer le dépôt des plugins, puis de le recharger pour que ça fonctionne
  7. J’ai aussi eu des problèmes d’encodage. Mais c’était lié au fichier de dump que je n’avais pas reconverti en utf8 dans Notepad++. Le meilleur moyen pour ne jamais avoir ce problème est d’utiliser le copier-coller du fichier dump dans une requête SQL d’Adminer.

Autre Solution : utiliser le plugin Fusion de Spip [nicod_]
Solution en 4 étapes simples :
http://contrib.spip.net/Fusion-de-SPIP#sqlite