3.1 : Les fichiers de configuration : my.cnf (linux) ou my.ini (Windows) Dans le datadir, regardez les fichiers de configuration par défaut qui sont proposés.
On trouve le lien suivant :
http://dev.mysql.com/doc/mysql/en/option-files.html
Ca ramène à la vesion 8, et on trouve l’équivalent dans les autres versions.
https://dev.mysql.com/doc/refman/8.0/en/option-files.html
Les fichiers my.cnf (Linux) ou my.ini (Windows) sont des fichiers de configuration appelés aussi
« option file ».
Ils permettent de définir des éléments de configuration du serveur ou des clients.
Syntaxe
Ils sont au format ASCII
Ils sont constitués de plusieurs sections.
Chaque section commence par l’option : [section]
Les sections correspondent au serveur ou à des clients : [mysqld], [mysql], [mysqladmin], etc.
Les lignes de commentaires commencent par un # Exemple
# Example MySQL config file for small systems.
[client]
Où placer les fichiers de configuration ?
On peut ajouter un fichier my.ini dans le BASEDIR et préciser dedans ce qu’on souhaite ajouter à la configuration par défaut.
Exemple et exercice : modification de la langue Modifier la langue du serveur.
Le fichier peut dont par exemple ne faire que 2 lignes :
[mysqld]
language = french
Vérifiez que le serveur a bien pris en compte la nouvelle langue.
Les fichiers types
La version 5.5 de MySQL propose 4 fichiers types : my-small.ini, my-medium.ini, my-large.ini, my-huge.ini, my-innodb-heavy-4G.ini
Les configuration « small » jusqu’à « huge » servent en fonction de la mémoire vive nécessaire pour faire tourner le serveur. “huge” est adaptée à un serveur entièrement dédié à MySQL.
La configuration « innodb-heavy » est adapté à : 4GB RAM, InnoDB only, ACID, few connections, heavy queries.
3.2 : Les variables systèmes
Présentation
Le serveur (mysqld) et les clients (mysql) conservent des variables système qui indiquent de quelle manière ils se trouvent configurés.
Toutes les variables système ont des valeurs par défaut : elles peuvent valoir ‘’. Elles ne valent jamais NULL.
Variables globales et variables locales Il existe deux sortes de variables :
• Les variables globales valent pour tous les clients du serveur : « global ».
• Les variables locales valent uniquement pour un client donné : « local » ou « session ».
Certaines variables ont une valeur locale et une valeur globale.
Certaines variables n’ont qu’une valeur globale.
A noter que la majorité des variables ont la même valeur en global et en local.
Consultation des variables système Afficher toutes les variables de la session
mysql> Show variables
C’est un équivalent à :
mysql> Show session variables
C’est un équivalent à :
mysql> Show local variables
Afficher toutes les variables du serveur
mysql> Show global variables
C’est un équivalent à :
shell>mysqladmin variables –uroot -p
Afficher certaines variables locales
Pour repérer informations sur des répertoires :
mysql> Show variables like ‘%dir%’;
Pour connaître la taille des buffers :
mysql> Show variables like ‘%buffer%’;
Pour les informations sur les tables :
mysql> Show variables like ‘%table%’;
Afficher une variable locale
mysql> Show variables like ‘sql_mode’;
C’est un équivalent à :
mysql> Select @@sql_mode;
C’est un équivalent à :
mysql> Select @@session.sql_mode;
C’est un équivalent à :
mysql> Select @@local.sql_mode;
Afficher une variable global
mysql> Show global variables like ‘sql_mode’;
C’est un équivalent à :
mysql> Select @@global.sql_mode;
Modifications des variables système
La valeur d’une variable système peut être définie de trois façons :
• au démarrage du serveur
• en paramétrant le fichier de configuration
• dynamiquement dans la calculette SQL avec la commande SET. Cette dernière possibilité n’est pas possible pour toutes les variables système (par exemple, la langue ne peut pas être modifiée dynamiquement).
Au démarrage du serveur
Option --nom_var=valeur au lancement de mysqld.
Ø Exemple
shell> mysqld –-key_buffer_size=32M
Via la commande SET de la calculette SQL Passer localement en InnoDB par défaut :
mysql> set local default_storage_engine = “InnoDB”;
C’est un équivalent à :
mysql> set @@default_storage_engine = “InnoDB”;
C’est un équivalent à :
mysql> set @@local.default_storage_engine = “InnoDB”;
C’est un équivalent à :
mysql> set @@session.default_storage_engine = “InnoDB”;
Passer globalement en InnoDB par défaut :
mysql> set global default_storage_engine = “InnoDB”;
Via les fichiers de configuration Mettre les messages en français :
[mysqld]
language = French
Définition de valeur maximum
On peut ajouter le préfixe « maximum-» devant le nom d’une variable pour définir la valeur maximum pour cette variable.
Option --maximum-nom_var=valeur au lancement de mysqld.
Quelques variables système du serveur basedir
Chemin vers le répertoire d’installation.
datadir
Chemin vers le répertoire des données.
language
Langue utilisée.
log
Il existe de nombreuses variables contenant le mot clé « log ». Certaines permettent de définir des répertoires pour des fichiers de log. Par exemple le fichier de log des requêtes lentes (slow_query_log), le fichier général de log.
max_connections
Cette option permet de définir le nombre maximum de clients.
skip_show_database
Cette option permet de limiter la visibilité des databases aux utilisateurs qui ont les droits.
sql-mode
Permet de donner une valeur à sql-mode. Cf § suivant.
tmpdir
Chemin vers le répertoire des fichiers temporaires.
default_storage-engine
Type de table (c’est-à-dire moteur de stockage) par défaut. Equivalent à table-type.
version
Affiche les informations sur la version
Exemple : choix d’un moteur InnoDB par défaut
Les installations standard de MySQL paramètrent le moteur InnoDB par défaut.
Toutefois, dans les installations WAMP, c’est le moteur MyISAM qui est paramétré par défaut.
Comment passer à un moteur InnoDB par défaut ? En paramétrant le fichier de configuration
[mysqld]
default_storage_engine=InnoDB
Si le fichier my.ini n’existe pas, on peut le créer avec ces seules instructions.
Puis on place le fichier dans le datadir.
Cette solution est facile à mettre en œuvre avec WAMP.
On démarrant le serveur avec une option
On peut aussi lancer le serveur avec une option :
shell> mysqld -–default_storage_engine =InnoDB
Cette solution est compliquée à mettre en œuvre avec WAMP.
En paramétrant le client ou le serveur pendant qu’ils fonctionnent
La plupart des paramètres de mysqld (options de démarrage) peuvent être définis sans arrêter le serveur en modifiant des variables du système.
Mysql> SELECT @@global.default_storage_engine;
Mysql> SET GLOBAL default_storage_engine = ‘InnoDB’ ; Mysql> SET LOCAL default_storage_engine = ‘InnoDB’ ; Mysql> SELECT @@global.default_storage_engine;
Le GLOBAL affecte les opérations de tous les clients qui se connecteront. Mais ça n’affecte pas le client courant.
Le LOCAL affecte le client courant.
Exercice
Vérifiez votre quel est votre moteur par défaut.
Créer une BD et une table sans préciser le moteur. Vérifiez qu’elle a été créée avec le moteur par défaut.
Changer de moteur par défaut. Créez une deuxième table. Vérifiez qu’elle a été crée avec le nouveau moteur par défaut.
3.3 : Les variables d’état du serveur
http://dev.mysql.com/doc/refman/5.0/fr/show-status.html
http://dev.mysql.com/doc/refman/5.0/fr/server-status-variables.html
Le serveur conserve de nombreuses variables d’état qui fournissent des informations concernant ses opérations.
Consultation des valeurs des variables d’état
mysql> Show status
C’est un équivalent à :
shell> mysqladmin extended-status
Consultation de certaines valeurs des variables d’état
mysql> Show status like ‘threads%’;
Remise à zéro des variables d’état
mysql> flush status
Quelques variables d’état du serveur Aborted_clients
Nombre de connexions interrompus parce que le client était mort sans fermer correctement la connexion.
Flush_commands
Nombre de flush exécutés Handler_update
Nombre de mises à jour de la BD Innodb_rows_updated
Nombre de mises à jour de la BD en InnoDB Sort_rows
Nombre de lignes triées.
Threads_connected
Nombre de connexions en cours Threads_created
Nombre maximum de connexions qu’il y a eu.
Uptime
Durée de fonctionnement du serveur, en secondes.
Uptime_since_flush_status
Durée depuis le dernier flush statut.
3.4 : Options mysqld en ligne de commande
Présentation
http://dev.mysql.com/doc/refman/5.0/fr/command-line-options.html mysqld est lancé automatiquement par certains scripts dont le « restart ».
Toutefois, en tant qu’administrateur, il faut pouvoir contrôler l’usage direct de « mysqld ».
On peut lancer mysqld, mysql_safe et tous les scripts appelant mysqld avec des options.
Les options de lancement du serveur correspondent pour la plupart aux variables système du serveur.
On liste ici quelques options importantes. Pour plus de détails, il faut se référer au manuel de référence.
Les options se passent avec « -- » suivi du nom complet, ou un « - » suivi de l’initiale.
Quelques options de mysqld - - ansi
utilise la syntaxe standard ANSI au lieu de la syntaxe MySQL. Cette option intègre le
« ONLY_FULL_GROUP_BY »
- - basedir=chemin, -b chemin
Chemin vers le répertoire d’installation.
- - datadir=chemin, -h chemin
Chemin vers le répertoire des données.
- - default-table-type=type
Type de table (c’est-à-dire moteur de stockage) par défaut.
- - language=nom_langue, -L nom_langue
- - log[=fichier], -l chemin [fichier]
Journalise les connexions et les requêtes dans le fichier spécifié. Par défaut : nom_hôte.log est le fichier de log.
Il y a d’autres sorte de fichiers de log. Cf. documentation.
- - skip-grant-tables
Permet de relancer le serveur sans gestion des droits des utilisateurs. Utile quand on a perdu le mot de passe de root !
- - skip-innodb
Désactive le moteur de stockage innodb. Cette option économise de la mémoire et accélère certaines opérations. A utiliser uniquement si on n’a pas de tables innodb.
- - skip-show-database
Cette option permet de limiter la visibilité des databases aux utilisateurs qui ont les droits.
- - sql-mode=valeur[,valeur …]
Permet de donner une valeur à sql-mode. Cf § suivant.
- - transaction-isolation=niveau
Définit le niveau d’isolation des transactions, qui peut-être UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ ou SERIALIZABLE.
- - tmpdir=chemin, -t chemin
Chemin vers le répertoire des fichiers temporaires.
- - user={nom_utilisateur | id_utilisateur }, -u {nom_utilisateur | id_utilisateur }
Exécuter mysqld sous une identité précisé par un nom ou un id. Cette identité fait référence à un compte de connexion système (linux) et non pas à un utilisateur MySQL.
Cette option est obligatoire quand mysqld est démarré sous l’identité root.
Cf. le chapitre sur la sécurité.
- - version, -V
Affiche les informations sur la version et quitte.
Equivalent à mysqladmin - V
3.5 : Les modes SQL du serveur : sql-mode
Présentation
Les modes SQL du serveur :
https://dev.mysql.com/doc/refman/5.5/en/sql-mode.html https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html
MySQL inclut des extensions qu’on ne trouve pas dans d’autres bases de données SQL.
Si elles sont utilisées, le code ne sera pas portable vers d’autres serveurs SQL.
La variable « sql-mode » peut prendre plusieurs valeurs qu’on appelle des « modes » et qui paramètrent les caractéristiques du SQL du serveur et qui permettent de mieux gérer la compatibilité entre SGBD.
Les valeurs de sql_mode par défaut Version 5.5 : slq_mode = ‘’
Version 5.6 : sql_mode= ‘NO_ENGINE_SUBSTITUTION’
Version 5.7
mysql> select @@sql_mode;
+---+
| @@sql_mode | +---+
|ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE, |
|NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER, |
|NO_ENGINE_SUBSTITUTION |
|ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE, |
|NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | +---+
Regroupement de modes : ANSI et STRICT_TRANS_TABLES
https://dev.mysql.com/doc/refman/5.5/en/sql-mode.html#sql-mode-important Mysql définit des mots clés regroupant plusieurs « modes ».
ANSI
Equivalent à :
REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, ONLY_FULL_GROUP_BY, ANSI
Le mode ANSI contient un ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES
Equivalent à un ensemble de mode élémentaires.
Pour gérer un environnement transactionnel de type InnoDB.
Le mode STRICT_TRANS_TABLES ne contient pas de ONLY_FULL_GROUP_BY ONLY_FULL_GROUP_BY
Le mode ONLY_FULL_GROUP_BY n'autorise pas les requêtes dont la clause GROUP BY fait référence à une colonne qui n'est pas sélectionnée. C’est la situation standard du SQL (Toutefois ce mode est une nouveauté en MySQL 4.0.0.)
Sans ONLY FULL GROUP BY, on peut écrire :
SELECT O.NO, L.editeur, count(*) FROM Livres L
JOIN OEuvres O on O.NO=L.NO GROUP BY O.NO;
Ce qui ne veut rien dire.
Il aurait fallu écrire par exemple :
SELECT O.NO, count(*) FROM Livres L
JOIN OEuvres O on O.NO=L.NO GROUP BY O.NO;
A noter qu’on peut aussi écrire légitimement (avec un ONLY_FULL_GROUP_BY) :
SELECT O.NO, O.auteur, count(*) FROM Livres L
JOIN OEuvres O on O.NO=L.NO GROUP BY O.NO;
O.auteur n’est pas un attribut du GROUP BY mais le serveur se charge de savoir qu’il dépend fonctionnellement de O.NO : on peut donc le projeter sans risque d’incohérence.
Standardisation de MySQL : exécution en mode ONLY_FULL_GROUP_BY En paramétrant le fichier de configuration
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY
On démarrant le serveur avec une option
shell> mysqld --ansi
C’est équivalent à :
--transaction-isolation =SERIALIZABLE
--sql-mode=REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, ONLY_FULL_GROUP_BY
En paramétrant le client ou le serveur pendant qu’ils fonctionnent
La plupart des paramètres de mysqld (options de démarrage) peuvent être définis sans arrêter le serveur en modifiant des variables du système.
Ø Solution 1 :
Mysql> SELECT @@global.sql_mode ; +---+
| @@global.sql_mode |
+---+
| | +---+
Mysql> SET GLOBAL sql_mode = ‘ONLY_FULL_GROUP_BY’ ; Mysql> SET LOCAL sql_mode = ‘ONLY_FULL_GROUP_BY’ ; mysql> SELECT @@global.sql_mode ;
+---+
| @@global.sql_mode | +---+
| ONLY_FULL_GROUP_BY | +---+
Le GLOBAL affecte les opérations de tous les clients qui se connecteront. Mais ça n’affecte pas le client courant.
Le LOCAL affecte le client courant.
Ø Solution 2 :
On ajoute le ONLY_FULL_GROUP_BY à l’existant
set @@sql_mode = concat( @@sql_mode, ',ONLY_FULL_GROUP_BY');
set @@global.sql_mode =
concat( @@global.sql_mode, ',ONLY_FULL_GROUP_BY');
A noter la présence d’une virgule comme séparateur et le fait que le ONLY_FULL_GROUP_BY se retrouve à la fin.
A noter aussi que si l’ancien sql_mode contient déjà un ONLY_FULL_GROUP_BY, alors ça ne change rien.
Exercices
Testez les requêtes proposées.
Faîtes marcher la première requête.
Faites-en sorte que la première requête ne fonctionne plus.