MariaDB

MariaDB est le serveur de base de données recommandé pour SAINet. MariaDB est basée sur MySQL et utilise les mêmes interfaces. Elle est toutefois préférée à MySQL pour des raisons de performances et de problèmes de corruption qui ont notamment été constatés sur MySQL 5.7 et MySQL 8.0.

Version

Suivant la version de SAINet installée, voici la version recommandée de la base de données:

Version MariaDB
4.12.x 10.11.x
4.11.x 10.11.x
4.10.x 10.6.x (>= 10.6.10)
4.9.x 10.4.x
4.8.x 10.4.x

Installation

Linux

Pour installer MariaDB, utiliser la commande suivante:

apt-get install mariadb-server
systemctl start mariadb

Une fois la base de données installée, il est nécessaire de charger les TimeZone:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

Certains paramètres doivent être appliqués pour SAINet. Pour ce faire, créer le fichier /etc/mysql/conf.d/sainet-options.cnf avec le contenu suivant:

[mysqld]
max-allowed-packet = 1024m
default-time-zone = 'Europe/Zurich'

# performances
innodb_buffer_pool_size=1024m
innodb_log_buffer_size=32m
innodb_log_file_size=256m
tmp_table_size=64m
max_heap_table_size=64m
query_cache_size=64m
query_cache_limit=64m
query_cache_strip_comments=1

Pour les détails sur les différentes variables, se référer à la documentation MariaDB.

Puis, redémarrer le service avec systemctl restart mariadb.

Note:

Si le service ne redémarre pas, il se peut que les TimeZone n’aient pas été chargées correctement.

Windows

Utiliser l’exécutable MSI pour faire l’installation avec les options suivantes:

  • Les outils de développement ne sont pas nécessaires.
  • Les autres utilitaires ne sont pas nécessaires.
  • Pas d’encoding par défaut.
Note:

Il se peut que l’installeur MSI ne fonctionne pas, notamment sur XEN. Dans ce cas, il faut utiliser les sources.

Une fois le service démarré, il est nécessaire de charger les fichiers de TimeZone. Il faut télécharger la version POSIX pour MySQL 5.7+ et les importer avec la comande suivante:

mariadb -u root mysql < timezone_posix.sql
Attention:

Le fichiers de timezone fournis par MySQL ne fonctionnent plus depuis MariaDB 10.6 (voir ici). Veuillez utiliser ce fichier pour importer la timezone ‘Europe/Zurich’

Puis finalement, éditer le fichier <mariadb>\data\my.ini pour ajouter les lignes suivantes dans la section [mysqld]:

max-allowed-packet = 1024m
default-time-zone = 'Europe/Zurich'

Puis, redémarrer le service MariaDB.

Info:

Il est conseillé de configurer le service pour que celui-ci redémarre automatiquement en cas de défaillance.

Gestion du service

Sous windows, il peut être nécessaire de devoir créer le service manuellement. Cela se fait au moyen de la commande suivante:

sc create MariaDB binpath="<mariadb>\bin\mysqld.exe --defaults-file=<mariadb>\data\my.ini MariaDB" DisplayName="MariaDB" start="auto"

Le service peut être démarré/stoppé avec les commandes suivantes:

sc start MariaDB
sc stop MariaDB

En cas de besoin, pour supprimer le service:

sc delete MariaDB

Utilisateur SAINet

SAINet a besoin d’un utilisateur ayant tous les droits afin de pouvoir modifier le schema lors des mises à jour automatiques. Dans une console, exécuter la commande:

mysql -u root -p mysql

Puis ensuite, les requêtes suivantes (en remplaçant <user> et <password> par les valeurs désirées):

GRANT ALL PRIVILEGES ON *.* TO '<user>'@localhost IDENTIFIED BY '<password>';
FLUSH PRIVILEGES;

Création du schema

SAINet aura besoin d’un schema vide afin d’initialiser la base de données:

mysql -u <user> -p -e "CREATE DATABASE <schema>"
Info:

Généralement, le nom de base de données sera sainet_prod pour un serveur de production.

A ce stade, la base de données est prête à être utilisée. Les paramètres de connexion à la base seront à préciser lors de l’installation de SAINet. Les tables seront ensuite créées automatiquement.

Erreur InnoDB Page Size

Si une base de données existante est importée, MariaDB peut sortir l’erreur suivante:

ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

Dans ce cas-là, appliquer la procédure suivante:

  • Disposer d’un dump de la base de données (mysqldump -u <user> -p <schema> --max-allowed-packet=1024m > dump.sql).
  • Stopper le service MariaDB.
  • Ajouter l’option innodb_page_size = 32k dans <mariadb>\data\my.ini sous le tag [mysqld] (cf valeurs possibles).
  • Supprimer les fichiers ibdata1 et ib_logfile* dans le répertoire <mariadb>\data. Ceux-ci seront recréés lors du redémarrage de MariaDB (source).
  • Redémarrer le service MariaDB
  • Réimporter la base de données

Sauvegarde

Afin de créer un fichier de données SQL, exécuter la commande suivante:

mysqldump -u <user> -p --max-allowed-packet=1024m --single-transaction <schema> > dump.sql
  • L’option --max-allowed-packet est nécessaire car certaines tables (syspck,syscls) contiennent de gros fichiers.
  • L’option --single-transaction évite un blocage de la base de données pendant que le dump est effectué.

Ce fichier peut ensuite être zippé et déplacé vers un emplacement sécurisé différent (notamment sur un autre disque).

Info:

Afin de faire un dump rapide et plus léger, certaines tables (syspck,syscls,systop,unimut) peuvent être omises: mysqldump -u <user> -p <schema> --ignore-table=<schema>.syspck --ignore-table=<schema>.syscls > dump.sql

Restauration

Pour restaurer un fichier de données SQL, utiliser la commande suivante:

cat dump.sql | mysql -u <user> -p <schema>
Attention:

Les données actuelles vont être écrasées par la sauvegarde !

Le temps de restauration dépend de la taille de la base de données. Cela peut prendre jusqu’à plus d’une heure pour les bases de données de plusieurs Gigaoctets.

Restauration partielle

Il est arrivé que certaines tables (notamment celles avec un index spatial, typiquement GTPEVT) soient corrompues. A ce moment-là, toutes les requêtes sur cette table sont bloquées en mode “Opening tables” lorsqu’un SHOW PROCESSLIST est effectué.

Afin de restaurer le fonctionnement de l’application, voici la procédure à suivre:

  1. Stopper SAINet et MariaDB.
  2. Définir l’option innodb_force_recovery=3 dans le fichier de configuration MariaDB et redémarrer le service MariaDB.
  3. Effectuer un dump complet de la table posant problème (mysqldump --max-allowed-packet=1024m -u <user> -p <schema> <table> > dump.sql).
  4. Supprimer la table (DROP TABLE <table>).
  5. Enlever l’option innodb_force_recovery et redémarrer le service MariaDB.
  6. Réimporter le dump de la table concernée.
  7. Redémarrer le service SAINet.
Attention:

Cette procédure implique la suppression de la table posant problème et son réimport. Il est donc important de disposer d’une sauvegarde complète récente en cas de problème. Il est possible d’effectuer un sauvegarde complète une fois le service redémarré avec l’option innodb_force_recovery.