22
0
Fork 0

relecture [1/n]

This commit is contained in:
gcolpart 2016-12-16 00:41:21 +01:00
parent 8da6863542
commit bae9ecbc6e
1 changed files with 167 additions and 43 deletions

View File

@ -1,24 +1,42 @@
---
categories: web
title: Howto MySQL : installation et utilisation courante.
...
Documentation officielle : <http://dev.mysql.com/doc/refman/5.5/en/>
Documentation : <http://dev.mysql.com/doc/refman/5.5/en/>
[MySQL](https://www.mysql.com/) est une base de données très populaire au sein des infrastructures web. Nous utilisons au choix la version libre de MySQL distribuée par Oracle, et [MariaDB](https://mariadb.org/) un fork créé en 2009 par le créateur initial de MySQL.
## Installation
Sous Debian Wheezy et Jessie, on trouve par défaut la version 5.5 :
Pour la version libre de MySQL distribuée par Oracle :
~~~
# apt install mysql-server
$ mysql --version
mysql Ver 14.14 Distrib 5.5.53, for debian-linux-gnu (x86_64) using readline 6.3
~~~
Pour MariaDB :
~~~
# apt install mariadb-server-10.0
$ mysql --version
mysql Ver 15.1 Distrib 10.0.28-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
~~~
L'installation sous Debian demande un mot de passe pour le superutilisateur (par défaut *root*) de MySQL.
En laissant un mot de passe vide, on peut se connecter sans mot de passe :
On vérifie ensuite que tout s'est bien passé :
~~~
# mysql
$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 19425
Server version: 5.5.52-0+deb8u1 (Debian)
Your MySQL connection id is 45
Server version: 5.5.53-0+deb8u1 (Debian)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
@ -28,64 +46,170 @@ owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql>
~~~
Il est ensuite fortement conseillé de créer un administrateur pour la base de données
(par exemple « adminmysql », car « root » peut prêter à confusion) :
Il faut ensuite mettre un mot de passe pour le superutilisateur de MySQL, on conseille d'utiliser l'identifiant *adminmysql* car *root* peut prêter à confusion :
~~~
mysql> GRANT ALL PRIVILEGES ON *.* TO adminmysql@localhost IDENTIFIED BY 'XXX' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO adminmysql@localhost IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;
mysql> DELETE FROM mysql.user where User='root';
~~~
On notera sous Debian la présence d'un utilisateur `debian-sys-maint` qui sert à certains scripts Debian :
On notera sous Debian la présence d'un utilisateur *debian-sys-maint* qui sert à certains scripts Debian :
il ne doit pas être supprimé ! Au niveau sécurité, le mot de passe est généré à l'installation
(stocké dans `/etc/mysql/debian.cnf` qui doit évidemment n'être lisible que par `root`) par la commande :
(stocké dans `/etc/mysql/debian.cnf` lisible que par *root*) par la commande :
~~~
perl -e 'print map{("a".."z","A".."Z",0..9)[int(rand(62))]}(1..16)'
~~~
Enfin, on peut utiliser un fichier `.my.cnf` pour conserver les login/pass. Par exemple pour root, dans `/root/.my.cnf` :
Enfin, on peut utiliser un fichier `.my.cnf` pour conserver l'identifiant et le mot de passe.
Par exemple pour *root*, dans `/root/.my.cnf` :
~~~{.ini}
[client]
user = adminmysql
password = XXX
password = PASSWORD
~~~
Pour changer le mot de passe, on fera simplement :
~~~
# mysqladmin password <nouveau-pass-pour-adminmysql>
# mysqladmin password PASSWORD
~~~
## Configuration
Les fichiers de configuration se trouvent dans `/etc/mysql/` et notamment `my.cnf` qui centralise toutes les directives.
Les fichiers de configuration se trouvent dans `/etc/mysql/` et notamment `my.cnf` qui centralise les directives par défaut.
Sous Debian, les journaux de MySQL (démarrage, erreurs, infos) sont envoyés à syslog
Les `binlogs` (trace de toutes les requêtes exécutées) sont dans `/var/log/mysql/`
Par défaut, MySQL écoute en TCP/IP sur `127.0.0.1`. Pour activer les connexions réseau
à distance, il suffit de modifier la ligne suivante dans le fichier `my.cnf` :
Le fichier `/etc/mysql/conf.d/z_evolinux.cnf` contient nos optimisations basiques :
~~~{.ini}
[mysqld]
###### Connexions
# Maximum de connexions concurrentes (defaut = 100)... provoque un "Too many connections"
max_connections = 250
# Maximum de connexions en attente en cas de max_connections atteint (defaut = 50)
back_log = 100
# Maximum d'erreurs avant de blacklister un hote
max_connect_errors = 10
# Loguer les requetes trop longues
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 10
###### Tailles
# Taille reservee au buffer des index MyIsam
# A ajuster selon les resultats
key_buffer_size = 512M
# Taille max des paquets envoyés/reçus … provoque un "Packet too large"
max_allowed_packet = 64M
# Taille de la memoire reserve pour un thread
thread_stack = 192K
# A mettre le nombre de threads CPU alloues pour MySQL
thread_cache_size = 1
# Taille maximum des tables de type MEMORY
max_heap_table_size = 64M
###### Cache
# max_connections x nbre max de tables dans une jointure (defaut = 64)
table_cache = 4096
table_open_cache = 4096
table_definition_cache = 4096
# Taille max des requetes cachees (defaut = 1M)
query_cache_limit = 8M
# Taille reservee pour le cache (defaut = 0)
query_cache_size = 256M
# Type de requetes a cacher (defaut = 1 : tout peut etre cache)
query_cache_type = 1
# Cache tables
max_heap_table_size = 128M
tmp_table_size = 128M
###### InnoDB
# Si InnoDB n'est pas utilise... le desactiver
#skip-innodb
# En general, il est plus optimum d'avoir un fichier par table
innodb_file_per_table
# Taille memoire allouee pour le cache des datas et index
# A ajuster en fonction de sa RAM (si serveur dedie a MySQL, on peut aller jusqu'a 80%)
innodb_buffer_pool_size = 512M
# Taille buffer memoire pour structures internes InnoDB
innodb_additional_mem_pool_size = 16M
# Nombre maximum de threads systeme concurents
innodb_thread_concurrency = 16
# Ajuste la valeur des logs InnoDB
# (attention, il faut ensuite stopper MySQL et effacer les fichiers ib_logfile*)
#innodb_log_file_size = 128M
#innodb_log_files_in_group = 2
###### Misc
# charset utf8 par defaut
default-character-set = utf8
collation-server = utf8_unicode_ci
~~~
Le fichier `/etc/mysql/conf.d/zzz_evolinux.cnf` contient nos optimisations spécifiques.
Par défaut, MySQL écoute en réseau sur `127.0.0.1` (port TCP/3306) et sur la socket Unix `/var/run/mysqld/mysqld.sock`
Pour activer les connexions réseau à distance, il faut ajouter la configuration suivante dans `zzz_evolinux.cnf` :
~~~{.ini}
[mysqld]
bind-address = 0.0.0.0
~~~
Selon les ressources de la machine, il faut optimiser les directives dans `my.cnf` (par défaut, la configuration est adaptée… pour un petit serveur !).
Sous Debian, on trouvera quelques exemples dans le répertoire `/usr/share/doc/mysql-server-5.5/examples/`
Selon les ressources de la machine, il faut optimiser davantage les options (par défaut, la configuration est adaptée pour une machine avec très peu de mémoire vive !). Sous Debian, on trouvera quelques exemples dans le répertoire `/usr/share/doc/mysql-server-5.5/examples/`
Pour plus d'information sur l'optimisation, consultez le guide [/MySQL/HowtoOptimize]().
On conseille au minimum d'ajuster *thread_cache_size* et *innodb_buffer_pool_size* :
~~~{.ini}
[mysqld]
# Nombre de threads CPU alloués pour MySQL
thread_cache_size = 2
# Mémoire allouée pour le cache InnoDB (si serveur dédié, on peut aller jusqu'à 80% de la RAM)
innodb_buffer_pool_size = 2G
~~~
Pour plus d'informations sur l'optimisation avancée de MySQL, consultez le guide [/MySQL/HowtoOptimize]().
## datadir / tmpdir
Par défaut, le *datadir* (le répertoire où sont stockées les données brutes) est `/var/lib/mysql/`.
Pour diverses raisons il peut être intéressant de le déplacer (partition ou disque dédié etc.).
Pour des raisons de compatibilité, on conseille de conserver un lien symbolique :
~~~
# systemctl stop mysql
# mv /var/lib/mysql /srv/mysql-datadir
# ln -s /srv/mysql-datadir /var/lib/mysql
# systemctl start mysql
~~~
Pour certaines opérations lourdes, MySQL a besoin d'un *tmpdir* (répertoire où il va écrire des tables temporaires).
Par défaut il utilise `/tmp` mais vu qu'il est parfois nécessaire d'avoir plusieurs Go de libre, on pourra utiliser un répertoire différents :
~~~{.ini}
[mysqld]
tmpdir = /srv/mysql-tmpdir
~~~
## Logs
Sous Debian, les journaux de MySQL (démarrage, arrêt, erreurs, informations) sont envoyés via *syslog*.
Par défaut, ils seront donc visibles dans `/var/log/syslog`.
Le répertoire `/var/log/mysql/` contient les *binlogs* (trace de toutes les requêtes INSERT/UPDATE/DELETE exécutées).
## Utilisation courante
Créer une nouvelle base de données nommée _NOM_BASE_ :
Créer une nouvelle base de données nommée _foo_ :
~~~
mysql> CREATE DATABASE NOM_BASE;
mysql> CREATE DATABASE foo;
~~~
Voir les bases de données créées :
@ -94,10 +218,10 @@ Voir les bases de données créées :
mysql> SHOW DATABASES;
~~~
Utiliser la base de données _NOM_BASE_ :
Utiliser la base de données _foo_ :
~~~
mysql> USE NOM_BASE
mysql> USE foo
~~~
Voir les tables créées :
@ -106,10 +230,10 @@ Voir les tables créées :
mysql> SHOW TABLES;
~~~
Créer une table nommée test avec différents champs :
Créer une table nommée _bar_ avec différents champs :
~~~
mysql> CREATE TABLE test (id INT not null AUTO_INCREMENT, prenom VARCHAR
mysql> CREATE TABLE bar (id INT not null AUTO_INCREMENT, prenom VARCHAR
(50) not null , nom VARCHAR (50) not null , ne_le DATE not null ,
ville VARCHAR (90), enfants INT, PRIMARY KEY (id));
~~~
@ -117,74 +241,74 @@ ville VARCHAR (90), enfants INT, PRIMARY KEY (id));
Décrire une table :
~~~
mysql> DESC test;
mysql> DESC bar;
~~~
Ajouter un champ à une table :
~~~
mysql> ALTER TABLE test ADD another VARCHAR(100) DEFAULT NULL;
mysql> ALTER TABLE bar ADD another VARCHAR(100) DEFAULT NULL;
~~~
Ajouter un champ à une table en précisant sa place :
~~~
mysql> ALTER TABLE test ADD another VARCHAR(100) DEFAULT NULL AFTER prenom;
mysql> ALTER TABLE bar ADD another VARCHAR(100) DEFAULT NULL AFTER prenom;
~~~
Supprimer un champ à une table :
~~~
mysql> ALTER TABLE test DROP another;
mysql> ALTER TABLE bar DROP another;
~~~
Renommer un champ :
~~~
mysql> ALTER TABLE test CHANGE COLUMN another anotherone TEXT;
mysql> ALTER TABLE bar CHANGE COLUMN another anotherone TEXT;
~~~
Changer le type d'un champ :
~~~
mysql> ALTER TABLE test CHANGE another another enum('foo',bar');
mysql> ALTER TABLE bar CHANGE another another enum('foo',bar');
~~~
Insertion de données dans une table :
~~~
mysql> INSERT INTO test VALUES (1,'jp','papin','2005-06-12','Marseille',2);
mysql> INSERT INTO bar VALUES (1,'jp','papin','2005-06-12','Marseille',2);
INSERT INTO test (id,prenom,nom,ne_le) VALUES (2,'c','waddle','2004-06-17');
~~~
Sélectionner tous les champs d'une table :
~~~
mysql> SELECT * FROM test;
mysql> SELECT * FROM bar;
~~~
Effacer des données d'une table :
~~~
mysql> DELETE FROM test WHERE nom='waddle';
mysql> DELETE FROM bar WHERE nom='waddle';
~~~
Effacer TOUTES les données d'une table :
~~~
mysql> DELETE FROM test;
mysql> DELETE FROM bar;
~~~
Supprimer une table :
~~~
mysql> DROP TABLE test;
mysql> DROP TABLE bar;
~~~
Supprimer une base de données :
~~~
mysql> DROP DATABASE NOM_BASE;
mysql> DROP DATABASE foo;
~~~
## Administration
@ -192,9 +316,9 @@ mysql> DROP DATABASE NOM_BASE;
On crée une base de données et un utilisateur associé :
~~~
# mysqladmin create NOM_BASE
# mysqladmin create foo
# mysql
mysql> GRANT ALL PRIVILEGES ON NOM_BASE.* TO 'USER_BASE'@localhost IDENTIFIED BY 'XXX';
mysql> GRANT ALL PRIVILEGES ON foo.* TO 'jdoe'@localhost IDENTIFIED BY 'PASSWORD';
~~~
Cette opération revient à insérer des lignes brutes dans les tables `mysql.user` et `mysql.db` :