Après la mise à jour de mon Tiny Tiny RSS (agrégateur de flux RSS), le script de mise à jour des flux RSS (« update_daemon2.php ») que j'exécute avec systemd crachait ceci dans les logs :
Apr 1 18:58:20 hostname update_daemon2.php[827]: PHP Fatal error: Uncaught PDOException: There is no active transaction in /var/www/ttrss/classes/rssutils.php:1177
Apr 1 18:58:20 hostname update_daemon2.php[827]: Stack trace:
Apr 1 18:58:20 hostname update_daemon2.php[827]: #0 /var/www/ttrss/classes/rssutils.php(1177): PDO->commit()
Apr 1 18:58:20 hostname update_daemon2.php[827]: #1 /var/www/ttrss/classes/rssutils.php(190): RSSUtils::update_rss_feed('85', true, false)
Apr 1 18:58:20 hostname update_daemon2.php[827]: #2 /var/www/ttrss/update.php(199): RSSUtils::update_daemon_common(50)
Apr 1 18:58:20 hostname update_daemon2.php[827]: #3 {main}
Au début, seuls deux flus RSS étaient concernés. Puis, progressivement, tous les flux ont été concernés…
On peut supposer qu'il y a une requête SQL mal formée dans le lot de requêtes qui forme la transaction SQL qui est validée à la ligne 1177 de rssutils.
La meilleure façon d'avoir de la visibilité sur cela est de se connecter à l'interface web de ttrss avec un compte disposant des droits d'administration et d'aller dans le menu « Actions » -> « Configuration » -> « Système » et de constater une erreur SQL qui se produit juste avant un commit SQL. Il est vain de modifier les fichiers index.php et update_daemon2.php pour y ajouter « error_reporting(-1); » en espérant voir l'erreur apparaître dans les logs du serveur web, car ttrss stocke les erreurs dans sa base de données…
Dans mon cas, cette manipulation a mis en évidence l'erreur suivante : Unknown column 'width' in 'field list'
. Probablement une colonne qui a été ajoutée lors d'une mise à jour… Pour savoir laquelle, il suffit de chercher dans les fichiers du dossier « schema/versions/mysql » (ou pgsql) : grep -Ri width .
. Il s'agit de 126.sql.
Il suffit de rejouer ce fichier sans la requête « update ttrss_version set schema_version = 126; » et c'est gagné.
On peut jouer les autres fichiers SQL afin de s'assurer que la base de données de Tiny Tiny RSS soit OK : mysql -u <user> -p <nom_bdd_ttrss> < 127.sql
. Si une modif' a déjà été effectuée, alors la transaction SQL échouera et la base de données ne sera pas écrasée.