Base de données verrouillée

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 :

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

Natif

Pour résoudre le problème, il est possible de supprimer l’unique entrée de la table DATABASECHANGELOGLOCK, ou de modifier la valeur de la colonne LOCKED de 1 à 0. Selon la base de données, 1 peut également s’afficher comme True et doit alors être changé en False.

Pour mettre à jour la base de données, l’outil de gestion de la base de données ou une alternative gratuite (BeeKeeper, DBeaver, HeidiSQL, …) peut être utilisé. Selon la base de données, la mise à jour peut également être effectuée via les outils en ligne de commande correspondants. Par exemple, dans DBeaver :

TRUNCATE TABLE DATABASECHANGELOGLOCK;

Les espaces réservés entre chevrons doivent être remplacés par les valeurs présentes dans le fichier application.yml ou docker-compose.yml concerné.


Docker

Pour une configuration Docker, la commande permettant de déverrouiller la table peut être exécutée depuis le serveur dans le répertoire /opt/relution/ comme suit :

Exemple long

docker exec -it <containername> \
  mariadb --user=<username> \
        --password=<password> \
        --database=<database> \
        --execute="TRUNCATE TABLE DATABASECHANGELOGLOCK;"

Exemple long rempli :

docker exec -it docker_mariadb \
  mariadb --user=relution \
        --password=admin123 \
        --database=relution \
        --execute="TRUNCATE TABLE DATABASECHANGELOGLOCK;"

Exemple court

docker exec -it docker_mariadb mariadb -u <username> -p<password> <database> -e "TRUNCATE TABLE DATABASECHANGELOGLOCK;"

Exemple court rempli :

docker exec -it docker_mariadb mariadb -u relution -padmin123 relution -e "TRUNCATE TABLE DATABASECHANGELOGLOCK;"
Top