Blog geekesque... ou presque

Aller au contenu | Aller au menu | Aller à la recherche

dimanche 9 décembre 2012

Access denied for user ‘debian-sys-maint’@'localhost’ (using password: YES)

Sur Debian, il arrive parfois que cette erreur apparaisse lors d'une tentative de mise à jour de MySQL, ou même lorsque l'on désire arrêter le serveur.

En fait, l'utilisateur debian-sys-maint n'est pas toujours créé, ou bien il est créé sans les bons privilèges, ce qui est génant.

Correction

Le mot de passe de cet utilisateur se trouve dans le fichier /etc/mysql/debian.cnf. Une fois que vous l'avez copié, connectez-vous en tant que root sur la base mysql du serveur:

mysql -u root -p mysql

Et là, donnez les bons droits à l'utilisateur debian-sys-maint (en remplaçant PASSWORD par le mot de passe précédent):

GRANT ALL privileges ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;

Redémarrez MySQL, tout doit être bon.

mardi 1 décembre 2009

Comment changer un mot de passe Mysql oublié

Copie du billet Comment changer un mot de passe Mysql oublié de Johann Denoyer

Ca peut arriver d'oublier le mot de passe root de mysql, ou reprendre en main un serveur d'un ancien administrateur ayant quitté l'entreprise un peut rapidement. Donc je vous présente ici comment changer le mot de passe root d'un serveur mysql.

Lire la suite...

vendredi 18 septembre 2009

Concaténation de champs avec MySQL

Petite surprise en développant une requête qui fait la recherche d'un mot dans trois champs concaténés, elle ne retourne aucun résultat or le mot est bien présent dans l'un des champs. La requête est de la forme:

SELECT *
FROM table
WHERE CONCAT(champ1, champ2, champ3) LIKE '%mot%'

Après un petit tour dans la documentation MySQL, voici ce que l'on trouve:

CONCAT(str1,str2,...) Retourne une chaîne représentant la concaténation des arguments. Retourne NULL si un des arguments est NULL. Cette fonction peut prendre plus de 2 arguments. Si un argument est un nombre, il sera converti en son équivalent sous forme de chaîne de caractères

Pour une concaténation de champs dont certains peuvent avoir la valeur NULL, il faut employer CONCAT_WS():

SELECT *
FROM table
WHERE CONCAT_WS(' ', champ1, champ2, champ3) LIKE '%mot%'

mercredi 25 mars 2009

Tris particuliers avec MySQL

La plupart du temps, on utilise les tris de MySQL en faisant ORDER BY clé ASC (ou DESC), mais on peut aussi vouloir un tri aléatoire ou avec un tri bien précis sur les valeurs d'un champ.

Le tri aléatoire peut s'effectuer en PHP, mais lorsqu'il s'agit de ressortir un enregistrement au hasard il est beaucoup plus économique (en terme de ressources) d'utiliser RAND(). Quant au tri sur des valeurs, la directive FIELD() est très utile et beaucoup plus simple à utiliser que d'essayer de la réaliser en PHP.

Lire la suite...

dimanche 1 mars 2009

Limit avec le nombre total d'enregistrements

Lorsqu'on fait une requête MySQL avec une clause LIMIT[1], c'est très souvent pour faire une pagination, on a donc besoin de deux requêtes assez gourmandes:

SELECT COUNT(*) AS `total`
FROM `table`
WHERE `actif`=1
-- renvoie le nombre d'éléments total dans le résultat de la requête
 
SELECT *
FROM `table`
WHERE `actif`=1
ORDER BY `DATE` DESC
LIMIT 10 OFFSET 20
-- renvoie les éléments 21 à 30

La première requête est très gourmande car elle va effectuer la recherche sur toute la table, et la seconde va faire la même recherche en ne renvoyant que certains éléments.

Heureusement, avec une petite option bien placée, on peut avoir sous la main disponible le nombre total d'éléments sans avoir la première requête. En effet, la seconde va de toutes manières sortir tous les éléments qui correspondent, pour n'en garder ensuite que ceux qui satisfont la clause LIMIT. Avec le paramètre SQL_CALC_FOUND_ROWS, on peut garder en mémoire ce total:

SELECT SQL_CALC_FOUND_ROWS *
FROM `table`
WHERE `actif`=1
ORDER BY `DATE` DESC
LIMIT 10 OFFSET 20

Ceci va donc effectuer la requète normale tout en enregistrant dans une table temporaire le nombre total d'enregistrements satisfaisant la clause WHERE sans tenir compte de la clause LIMIT. Il ne reste plus qu'à interroger cette table:

SELECT FOUND_ROWS()

Cette table est très rapide d'accès (elle est en mémoire) et ne demande donc que très peu de ressources.

Notes

[1] La syntaxe que j'utilise ici est la syntaxe officielle, le LIMIT X, Y est un raccourci que je trouve moins agréable