MYSQL¶
Le fichier de configuration¶
le fichier de configuration est le fichier my.cnf qui se trouve habituellement dans /etc/mysql/ sinon dans /etc/mysql/mariadb.conf.d pour mariaDB
Grandes lignes my.cnf¶
- le port d'écoute de MySQLd : 3306
- différents dossiers utilisés par MySQLd
- le nom d'utilisateur des processus de MySQLd (qui est mysql)
- des paramètres liés à la performance (taille mémoire allouée, taille du cache ...)
- les fichiers de log
Fichier de log¶
Dans my.cnf décommenter :
general_log_file = /var/log/mysql/mysql.log
general_log = 1
Warning
logs très utiles mais consommateurs de ressources tueurs de perfs.
Ne pas hesiter à les activer pour du test mais désactiver en production !
Changer le répertoire de logs MyQSL¶
Nécessaire si trop d'IO sur le disque (log + datas)
my.cnf :
log-bin=/'chemindunouveaurépertoire'/mysql-bin
Info
Purger un maximum de logs (PURGE BINLOG...) pour ne pas avoir trop de fichiers à transférer.
Arrêter le service
service mysql stop
Déplacer les fichiers vers le nouveau répertoire
mv /var/lib/mysql /mysql-bin.* /chemindunouveaurépertoire/mysql-bin
Redémarrer le service
service mysql start
La directive bind-address¶
Cette directive sert à restreindre l'accès au service MySQLd. Seule la machine (et donc les logiciels outils installés dessus) indiquée dans cette directive peut accéder au service.
Si on veut accéder que par la machine local (localhost) :
bind-address = 127.0.0.1
Si on veut uniquement un serveur distant :
bind-address = "ip du serveur"
Si on veut ouvrir à tous les serveurs :
bind-address = 0.0.0.0
Info
Il n'y a pas de demie mesure, la sécurisation doit se faire en amont pour les serveur de données.
Sécurisation du service MySQL¶
mysql_secure_installation
Cela permet de :
- s'assurer de bien avoir un mot de passe root MySQL
- empêcher d'accéder en root MySQL depuis le réseau (par le socket MySQL ; par contre on accède à distance par SSH et ensuite on se connecte à SQL une fois rentré dans la machine donc en « local ».
- empêcher les connexions anonymes
- supprimer la base de test (accessible par défaut par tous, même anonymes) et les privilèges qui autorisent tout le monde à accéder à toutes les bases commençant par test_
Commandes MySQL (base)¶
Se connecter
mysql -h 'host '-u 'user' -p
-h
premet de préciser l'hôte (host)-u
permet de préciser l'utilisateur (user)-p
indique que nous allons ensuite taper le mot de passe (password)
Lister les bases
SHOW DATABASES;
Selectionner une base
USE "nom de la bdd";
Lister les tables d'une base
- si base selectionné
SHOW TABLES;
- sinon
SHOW TABLES FROM "nom de la bdd";
CREATE DATABASE "nom bdd";
Créer un utilisateur
CREATE USER 'user'@'localhost';
Affecter une mot de passe à un utilisateur
SET PASSWORD FOR 'user' = PASSWORD('mot de passe');
Donner tout les droits à un utilisateur sur un BD (voir "Les privilèges" pour les types de droits)
GRANT ALL PRIVILEGES ON 'BASE.*' TO user@localhost IDENTIFIED by 'mot de passe';
Revoquer les droits d'un utilisateur
REVOKE ALL PRIVILEGES ON 'BASE.*' FROM user;
Supprimer un compte utilisateur
DROP user 'test'@'localhost';
Les privilèges (droits)¶
Info
En matière de bases de données, on parle de privilèges pour parler des droits. Ces privilèges s'appliquent à des comptes. Tel compte à le droit de faire telle action.
Les information des utilisateurs et des privilèges sont stockées dans la base de données mysql :
- table user ➡️ utilisateurs (privilèges globaux)
Quatre tables pour stocker les privilèges users¶
db
: privilèges au niveau des bases de données.tables_priv
: privilèges au niveau des tables.columns_priv
: privilèges au niveau des colonnes.procs_priv
: privilèges au niveau des routines (procédures et fonctions stockées).
Droits principaux¶
GRANT
: le droit de donner des droitsCREATE
: Créer des utilisateurs, des bases, des tables ou des indexDROP
: Supprimer des utilisateurs, des bases, des tables ou des indexALTER
: modifier la structure de tablesDELETE
: Supprimer des donnéesINSERT
: Ajouter des donnéesUPDATE
: Modifier des données
Example
- Ajouter le droit de faire un INSERT sur la table « table1 » pour l’utilisateur “invite” :
GRANT INSERT ON table1 TO invite;
- Attribuer tous les droits à l’utilisateur “invite” sur la base de données utilisée :
GRANT ALL ON * TO invite;
- Retirer le droit de faire un INSERT sur toutes les tables de la BDD utilisée pour l’utilisateur « invite » :
REVOKE INSERT ON * FROM invite;
- Retirer le droit de faire un INSERT sur la table « table1 » pour l’utilisateur “invite” :
REVOKE INSERT ON table1 FROM invite;
- Retirer tous les droits à l’utilisateur “invite” sur toutes les tables de la BDD utilisée :
REVOKE ALL PRIVILEGES ON * FROM invite
Danger
ne jamais donner WITH GRANT OPTION à un utilisateur non administrateur système
Supervision¶
MySQLTuner¶
Script PERL qui permet d'optimiser les performances d'un serveur de bases de données MySQL en faisant un diagnostic, voir: https://github.com/major/MySQLTuner-perl
Mytop¶
Outil "top like" écrit en PERL mais pour les base de données. (intégré à deb9)
utilisation
mytop --prompt -d "base de donnée"
Si cela ne fonctionne pas , installer les dépendances PERL suivante :
apt-get install libconfig-inifiles-perl
Mysql only :
fichier de confg d'exemple dans /usr/share /doc/mysql-server-5.X.XX
Tuning¶
key_buffer
SHOW GLOBAL STATUS
ligne key_reads/key_read_requests
radio < 0.01 pour éviter accès disque
sinon augmenter le key_buffer
thread_concurrency (machine multicoeur)
Valeur à x2 nombre de coeurs
Activer le log des requêtes lentes
slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
Et demander d'indiquer le temps le plus lent
long_query_time = 2
Analyser les résultats
tail -n 1000 /var/log/mysql/mysql-slow.log
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Table%'; SHOW ENGINE INNODB STATUS (pour innodb)
Sauvegarde¶
mysqldump (à chaud)¶
bases précises
mysqldump --user=root -p --databases mysql wiki > wiki_bd_backup.sql
mysqldump --user=root -p --all-databases | gzip > save.mysql.sql.gz
backup à froid :¶
Elle consiste à sauvegarder les fichiers “physiques” du serveur de données. Elle nécessite, par définition l’arrêt du serveur.
Aucune activité n’est donc possible. C’est un avantage pour le DBA mais il est parfois difficile voire impossible de stopper l’activité en cours. En revanche si l’on dispose d’un réplica on peut tout à fait l’envisager. Celui ci se “re synchronisera” à son redémarrage. La sauvegarde à froid consiste à archiver certains fichiers du serveur**/var/lib/mysql/**
et **/var/log/mysql.log**
Pour les tables MyISAM il s’agit plus précisement des fichiers .FRM
, .MYI
et .MYD
. Pour les tables InnoDB : .FRM
, les fichiers de données (ibdata), les fichiers des tables .ibd (si vous êtes en innodb_file_per_table) et les fichiers journaux (iblogfile) intermédiaires.
Restauration¶
dump en selectionnant la base
use database; source /chemin/du/fichier/backup.sql
ou pour le scripting
mysql -u myuser -p < /chemin/du/fichier/backup.sql ( automatisation totale avec --password = < mot de passe >
Info
pour restaurer à froid, il suffit de couper le service et de déposer les fichiers aux bons emplacements
Automatisation des sauvegardes¶
automysqlbackup, Script "tout en un"
- Notification par mail
- Compression et chiffrement des sauvegardes
- Rotation des sauvegardes configurable
- Sauvegardes incrémentales
apt-get install automysqlbackup
à configure dans /etc/default/automysqlbackup
rsnapshot
apt-get install rsnapshot
voir https://wiki.debian-fr.xyz/Rsnapshot
outil de backup à chaud
Migration Mysql vers MariaDB (deb<9)¶
Maj du serveur Debian
apt-get update && apt-get upgrade
apt-get install python-software-properties software-properties-common
update des paquets et installe
apt-get update && apt-get install mariadb-server
Info
Si Mysql > 5.5 migration directement sur 10.1 sinon 5.5
Cluser MariaDB/Galera¶
Cluster synchro en maître-maître
Info
En production favoriser 3 serveurs minimum
Création du cluster
service mysql stop
mysqld --wsrep-new-cluster
#or
galera_new_cluster
service mysql stop mysqld --wsrep_cluster_address=gcomm://ip(ou nom DNS du serveur qui a créé le cluster)
SHOW STATUS LIKE 'wsrep_%'
Tip
configuration affinée voir http://www.severalnines.com/New-Galera-Configurator/index.html
Troubleshoot¶
Table corrompue¶
Message d'erreur
“Table is marked as crashed and should be repaired”
Solution
repair table bd.tablename;
Récupération de mot de passe root MySQL¶
arrêt du service et redémarrage en mode rescue
systemctl stop mysql && mysqld_safe --skip-grant-tables &
Connexion en root
mysql -u root
#select base mysql> use mysql; #change password mysql> update user set password=PASSWORD("nouveaumotdepasse") where user='root'; #save mysql> flush privileges; #leave mysql> quit
arrêt du mode rescue
systemctl stop mysql
test de connexion
mysql -u root -p