Archive for the ‘Astuce’ Category

13
août

!include

   Posted by: freshdaz Tags: , ,

my.cnf, comme vous le savez certainement est le nom du fichier de configuration de MySQL. Vous pouvez également le retrouver sous le nom de my.ini en environnement MS Windows. Il permet comme son nom l’indique de configurer votre serveur MySQL en y centralisant les options de … configuration. Le but ici n’est pas de détailler la longue liste des paramètres de MySQL, la documentation officielle est (presque) bien faite, mais de mettre le « focus » sur la directive !include (avec un « ! » devant).

Cette dernière permet d’inclure un fichier de configuration dans un autre (sic). Autant je suis un adèpte de la non duplication du code en dévellopement (des require_once en PHP utilisés avec modération ça vous simplifie bien votre code), autant je ne suis pas un grand fan pour éclater la configuration de mon serveur MySQL en plusiseurs endroits. Cependant :) il faut avouer que parfois cela peut servir !

Alors comment ça marche ?

C’est (apparemment) très simple. Mon client mysql va chercher sa configuration dans différents endroits (définit à la compilation):

daz@daz-laptop:~$ mysql –help
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf


Mon fichier de configuration se nomme  /etc/mysql/my.cnf et il contient simplement la directive !include suivit du « vraie » fichier de configuration:

daz@daz-laptop:~$ cat /etc/mysql/my.cnf
!include /home/daz/sandboxes/msb_5_1_35/my.sandbox.cnf


Et au final dans mon fichier de configuration (au passage j’utilise le très pratique soft développé par Giuseppe Maxia : MySQL Sandbox):

daz@daz-laptop:~$ cat /home/daz/sandboxes/msb_5_1_35/my.sandbox.cnf
[mysql]
prompt=’mysql [\h] {\u} (\d) > ‘
[client]
port = 5135
socket = /tmp/mysql_sandbox5135.sock


Simple non ?

C’est (presque) tout, et ça marche…pas :(

daz@daz-laptop:~$ mysql
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)


Une petite vérification s’impose:

daz@daz-laptop:~$ mysql –help
mysql  Ver 14.14 Distrib 5.1.35, for pc-linux-gnu (i686) using readline 5.1
port                              0
socket
(No default value)


Les paramètres ne sont pas prit en compte. (commentaire de l’expert: ça ne peut donc pas fonctionner)



(30 minutes et quelques insultes plus tard…)


En fait, la subtilité,  c’est de rajouter un saut à la ligne, à la fin de la commande !include /home/daz/sandboxes/msb_5_1_35/my.sandbox.cnf

daz@daz-laptop:~$ mysql –help
mysql  Ver 14.14 Distrib 5.1.35, for pc-linux-gnu (i686) using readline 5.1
port 5135
socket /tmp/mysql_sandbox5135.sock


Vérification (au cas où):

daz@daz-laptop:~$ mysql

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.1.35-log MySQL Community Server (GPL)
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
mysql [localhost] {daz} ((none)) >


(commentaire de l’expert: ça fonctionne !)

:)

Giuseppe Maxia

MySQL possède un grand nombre de fonctions pour gérer les dates et le temps. Il est possible de récupérer le numéro calendaire d’une semaine avec la fonction week. Dimanche 5 avril nous étions semaine 14. La fonction week nous le confirme:

mysql> SELECT week('2009-04-05');
+--------------------+
| week('2009-04-05') |
+--------------------+
|                 14 |
+--------------------+

Lundi 6 avril, nouvelle semaine, on passe donc à la semaine 15:

mysql> SELECT week('2009-04-06');
+--------------------+
| week('2009-04-06') |
+--------------------+
|                 14 |
+--------------------+

Souci !!! Le résultat n’est pas celui espéré (14 au lieu de 15). En fait la fonction week prend un deuxième paramètre optionnel, qui permet de « régler la précision » (compter sur 53 ou 54 semaines, commencer la semaine un dimanche ou un lundi…) bref elle est complète et complexe…

Le réglage usuel est de mettre le deuxième paramètre à 3 ! ou alors d’utiliser la fonction WEEKOFYEAR.

mysql> SELECT weekofyear('2009-04-05');
+--------------------------+
| weekofyear('2009-04-05') |
+--------------------------+
|                       14 |
+--------------------------+
mysql> SELECT weekofyear('2009-04-06');
+--------------------------+
| weekofyear('2009-04-06') |
+--------------------------+
|                       15 |
+--------------------------+

Il est pafois utile de désactiver le log binaire lors d’une restauration. MySQL permet de le désactiver pour une session avec la commande SQL_LOG_BIN:

mysql> SET SESSION sql_log_bin = 0;

Lors de la restauration avec le client mysql on peut donc utiliser la ligne de commande suivante:

shell> mysql –execute=« SET SESSION sql_log_bin=0;  SOURCE mon_fichier_dump.sql; »

En cas de perte du mot de passe root surtout si c’est votre seul compte (super) administrateur, vous vous trouvez dans une situation pour le moins embarrassante.
MySQL propose un moyen de s’en sortir. Certes, si le mot de passe est perdu vous ne pourrai pas le récupérer, car il est stocké haché dans la base:

mysql> SELECT user, password FROM mysql.user;
 +---------+-------------------------------------------+
 | user    | password                                  |
 +---------+-------------------------------------------+
 | root    | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
 +---------+-------------------------------------------+
 1 rows in set (0.39 sec)

Néanmoins il est possible de le changer. Voici les étapes à suivre:

1/ Arrêter le serveur MySQL

Cela ne devrait pas poser trop de problèmes:
mysql stop (sous linux)
NET STOP MySQL (sous windows)

ou dans le pire des cas, débranchez la machine :)

2/ Démarrer le serveur en désactivant la vérifications des droits

shell> mysqld --skip-grant-tables

Il important de noter qu’une fois démarré avec skip-grant-table, n’importe qui peut se connecter au serveur MySQL et avec tout les droits… Inutile de préciser que le serveur est à ce moment particulièrement vulnérable.

3/ Connexion au serveur MySQL

Connectez vous au serveur mysql, comme à l’accoutumée.

shell> mysql --user=UtilisateurExistantPas --password=MotDePasse
Welcome to the MySQL monitor.  Commands end with ; or \g.
 Your MySQL connection id is 2
 Server version: 5.1.30-community-log MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>

4/ Protéger le serveur

La première chose à faire, une fois connecté est de sécuriser le serveur en remettant en place la vérification des droits:

mysql> FLUSH PRIVILEGES;
shell> mysql --user=UtilisateurExistantPas --password=MotDePasse
 ERROR 1045 (28000): Access denied for user 'UtilisateurExistantPas'@'localhost'
(using password: YES)

5/ Changer le mot de passe

L’heure est enfin venue de se créer un nouveau mot de passe root

mysql> SET PASSWORD FOR root@localhost=PASSWORD('m0T2pA55e');
 Query OK, 0 rows affected (0.06 sec)

6/ Arrêter le serveur

Pour sortir de la configuration skip-grant-tables, il faut arrêter le serveur, pour mieux le redémarrer…

7/ Redémarrer le serveur normalement

et le tour est joué :)

shell> mysql --user=root --password=m0T2pA55e
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.30-community-log MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>