MySQL : Installation et configuration

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search
MySQL Logo

1 Introduction

MySQL est un serveur de bases de données relationnelles SQL développé dans un souci de performances élevées. Il est multi-thread, robuste et multi-utilisateurs. C'est un logiciel libre développé sous double licence en fonction de l'utilisation qui en est faite: dans un produit libre (open-source) ou dans un produit propriétaire. Dans ce dernier cas, la license est payante, sinon elle est libre.

2 Installation

Pour l'installer, rien de plus simple :

Command
apt-get install mysql

3 Utilisation

Je conseil fortement un petit utilitaire MySQL intégré de base pour configurer de façon simple et sécurisée MySQL. C'est parti :

Command
$ mysql_secure_installation
 
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
 
 
In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
 
Enter current password for root (enter for none):

Faites juste "Entrée", car il n'y a pas de mot de passe par défaut

OK, successfully used password, moving on...
 
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
 
You already have a root password set, so you can safely answer 'n'.
 
Change the root password? [Y/n]

Répondez "y" et changez le mot de passe

By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.
 
Remove anonymous users? [Y/n]

Répondez "y" pour supprimer les utilisateurs anonymes

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.
 
Disallow root login remotely? [Y/n]

Répondez "y" pour ne pas autoriser root à se connecter à distance

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.
 
Remove test database and access to it? [Y/n]

Répondez "y" pour supprimer la base de test

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
 
Reload privilege tables now? [Y/n]

Et enfin répondez "y" pour recharger les privilèges des tables

Cleaning up...
 
 
 
All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.
 
Thanks for using MySQL!

Tout est terminé, vous pouvez maintenant utiliser votre base.

3.1 Création d'une base de donnée

Pour créer une base de donnée, voici la commande a effectuer :

Command
create database nom_de_la_base;

3.2 Création d'un utilisateur

Pour créer un utilisateur :

Command
create user 'user'@'localhost' identified by 'password';
GRANT USAGE ON * . * TO 'user'@'localhost' IDENTIFIED BY 'password';
grant SELECT, INSERT, UPDATE, DELETE on `nom_de_la_base` .* to 'user'@'localhost';
flush privileges;

3.3 Changer le mot de passe d'un utilisateur

Pour changer le mot de passe d'un utilisateur, c'est simple :

Command mysql
SET PASSWORD FOR 'debian-sys-maint'@'localhost' = PASSWORD('newpass');

Cette commande intègre le flush privileges, donc pas besoin de la taper par la suite :-)

3.4 Modifier les droits d'un utilisateur

Si par exemple, je souhaite changer le hostname de connexion de tous les utilisateurs :

Command
UPDATE mysql.USER SET host = '10.0.0.%' WHERE host = 'localhost' AND USER != 'root';
UPDATE mysql.db SET host = '10.0.0.%' WHERE host = 'localhost' AND USER != 'root';
FLUSH PRIVILEGES;

3.5 Supression d'un utilisateur

Avant de supprimer un utilisateur, il est conseillé de lister les privilèges, afin de révoquer des droits actuels :

Command
SHOW grants FOR <user>;

Puis on révoque :

Command
REVOKE ALL privileges FROM <user>;

Et enfin, on supprime l'utilisateur :

Command
DROP USER 'user'@'localhost';

3.6 Lister les process en cours

Command show
mysql> show processlist;
+----+-------------+-----------------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| Id | User        | Host            | db   | Command | Time | State                                                                       | Info             |
+----+-------------+-----------------+------+---------+------+-----------------------------------------------------------------------------+------------------+
|  1 | system user |                 | NULL | Connect |  601 | Connecting to master                                                        | NULL             |
|  2 | system user |                 | NULL | Connect |  601 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |
|  8 | root        | localhost:36538 | NULL | Query   |    0 | NULL                                                                        | show processlist |
+----+-------------+-----------------+------+---------+------+-----------------------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)

3.7 Renommer une base de données

Command renamedb
#!/bin/sh
olddb=olddb
newdb=newdb
user=root
pass='password'
port=3306
 
echo "######### COPY / PASTE THOSE LINES TO RENAME DATABASE #########"
echo ""
gettables=\`mysql -u\$user \$pass -P\$port -e "show tables from \$olddb;" | grep -v "Tables_in_\$olddb" | grep -v "+" | grep -v "^mysql" | awk '{print \$1}'\`
for i in \`echo \$gettables | tr '\n' ' '\` ; do
echo "RENAME TABLE \$olddb.\$i TO \$newdb.\$i;"
done
mysql -u\$user \$pass -P\$port -e "use \$newdb" > /dev/null 2>&1 || echo "############################ WARNING ##########################\nTHE NEW DATABASE \"\$newdb\" DOES NOT EXIST. please create it first\n###############################################################"

Lancez ce script et il renommera table par table pour enfin créer la nouvelle database. C'est la méthode recommandée par MySQL.

3.8 Connaître la taille d'une base de données

pour obtenir la taille de toutes les bases de données en Mo :

Command mysql
SELECT table_schema,round(SUM(data_length+index_length)/1024/1024,4) AS "Size (MB)"
FROM information_schema.TABLES
GROUP BY table_schema;

Si l'on souhaite la taille d'une table uniquement, il faudra préciser le nom de cette dernière (champ table_name), ainsi que le nom de la base de données (champ table_schema) :

Command mysql
SELECT table_schema,round(SUM(data_length+index_length)/1024/1024,4)
FROM information_schema.TABLES
WHERE table_schema = 'mysql'
AND TABLE_NAME = 'user';

4 Se connecter avec des identifiants par défaut

Il peut être utile de pouvoir se connecter de façon simple sans avoir à entrer ses identifiants. Voici une méthode très simple qui consiste à entrer dans votre home un fichier contenant ces identifiants :

Configuration File ~/.my.cnf
[client]
user=root
password=password

Appliquez ensuite les bons droits :

Command chmod
chmod 600 ~/.my.cnf

Connectez vous sans identifiants :-)

5 FAQ

5.1 Comment resetter son mot de passe root quand on l'a perdu ?

Have you ever forgotten the root password on one of your MySQL servers? No? Well maybe I’m not as perfect as you. This is a quick h00tow (how to) reset your MySQL root password. It does require root access on your server. If you have forgotten that password wait for another article :

First things first. Log in as root and stop the mysql daemon. Now lets start up the mysql daemon and skip the grant tables which store the passwords.

Command mysqld_safe
mysqld_safe --skip-grant-tables --skip-networking &

You should see mysqld start up successfully. If not, well you have bigger issues. Now you should be able to connect to mysql without a password.

Command mysql
$ mysql --user=root mysql

update user set Password=PASSWORD('new-password') WHERE user = 'root';
flush privileges;
exit;

Now kill your running mysqld, then restart it normally. You should be good to go. Try not to forget your password again.

5.2 Fatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist

Si vous obtenez ce genre de message au boot de mysql :

Fatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist

Vous devez recontruire les bases manquantes comme ceci :

Command
mysql_install_db --user=mysql --ldata=/new-data-location
mysqld_safe --datadir=/new-data-location --user=mysql &

6 Ressources

Optimising MySQL under Sun
MySQL Utils : des beaux graphs cacti pour Monitorer MySQL
Setting Changing And Resetting MySQL Root Passwords
Monolith-toolkit : outils faciles pour l'administration complexe de MySQL