Systemtools_mysqldump?

Bonjour,

Pour faire suite à cette échange au sujet des sauvegardes planifiées (=> cron/card.php?id=6) sur un hébergement où le programme de dump de base de données est mariadb-dump et non mysqldump, je me pose la question de la déclaration de la variable SYSTEMTOOLS_MYSQLDUMP.

En effet, dans le détail du job planifié de « Sauvegarde locale de base » (=> cron/card.php?id=6), on voit que le Nom de fichier intégrant la classe est core/class/utils.class.php

Et dans core/class/utils.class.php on trouve à partir de la ligne 295 (dolibarr 21.0.1):

// MYSQL
		if ($type == 'mysql' || $type == 'mysqli') {
			if (!getDolGlobalString('SYSTEMTOOLS_MYSQLDUMP')) {
				$cmddump = $db->getPathOfDump();
			} else {
				$cmddump = getDolGlobalString('SYSTEMTOOLS_MYSQLDUMP');
			}
			if (empty($cmddump)) {
				$this->error = "Failed to detect command to use for mysqldump. Try a manual backup before to set path of command.";
				return -1;
			}

Mais où doit-on déclarer SYSTEMTOOLS_MYSQLDUMP initialisé à mariadb-dump ?

N’étant pas codeur, j’ai pensé à Configuration > Divers, mais l’erreur de sauvegarde planifiée perdure.

J’ajoute que, pour une sauvegarde manuelle (admin/tools/dolibarr_export.php), le Chemin complet vers la commande mysqldump est bien initialisé à mariadb-dump.

À toutes fins utiles, la portion du log de Dolibarr correspondant au lancement d’une sauvegarde planifiée.

2025-05-03 07:21:56 DEBUG   <IP_address>    2281983   1228 Cronjob::run_jobs START Utils->dumpDatabase(gz,auto,1,auto,31,0,0); (Note: Log for cron jobs may be into a different log file)
2025-05-03 07:21:56 DEBUG   <IP_address>    2281983   1228 Utils::dumpDatabase type=auto compression=gz file=auto
2025-05-03 07:21:56 INFO    <IP_address>    2281983   1228 functions.lib::dol_mkdir: dir=/path/dolibarrdata/admin/backup
2025-05-03 07:21:56 DEBUG   <IP_address>    2281983   1228 sql=SHOW VARIABLES LIKE 'basedir'
2025-05-03 07:21:56 INFO    <IP_address>    2281983   1228 functions.lib::dol_mkdir: dir=/path/dolibarrdata/admin/backup
2025-05-03 07:21:56 INFO    <IP_address>    2281983   1228 Utils::dumpDatabase execmethod=1 command:/usr/bin/mysqldump bd_name -h localhost -u bd_user -K --add-drop-table=TRUE --tables -c -e --hex-blob --default-character-set=utf8 --no-tablespaces -p"**********" 2>&1
2025-05-03 07:21:57 INFO    <IP_address>    2281983   1228 dol_delete_file file=/path/dolibarrdata/admin/backup/mariadb-dump_bd_name_21.0.1_2505030921.sql.gz.err disableglob=1 nophperrors=0 nohook=0
2025-05-03 07:21:57 WARNING <IP_address>    2281983   1228 Failed to remove file /path/dolibarrdata/admin/backup/mariadb-dump_bd_name_21.0.1_2505030921.sql.gz.err
2025-05-03 07:21:57 INFO    <IP_address>    2281983   1228 files.lib.php::dol_move srcfile=/path/dolibarrdata/admin/backup/mariadb-dump_bd_name_21.0.1_2505030921.sql.gz destfile=/path/dolibarrdata/admin/backup/mariadb-dump_bd_name_21.0.1_2505030921.sql.gz.err newmask=0 overwritifexists=1
2025-05-03 07:21:57 ERR     <IP_address>    2281983   1228 Cronjob::run_jobs END result=-1 error=/usr/bin/mysqldump: Deprecated program name. It will be removed in a future release, use '/usr/bin/mariadb-dump' instead

Alors c’est sûr, le job génère une sauvegarde « …err » qui a fait l’objet d’autres sujets, basedir vaut /usr/ (SHOW VARIABLES LIKE 'basedir'), et via SSH on peut voir que /usr/bin/mysqldump est un lien symbolique vers mariadb-dump.

Mais ma question concerne la variable SYSTEMTOOLS_MYSQLDUMP qui d’après le code dans utils.class.php devrait résoudre cette erreur très simplement.

bonjour,
Dans Configuration > Divers
Nouvelle constante
nom SYSTEMTOOLS_MYSQLDUMP
valeur /usr/bin/mariadb-dump

le chemin /usr/bin/mariadb-dump est a vérifier

Cela devrais régler le problème.

Explication du problème :
Lors d’une sauvegarde planifiée, Dolibarr utilise la constante globale SYSTEMTOOLS_MYSQLDUMP si elle existe ; sinon, il appelle une méthode pour « deviner » la commande (getPathOfDump()), souvent inadaptée si mysqldump est absent.

J’écrivais…

Pour le reste, alors oui, de ce qu’on peut lire dans le code de utils.class.php ça devrait mais ça fait pas. :grin:

Mais si quelqu’un⋅e coutumier⋅e du code de Dolibarr peut préciser où getDolGlobalString va chercher les variables globales, ça sera une vraie piste.

Dans $conf->global = getGlobalConstants($db);

Ce très ancien sujet « SYSTEMTOOLS_MYSQLDUMP !! où est ce foutu paramètre » confirmerait que c’est bien dans llx_const (donc Configuration > Divers) mais non, ça ne change pas la commande de dump SQL utilisée pour la sauvegarde planifiée.

Sur cet hébergement (o2swicth), pour en dire un peu plus :

$ which mariadb-dump
/bin/mariadb-dump
$ ls -al /bin/mariadb-dump
-rwxr-xr-x 1 root root 5220200 30 janv. 19:33 /bin/mariadb-dump

Et…

$ ls -al /usr/bin/mariadb-dump
-rwxr-xr-x 1 root root 5220200 30 janv. 19:33 /usr/bin/mariadb-dump

$ file /usr/bin/mariadb-dump
/usr/bin/mariadb-dump: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=f25b13d0fabc0823a926af51ecf72ca3ba887be3, stripped

$ file /bin/mariadb-dump
/bin/mariadb-dump: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux3.2.0, BuildID[sha1]=f25b13d0fabc0823a926af51ecf72ca3ba887be3, stripped

La variable SYSTEMTOOLS_MYSQLDUMP est bien initialisée à /bin/mariadb-dump, mais c’est idem si je ne mets que mariadb-dump ou /usr/bin/mariadb-dump, le message d’erreur au lancement de la sauvegarde planifiée reste :

/usr/bin/mysqldump: Deprecated program name. It will be removed in a future release, use '/usr/bin/mariadb-dump' instead

Pourtant dans core/lib/functions.lib.php

function getDolGlobalInt($key, $default = 0)
{
        global $conf;
        return (int) (isset($conf->global->$key) ? $conf->global->$key : $default);
}

Hummmm :thinking:

Merci @Doudouvs

En l’occurrence, c’est plutôt :

/**
 * Return a Dolibarr global constant string value
 *
 * @param 	string 				$key 		Key to return value, return $default if not set
 * @param 	string|int|float 	$default 	Value to return if not defined
 * @return 	string							Value returned
 * @see getDolUserString()
 */
function getDolGlobalString($key, $default = '')
{
	global $conf;
	return (string) (isset($conf->global->$key) ? $conf->global->$key : $default);
}

Et donc si $conf->global->$key va bien chercher dans prefix_const (llx_const par défaut), ça devrait marcher non ?

oui j’ai copier la mauvaise ligne le boulet :upside_down_face:

Mais tu modifie le core de Dolibarr avec une mise à jours ça saute

C’est pourquoi je pose ici la question, car quand je force mariadb-dump dans utils.class.php, ça fonctionne évidemment.

Le but de cette variable SYSTEMTOOLS_MYSQLDUMP n’est-il pas précisément de ne pas avoir à bidouiller ?

Retour à la case départ.

Je pense ouvrir une issue d’ici peu, si personne sur ce forum ne peut ni confirmer ni infirmer que SYSTEMTOOLS_MYSQLDUMP est inopérante.

Il suffit de mettre bidule dans la variable et de lancer la sauvegarde planifiée. Un message d’erreur doit être affiché.

Je confirme c’est mal foutu :upside_down_face:

Dans core/class/utils.class.php
Ligne ~ 296

Remplace :

if (!getDolGlobalString('SYSTEMTOOLS_MYSQLDUMP')) {
    $cmddump = $db->getPathOfDump();
} else {
    $cmddump = getDolGlobalString('SYSTEMTOOLS_MYSQLDUMP');
}

Par :

$cmddump = '/bin/mariadb-dump';

Ca marche PAS. petit rappel :

Mais je viens de découvrir autre chose dans le champ dans « Outils > Sauvegarde manuelle » (admin/tools/dolibarr_export.php) est différent de la constante SYSTEMTOOLS_MYSQLDUMP. Le champ manuelle est stocké ailleurs et ne s’applique pas au cron.
Haaaaaaaaaaaaaaaaaaaaaaaa PAS de constante voilà pourquoi

Du moins c’est ce que je pense après un dev de Dolibarr pourrai faire une confirmation

Rien de nouveau par rapport à la sauvegarde manuelle (où on change la commande dans les options avancées, et tout va bien).

Et si si, $cmddump = '/bin/mariadb-dump'; fonctionne pour la sauvegarde planifiée. :blush:
C’est comme ça que je m’en sors pour le moment.

En faite j’ai a dit une connerie en me relisant

admin/tools/dolibarr_export.php et gère les sauvegardes manuelles (pas celles des cronjobs). Le champ mysqldump du formulaire alimente dynamiquement SYSTEMTOOLS_MYSQLDUMP.

Les sauvegardes planifiées (via cron/card.php?id=6) n’ont pas de formulaire pour définir mysqldump, et donc elles ne mettent jamais à jour SYSTEMTOOLS_MYSQLDUMP dynamiquement.

Donc dans l’urgence mais pas propre htdocs/core/class/utils.class.php

if (!getDolGlobalString('SYSTEMTOOLS_MYSQLDUMP')) {
    $cmddump = $db->getPathOfDump();
} else {
    $cmddump = getDolGlobalString('SYSTEMTOOLS_MYSQLDUMP');
}

Par

$cmddump = getDolGlobalString('SYSTEMTOOLS_MYSQLDUMP');
if (empty($cmddump)) {
    $cmddump = '/bin/mariadb-dump';  // Forçage si constante non initialisée ou mal lue
}

Cela permet de ne plus dépendre du comportement incertain dans les tâches cron.

Autrement un symlink au moins si mise a jour il y a de Dolibarr il n’y aura rien a refaire

sudo ln -s /bin/mariadb-dump /usr/bin/mysqldump

Toute commande mysqldump appellera en réalité mariadb-dump.

A+ je pars a l’apéro suis déjà en retard :rofl:

Au temps pour moi concernant le lien symbolique, je pensais l’avoir précisé :

$ which mysqldump
/bin/mysqldump
$ file /bin/mysqldump
/bin/mysqldump: symbolic link to mariadb-dump

Et là, si on tient aussi compte que…

$ ll /usr/bin/mysqldump
lrwxrwxrwx 1 root root 12  2 mars   2023 /usr/bin/mysqldump -> mariadb-dump

On peut se demander pourquoi ce message d’erreur de Dolibarr après lancement de la sauvegarde planifié, mais c’est un autre sujet, abordé par ailleurs. Car si message d’erreur rouge il y a, la sauvegarde est quand même faite ! et le dump porte le nom voulu + .err.
C’est adressé ailleurs, et ce n’est PAS ma question qui ne concerne que cette variable SYSTEMTOOLS_MYSQLDUMP. :grinning_face: