Base de données verrouillée - DatabaseChangeLogLock

Introduction

Le verrou sur la table changelog n’a pas pu être supprimé. Le service Relution ne démarre plus ou continue à redémarrer (Docker). Le journal affiche les messages suivants :

``log ion.boot.LiquibaseConfig : Relution build version is … [] ion.boot.LiquibaseConfig : Database is … (Data source ‘dataSource’) [] ion.boot.LiquibaseConfig : Detected database type ‘…’, version ‘…’ [] ion.boot.LiquibaseConfig : Registering Liquibase customizations [] iquibase.MariaDBDatabase : Connecté à relution@… [] iquibase.MariaDBDatabase : Setting auto commit to false from true [] vice.StandardLockService : Waiting for changelog lock…. [] vice.StandardLockService : Attente du verrouillage du journal des modifications…. []


Le dernier message se répète périodiquement jusqu'à ce que le service se termine avec un `timeout` et redémarre automatiquement si nécessaire (Docker).

## Causes

Au démarrage, le service Relution vérifie d'abord si les mises à jour de la base de données doivent être exécutées.  
Pour éviter que deux noeuds ne modifient le schéma de la base de données en même temps en mode cluster, un verrou est toujours placé dans la table `DATABASECHANGELOGLOCK` à cette fin.  
Ce verrou est libéré une fois que le contrôle et/ou les mises à jour sont terminés.

Si le service Relution est arrêté dans cet état, ce verrou reste en place.  
Au prochain démarrage de Relution, il attend que le verrou soit libéré car le service suppose qu'un autre nœud est en train de mettre à jour la base de données.  
Si ce n'est pas le cas après environ 5 minutes, le service se termine avec un message d'erreur approprié.

Cette situation se produit généralement lorsque Relution se termine prématurément au cours de l'exécution de mises à jour importantes de la base de données, car le processus de démarrage prend un temps anormalement long.

## Modifier la valeur de DatabaseChangeLogLock

Pour corriger la condition, soit la (seule) entrée de la table `DATABASECHANGELOGLOCK` peut être supprimée, soit la valeur de la colonne `LOCKED` peut être changée de `1` à `0`. Selon la base de données, `True` peut aussi être affiché à la place de `1` et doit être changé en `False` en conséquence.

Pour mettre à jour la base de données, l'outil d'administration de base de données correspondant ou une alternative gratuite peut être utilisé (`BeeKeeper`, `DBeaver`, `HeidiSQL`, ...). Selon la base de données, la mise à jour est également possible en utilisant les outils de ligne de commande appropriés. Dans le cas de `MariaDB/MySQL` par exemple :

```sh
mysql --host=<hostname> --user=<username> --password --database=<database> --execute="TRUNCATE TABLE DATABASECHANGELOGLOCK ;"

Les placeholders entre crochets doivent être remplacés par les valeurs de application.yml ou docker-compose.yml.