« Installation et configuration de MySQL » : différence entre les versions
(6 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 30 : | Ligne 30 : | ||
</pre> | </pre> | ||
Si mysql refuse de démarrer, c'est probablement un problème de permission. | Si mysql refuse de démarrer, c'est probablement un problème de permission. | ||
Par défaut sous debian, mysql | =Servir des requêtes sur le réseau= | ||
Par défaut sous debian, mysql/mariadb n'écoute que sur localhost. Si vous souhaitez écouter sur une ip autre (attention aux problèmes de sécurité que cela peut poser !), éditez la ligne suivante dans le fichier <code>/etc/mysql/mariadb.conf.d/50-server.cnf</code> : | |||
<pre>bind-address = 192.168.50.5</pre> | <pre>bind-address = 192.168.50.5</pre> | ||
=Le login root de MySQL= | =Le login root de MySQL= | ||
Après avoir lancé <code>mysql_secure_installation</code> vous avez du définir un mot-de-passe root et | Après avoir lancé <code>mysql_secure_installation</code> vous avez probablement du définir un mot-de-passe root et désactivé le login extérieur avec l'utilisateur mysql root. | ||
Par défaut sous | Par défaut sous Debian Buster, mariadb log l'utilisateur root avec le socket unix, sans mot-de-passe nécessaire : | ||
<pre>mysql -u root</pre> | <pre>mysql -u root</pre> | ||
Ligne 53 : | Ligne 55 : | ||
<pre>mysql -u root -p</pre> | <pre>mysql -u root -p</pre> | ||
Je vous recommande d'entrer le mot-de-passe root que vous avez défini dans <code>/etc/mysql/debian.cnf</code> | Je vous recommande également d'entrer le mot-de-passe root que vous avez défini dans <code>/etc/mysql/debian.cnf</code> sinon certains scripts risquent de ne plus fonctionner. Anciennement, debian créait un utilisateur debian-sys-maint à cet usage, ce n'est plus le cas depuis debian 9 qui configuré désormais l'utilisateur root à cet usage dans <code>/etc/mysql/debian.cnf</code> et parfois dans <code>/etc/dbconfig-common/*</code> | ||
Éventuellement, vous pouvez stocker le mot-de-passe root comme ceci dans <code>/root/.my.cnf</code> : | Éventuellement, vous pouvez stocker le mot-de-passe root comme ceci dans <code>/root/.my.cnf</code> (veillez bien à ce que ce fichier ne soit lisible que par l'utilisateur unix root) : | ||
<pre> | <pre> | ||
[client] | [client] | ||
Ligne 63 : | Ligne 65 : | ||
</pre> | </pre> | ||
Si vous souhaitez revenir à la configuration "passwordless" pour l'utilisateur root, tapez dans la console mysql : | |||
<pre>use mysql; update user set plugin='unix_socket' where user='root'; flush privileges;</pre> | <pre>use mysql; update user set plugin='unix_socket' where user='root'; flush privileges;</pre> | ||
Dernière version du 31 octobre 2021 à 12:45
Installation et configuration
Pour installer le serveur mariadb, tapez :
aptitude install mariadb-server mariadb-client
Puis lancez
mysql_secure_installation
Mariadb recommande d'éviter au maximum l'utilisation du swap. Définissez la ligne suivante par exemple dans /etc/sysctl.d/local.conf
:
vm.swappiness = 1
Changement du datadir
Stoppez le serveur :
/etc/init.d/mysql stop
Nous allons modifier la configuration de mysql afin de stocker les bases de données à un endroit plus propre. Pour cela, éditez le fichier /etc/mysql/my.cnf
, recherchez la ligne datadir
et remplacez la par :
datadir /srv/mysql
Copiez l'ancien répertoire de la base de donnée au nouvel emplacement et attribuez lui les bons privilèges :
rsync -av /var/lib/mysql/ /srv/mysql/
Essayez de lancer mysql :
/etc/init.d/mysql start
Si mysql refuse de démarrer, c'est probablement un problème de permission.
Servir des requêtes sur le réseau
Par défaut sous debian, mysql/mariadb n'écoute que sur localhost. Si vous souhaitez écouter sur une ip autre (attention aux problèmes de sécurité que cela peut poser !), éditez la ligne suivante dans le fichier /etc/mysql/mariadb.conf.d/50-server.cnf
:
bind-address = 192.168.50.5
Le login root de MySQL
Après avoir lancé mysql_secure_installation
vous avez probablement du définir un mot-de-passe root et désactivé le login extérieur avec l'utilisateur mysql root.
Par défaut sous Debian Buster, mariadb log l'utilisateur root avec le socket unix, sans mot-de-passe nécessaire :
mysql -u root
Le défaut de cette mécanique est qu'il va empêcher, par exemple, le login root avec phpmyadmin. Pour ré-activer le login root par mot-de-passe :
mysql -u root use mysql; update user set plugin='' where user='root'; flush privileges;
Désormais pour vous connecter à mysl vous devrez entrer un mot-de-passe :
mysql -u root -p
Je vous recommande également d'entrer le mot-de-passe root que vous avez défini dans /etc/mysql/debian.cnf
sinon certains scripts risquent de ne plus fonctionner. Anciennement, debian créait un utilisateur debian-sys-maint à cet usage, ce n'est plus le cas depuis debian 9 qui configuré désormais l'utilisateur root à cet usage dans /etc/mysql/debian.cnf
et parfois dans /etc/dbconfig-common/*
Éventuellement, vous pouvez stocker le mot-de-passe root comme ceci dans /root/.my.cnf
(veillez bien à ce que ce fichier ne soit lisible que par l'utilisateur unix root) :
[client] user=root password= socket=/var/run/mysqld/mysqld.sock
Si vous souhaitez revenir à la configuration "passwordless" pour l'utilisateur root, tapez dans la console mysql :
use mysql; update user set plugin='unix_socket' where user='root'; flush privileges;
Créer un utilisateur et lui attribuer les droits sur une base de donnée
Nous allons voir comment créer une base de donnée nommée plouf, puis un utilisateur plop ayant tous les droits sur cette base.
Pour commencer, créer la base de donnée plouf
:
mysql -u root -p mysql> create database plouf; GRANT ALL PRIVILEGES ON plouf.* TO "plop"@"localhost" IDENTIFIED BY 'password';
Vous pourrez désormais utiliser cette base avec l'utilisateur plop.
Sauvegarder et restaurer une base de donnée MySQL
Sauvegarde
Pour sauvegarder une base entière afin de la restaurer sur le même serveur mysql :
mysqldump -u root -p --opt nom_de_la_base > sauvegarde.sql
Pour sauvegarder une base entière afin de la restaurer sur un autre serveur mysql (ajout d'un champ créant la base de donnée):
mysqldump -u root -p --databases --opt nom_de_la_base > sauvegarde.sql
Pour sauvegarder uniquement une table d'une base :
mysqldump -u root -p --opt nom__de_la_base nom__de_la_table > sauvegarde.sql
L'option --opt
active les flags --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset
Restauration
Pour restaurer une table d'une base ou une base complète :
mysql -u root -p ma_base < sauvegarde.sql
Gérer facilement ses bases de données avec PhpMyAdmin
Phpmyadmin permet de gérer ses bases de données MySQL très facilement grâce à une interface web. Commençons par installer phpmyadmin :
aptitude install phpmyadmin
Lorsque l'installeur vous demandera s'il faut configurer automatiquement phpmyadmin sur un serveur web, ne cochez aucune case et validez.
Si par erreur vous avez validé l'autoconfiguration pour apache, vous pouvez toujours désactiver la configuration ajoutée avec
a2disconf phpmyadmin
L'installeur vous demandera ensuite s'il doit configurer la base de donnée de phpmyadmin avec dbconfig-common. Choisissez oui. A l'écran suivant, vous devrez entrer le mot-de-passe de votre utilisateur mysql root. Enfin, un invite vous demandera de choisir un mot-de-passe pour l'utilisateur phpmyadmin puis de le confirmer.
Par défaut, phpmyadmin s'installe dans /usr/share/phpmyadmin/
Bien-sur, vous voudrez probablement que phpmyadmin soit accessible grâce à l'un de vos site internet. Il suffit d'ajouter la ligne suivante dans le fichier de configuration de la vhost apache correspondante :
Include /etc/phpmyadmin/apache.conf
Si vous avez sécurisé votre installation php avec open_basedir
il faut préciser les arguments suivants pour php_admin_value open_basedir
dans la configuration de la vhost (/etc/apache2/sites/admin.domain.tld.conf
dans mon cas) :
php_admin_value open_basedir /srv/http/domain.tld/admin.domain.tld/:/usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/
Et enfin, si vous utilisez à la fois les modules php et suphp de apache, activez php pour phpmyadmin en ajoutant les lignes suivantes dans /etc/apache2/mods-enabled/php5.conf :
<Directory /usr/share/phpmyadmin>
php_flag engine on
</Directory>
Désormais, vous pouvez accéder à phpmyadmin par l'url correspondant au site pour lequel vous avez créé le lien. Dans mon cas :
http://admin.domain.tld/phpmyadmin/
Pour plus de sécurité, vous pouvez placer un fichier .htaccess
dans /usr/share/phpmyadmin/
afin de bloquer l'accès à phpmyadmin aux utilisateurs ne s'étant pas logué sur http://admin.domain.tld/
:
AuthType Digest
AuthName "administration interface"
AuthDigestProvider file
AuthDigestDomain /
AuthUserFile /srv/http/admin.domain.tld/.htpasswd
AuthGroupFile /srv/http/admin.domain.tld.htgroup
require group root user
Optimiser les réglages de MySQL
MySQLTuner est un petit script perl qui vous proposera des optimisations pour votre configuration MySQL en fonction des statistiques de votre utilisation.
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
chmod +x mysqltuner.pl
./mysqltuner.pl
Vous pouvez aussi essayer https://launchpad.net/mysql-tuning-primer
Optimiser les tables
mysqlcheck -o --all-databases
Quelques commandes MySQL
Je vais ici vous donner quelques requêtes mysql utiles ainsi qu'une courte description de leurs actions.
Donner la liste des bases de données :
mysql> SHOW DATABASES;
se placer dans la base blah. Il est nécessaire de se placer de cette manière dans une base avant de pouvoir en modifier les tables, champs, ...
mysql> use blah;
Donner la liste des tables de la base de donnée active :
mysql> SHOW TABLES;
Renvoyer tous les champs de la table "table" :
mysql> select * from table;
Renvoyer toute la colonne "column" de la table "table" :
mysql> select column from table;
Renvoyer la colonne "column" de la table "table" où le champ "pom" vaut "blah" :
mysql> select column from table where pom='blah'
Changer la valeur de la colonne "column" dans la table "table" à la ligne où "column2" vaut "blah" :
mysql> UPDATE table SET column='gnu' WHERE column2='blah';
Vider la table "table"
mysql> DELETE FROM table;
Supprimer la ligne où la colonne "column" vaut "blah" dans la table "table"
mysql> DELETE FROM table WHERE column='blah';
Supprimer la table "table" :
mysql> drop table table;
Supprimer la base blah :
mysql> drop database blah;