Accueil > SPIP > Adaptation du squelette de la dist et de SPIP > Problème de sauvegarde de la base de données de SPIP
Sauvegarde au format SQLite impossible avec les dernières versions de MariaDB
Problème de sauvegarde de la base de données de SPIP
Les tables SQL ne sont pas exportées et sont indiquées « en échec » puis « vides »
dimanche 15 mai 2022, par
Notez cet articleImpossible de faire une sauvegarde complète de la base de données depuis l’espace privé ! Pour la majorité des données il s’affiche [Echec] et elles sont vides.
Il s’agit d’un problème d’adaptation entre SQLite et les dernières versions du SGBD MariaDB.
Un correctif est de modifier le code de SPIP pour permettre de changer l’appel à la fonction current_timestamp()
vers la variable CURRENT_TIMESTAMP
.
Je suis sous SPIP 3.1.3 [23214] chez l’hébergeur BOXIS et depuis plusieurs années les sauvegardes complètes de la base de données depuis l’espace privé se sont toujours déroulées à la perfection. Or depuis un jour de mars 2022, alors que rien n’a été changé dans l’installation et les réglages du SPIP et de ses plugins, il est devenu impossible de faire une sauvegarde complète de la base de données depuis l’espace privé ! Pour la majorité des données il s’affiche [Echec] et elles sont vides :
Le problème a été déclaré dans forum.Spip.net par Courcelles Design en Janvier 2019 pour un SPIP 3.2.1 [23954] et par Pascal Engelmajer en Septembre 2019 pour un SPIP 3.2.4 [24285]. Le problème a été identifié et la solution donnée dans ces deux forums, il s’agit d’un problème d’adaptation entre SQLite et les dernières versions du SGBD MariaDB.
SB indique il y a 5 mois : « Nous venons de migrer notre site intranet sur un nouveau serveur avec MariaDB 10.6.4 et en avons profité pour faire une mise à jour de SPIP en 3.2.11. Lors des tentatives de sauvegarde de la base de données dans SPIP, les tables SQL (spip_articles, spip_breves, spip_depots, spip_documents, ...) contenant la fonction current_timestamp()
ne sont pas exportées et sont indiquées « en échec » puis « vides » ».
Olivier Tetard explique que « la sauvegarde au format SQLite est impossible avec les dernières versions de MariaDB #4374. Les dernières versions de MariaDB utilisent current_timestamp()
en tant que fonction quand on exporte le format des tables SQL (via la commande SHOW CREATE TABLE
). C’est ce résultat qui est utilisé pour créer les tables dans la base SQLite, or, l’utilisation de la fonction current_timestamp()
n’est pas possible avec SQLite. Ce problème a été introduit avec les dernières version de MariaDB. Un correctif bête et méchant est de modifier le code de SPIP pour permettre de changer l’appel à la fonction current_timestamp()
vers la variable CURRENT_TIMESTAMP
».
Suite à ma requête dans le forum ouvert par Pascal Engelmajer pour obtenir la correction à appliquer, Michel Leble explique : « vous éditez (après avoir fait une copie de sauvegarde) le fichier ecrire/req/sqlite_generique.php pour lui ajouter la ligne en vert (sans le + ) selon le commit ici » :
Cela consiste donc à ajouter cette ligne en vert après la ligne
2527 '/auto_increment/is' => '',
du fichier sqlite_generique.php du SPIP 3.1.3 [23214], ce qui donne :
2527 '/auto_increment/is' => '',
2528 '/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2529 '/(timestamp .* )ON .*$/is' => '\\1',
Après l’application de cette correction la sauvegarde fonctionne à nouveau à la perfection :
Sources - références
- Sauvegarder vos données (SPIP)
https://www.spip.net/fr_article3418.html
- Fil de discussion de : Pb sauvegarde Pri:ERREUR : Erreur sqlite HY000
Courcelles Design, Janvier 2019
Bonjour, je viens de me rendre compte que la sauvegarde d’un SPIP 3.2.1 [23954] échouais avec plein d’erreurs partout...
https://forum.spip.net/fr_270745.html
- Fil de discussion de : Problème de sauvegarde
Pascal Engelmajer , Septembre 2019
Bonjour, Je suis sous SPIP 3.2.4 [24285] , impossible de faire une sauvegarde complète de la base de donnée dans l’espace privé ! Pour plusieurs il s’affiche [Echec] et elles sont vides.
https://forum.spip.net/fr_271792.html
- Fix #4374 : traduire a la volee le current_timestamp() introduit par MariaDB mais que SQlite ne connait pas (b_b et marcimat)
Cerdic il y a 1 an
https://git.spip.net/spip/spip/commit/7a30fed7bbe4bad2ae36d89bf309bc1dac08efda
https://git.spip.net/spip/spip/commit/ebe3911aabce66dfd0f7b773655a9641d8ac947d
- Fil de discussion de : Sauvegarde au format SQLite impossible avec les dernières version de MariaDB #4374
Fermé créé il y a 3 ans par olivier.tetard · 11 commentaires
olivier.tetard a commenté il y a 3 ans
https://git.spip.net/spip/spip/issues/4374
- Fil de discussion de : current_timestamp variable being replaced in create table statement
MariaDB Server / MDEV-13377
https://jira.mariadb.org/browse/MDEV-13377
- Fil de discussion de : Mariadb CURRENT_TIMESTAMP gets changed to ’current_timestamp()’
Asked 4 years, 10 months ago - Modified 4 years, 10 months ago - Viewed 1k times
https://stackoverflow.com/questions/44722541/mariadb-current-timestamp-gets-changed-to-current-timestamp
- Fil de discussion de : Dump php, support pour MariaDB #4728
Fermé créé il y a 1 an par miros · 4 commentaires
https://git.spip.net/spip/spip/issues/4728
- Dépôt officiel du core SPIP
Les plugins-dist faisant partie de la distribution SPIP sont présents dans https://git.spip.net/spip/[nom du plugin dist]https://www.spip.net
spip/ecrire/req/sqlite_generique.php , 3198 lignes , 92 KiB
https://git.spip.net/spip/spip/src/commit/ebe3911aabce66dfd0f7b773655a9641d8ac947d/ecrire/req/sqlite_generique.php
- MariaDB Server : The open source relational database
https://mariadb.org
- MariaDB
https://sql.sh/sgbd/mariadb
- What Is SQLite ?
https://www.sqlite.org/index.html
- Portage de SPIP en SQLite
https://contrib.spip.net/Portage-de-SPIP-en-SQLite