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 :

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. Natürlich! Hier ist die französische Version als Markdown:

Modifier la valeur de DatabaseChangeLogLock

Natif

Pour résoudre le problème, vous pouvez soit supprimer l’unique entrée de la table DATABASECHANGELOGLOCK, soit 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, vous pouvez utiliser l’outil de gestion de la base de données ou une alternative gratuite (BeeKeeper, DBeaver, HeidiSQL, …). 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 votre application.yml ou docker-compose.yml.

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;"

Remarque Pour éviter que le mot de passe ne soit enregistré en clair dans l’historique Bash, vous pouvez omettre l’option -p ou --password lors de l’exécution de la commande sans saisir le mot de passe. > Ainsi, le mot de passe de la base de données sera demandé de manière interactive après l’envoi de la commande.