Différences
Ci-dessous, les différences entre deux révisions de la page.
elearning:workbooks:debian:6:avance:l125 [2019/11/24 06:40] – supprimée admin | elearning:workbooks:debian:6:avance:l125 [2020/02/21 07:40] (Version actuelle) – créée admin | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ~~PDF: | ||
+ | |||
+ | Dernière mise-à-jour : ~~LASTMOD~~ | ||
+ | |||
+ | ====== LRF135 - Gestion du Serveur MySQL sous CentOS 6====== | ||
+ | |||
+ | ===== Présentation, | ||
+ | |||
+ | ====Présentation de MySQL==== | ||
+ | |||
+ | %%MySQL%% comprend les outils suivants : | ||
+ | |||
+ | * **Un Serveur SQL** | ||
+ | * Un moteur qui permet d' | ||
+ | * **Les programmes clients pour accéder aux serveurs** | ||
+ | * Un programme interactif permet de saisir directement les requêtes et d' | ||
+ | * Plusieurs utilitaires et outils d' | ||
+ | * **Une bibliothèque client pour écrire vos propres programmes** | ||
+ | * Les programmes clients peuvent être écrits en C, car la bibliothèque est elle-même écrite en C. | ||
+ | * Elle intègre également toutes les bases nécessaires pour supporter d' | ||
+ | |||
+ | ===Développement=== | ||
+ | |||
+ | Le développement de MySQL depuis son rachat par la société Oracle en 2009 produit des versions différentes selon le cycle suivant : | ||
+ | |||
+ | * Création de une ou plusieurs versions successives dites **DMR** (// | ||
+ | * La sortie d'une ou de plusieurs versions successives dites **RC** (//Release Candidate// | ||
+ | * La sortie d'une version dite **GA** (// | ||
+ | |||
+ | <WRAP center round important> | ||
+ | A noter que MySQL existe en version 32 bits et 64 bits. | ||
+ | </ | ||
+ | |||
+ | MySQL existe en deux versions, la version communautaire qui est disponible sous la licence **[[http:// | ||
+ | |||
+ | * bénéficie du support d' | ||
+ | * contient des outils tels Enterprise Monitor, Query Analyzer et Enterprise Backup. | ||
+ | |||
+ | <WRAP center round important> | ||
+ | A noter qu'à un instant t, la version communautaire et la version Entreprise sont indentique. | ||
+ | </ | ||
+ | |||
+ | Ce cours se concentre sur la version communautaire. | ||
+ | |||
+ | ===Protocoles de Communication=== | ||
+ | |||
+ | MySQL propose 4 protocoles de communication : | ||
+ | |||
+ | ^ Protocole ^ Connexion ^ OS ^ Commentaire ^ | ||
+ | | TCP | Local et distant | Unix, Windows | Seul protocole de connexion à distance | | ||
+ | | Socket Unix | Local | Unix | Protocole par défaut pour les connexions locales | | ||
+ | | Shared Memory | Local | Windows | Zone de mémoire partagée entre le serveur et le client | | ||
+ | | Named Pipes | Local | Windows | Fichier permettant deux processus sans lien de parenté de communiquer | | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Le port TCP par défaut de MySQL est le **3306**. Il est possible de changer le port de communication de MySQL en éditant le fichier my.cnf. Pour se connecter sur un serveur distant il convient d' | ||
+ | </ | ||
+ | |||
+ | ===Architecture=== | ||
+ | |||
+ | L' | ||
+ | |||
+ | * Le serveur reçoit une requête du client, | ||
+ | * Le serveur regarde dans le cache des requêtes, si activé, | ||
+ | * Si la requête s'y trouve, le serveur renvoie le résultat du requête stocké dans le cache, | ||
+ | * Si la requête ne s'y trouve pas, le serveur analyse et optimise la requête avant de l' | ||
+ | |||
+ | ===Utilisation du Disque=== | ||
+ | |||
+ | Les bases de données de MySQL, aussi appelées **Schémas** sont représentées sur disque par un répertoire du même nom que la base de données. | ||
+ | |||
+ | Ce répertoire existe dans un répertoire de données appelé le **datadir**. | ||
+ | |||
+ | Pour connaître l' | ||
+ | |||
+ | < | ||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +---------------+-----------------+ | ||
+ | | Variable_name | Value | | ||
+ | +---------------+-----------------+ | ||
+ | | datadir | ||
+ | +---------------+-----------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Sous **Windows(tm)** : | ||
+ | |||
+ | < | ||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +---------------+---------------------------------------------+ | ||
+ | | Variable_name | Value | | ||
+ | +---------------+---------------------------------------------+ | ||
+ | | datadir | ||
+ | +---------------+---------------------------------------------+ | ||
+ | 1 row in set (0.08 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | L’examen de ce répertoire montre la présence des répertoires des schémas. | ||
+ | |||
+ | Sous **Red Hat** et **CentOS** : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# ls -l / | ||
+ | total 28684 | ||
+ | -rw-rw----. 1 mysql mysql 18874368 22 janv. 15:28 ibdata1 | ||
+ | -rw-rw----. 1 mysql mysql 5242880 22 janv. 15:28 ib_logfile0 | ||
+ | -rw-rw----. 1 mysql mysql 5242880 22 janv. 15:28 ib_logfile1 | ||
+ | drwx------. 2 mysql mysql 4096 22 janv. 15:28 mysql | ||
+ | srwxrwxrwx. 1 mysql mysql 0 22 janv. 15:28 mysql.sock | ||
+ | drwx------. 2 mysql mysql 4096 22 janv. 15:28 performance_schema | ||
+ | drwx------. 2 mysql mysql 4096 22 janv. 15:28 test | ||
+ | </ | ||
+ | |||
+ | Sous **Windows(tm)** : | ||
+ | |||
+ | < | ||
+ | C: | ||
+ | Le volume dans le lecteur C n'a pas de nom. | ||
+ | Le numéro de série du volume est 7C10-520B | ||
+ | |||
+ | | ||
+ | |||
+ | 22/ | ||
+ | 22/ | ||
+ | 21/ | ||
+ | 22/ | ||
+ | 22/ | ||
+ | 21/ | ||
+ | 21/ | ||
+ | 21/ | ||
+ | 21/ | ||
+ | 22/ | ||
+ | 22/ | ||
+ | 21/ | ||
+ | 7 fichier(s) | ||
+ | 5 Rép(s) | ||
+ | |||
+ | C: | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Il est possible de configurer MySQL pour utiliser plusieurs supports différents pour stocker les journaux, fichiers temporaires, | ||
+ | </ | ||
+ | |||
+ | ===Utilisation de la Mémoire=== | ||
+ | |||
+ | L' | ||
+ | |||
+ | ==Allocation par Instance== | ||
+ | |||
+ | C'est la mémoire allouée par le serveur au démarrage de celui-ci. Elle est partagée par le serveur **mysqld** et les **threads** (connexions). Elle comprend, entre autre : | ||
+ | |||
+ | * le // | ||
+ | * le // | ||
+ | * le // | ||
+ | * le // | ||
+ | |||
+ | ==Allocation par Threads== | ||
+ | |||
+ | C'est la mémoire allouée d'une manière dynamique en fonction des besoins de chaque client. Elle comprend, entre autre : | ||
+ | |||
+ | * le // | ||
+ | * le // | ||
+ | * le // | ||
+ | * le // | ||
+ | |||
+ | ==== Installation==== | ||
+ | |||
+ | ===Red Hat et CentOS== | ||
+ | |||
+ | Sous **Red Hat** et **CentOS**, pour installer mysql, utilisez yum : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# yum install mysql-server | ||
+ | Loaded plugins: fastestmirror, | ||
+ | Loading mirror speeds from cached hostfile | ||
+ | * base: mir01.syntis.net | ||
+ | * extras: mir01.syntis.net | ||
+ | * updates: mir01.syntis.net | ||
+ | Setting up Install Process | ||
+ | Resolving Dependencies | ||
+ | --> Running transaction check | ||
+ | ---> Package mysql-server.i686 0: | ||
+ | --> Processing Dependency: mysql = 5.1.61-4.el6 for package: mysql-server-5.1.61-4.el6.i686 | ||
+ | --> Processing Dependency: perl-DBI for package: mysql-server-5.1.61-4.el6.i686 | ||
+ | --> Processing Dependency: perl-DBD-MySQL for package: mysql-server-5.1.61-4.el6.i686 | ||
+ | --> Processing Dependency: perl(DBI) for package: mysql-server-5.1.61-4.el6.i686 | ||
+ | --> Running transaction check | ||
+ | ---> Package mysql.i686 0: | ||
+ | ---> Package perl-DBD-MySQL.i686 0: | ||
+ | ---> Package perl-DBI.i686 0: | ||
+ | --> Finished Dependency Resolution | ||
+ | |||
+ | Dependencies Resolved | ||
+ | |||
+ | ================================================================================ | ||
+ | | ||
+ | ================================================================================ | ||
+ | Installing: | ||
+ | | ||
+ | Installing for dependencies: | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | Transaction Summary | ||
+ | ================================================================================ | ||
+ | Install | ||
+ | |||
+ | Total download size: 10 M | ||
+ | Installed size: 29 M | ||
+ | Is this ok [y/N]: y | ||
+ | Downloading Packages: | ||
+ | (1/4): mysql-5.1.61-4.el6.i686.rpm | ||
+ | (2/4): mysql-server-5.1.61-4.el6.i686.rpm | ||
+ | (3/4): perl-DBD-MySQL-4.013-3.el6.i686.rpm | ||
+ | (4/4): perl-DBI-1.609-4.el6.i686.rpm | ||
+ | -------------------------------------------------------------------------------- | ||
+ | Total 961 kB/s | 10 MB | ||
+ | Running rpm_check_debug | ||
+ | Running Transaction Test | ||
+ | Transaction Test Succeeded | ||
+ | Running Transaction | ||
+ | Installing : perl-DBI-1.609-4.el6.i686 | ||
+ | Installing : perl-DBD-MySQL-4.013-3.el6.i686 | ||
+ | Installing : mysql-5.1.61-4.el6.i686 | ||
+ | Installing : mysql-server-5.1.61-4.el6.i686 | ||
+ | Verifying | ||
+ | Verifying | ||
+ | Verifying | ||
+ | Verifying | ||
+ | |||
+ | Installed: | ||
+ | mysql-server.i686 0: | ||
+ | |||
+ | Dependency Installed: | ||
+ | mysql.i686 0: | ||
+ | perl-DBI.i686 0: | ||
+ | |||
+ | Complete! | ||
+ | </ | ||
+ | |||
+ | ===Windows=== | ||
+ | |||
+ | Sous **Windows(tm)**, | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que pour les trois systèmes d' | ||
+ | </ | ||
+ | |||
+ | ====Démarrage du Serveur==== | ||
+ | |||
+ | Le serveur MySQL peut être démarré par l' | ||
+ | |||
+ | ===Sous Red Hat et CentOS=== | ||
+ | |||
+ | ===Le Script mysql.server=== | ||
+ | |||
+ | Ce script est renommé en **mysql** lors de l' | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# service mysqld start | ||
+ | Initialisation de la base de données MySQL : Installing MySQL system tables... | ||
+ | OK | ||
+ | Filling help tables... | ||
+ | OK | ||
+ | |||
+ | To start mysqld at boot time you have to copy | ||
+ | support-files/ | ||
+ | |||
+ | PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! | ||
+ | To do so, start the server, then issue the following commands: | ||
+ | |||
+ | / | ||
+ | / | ||
+ | |||
+ | Alternatively you can run: | ||
+ | / | ||
+ | |||
+ | which will also give you the option of removing the test | ||
+ | databases and anonymous user created by default. | ||
+ | strongly recommended for production servers. | ||
+ | |||
+ | See the manual for more instructions. | ||
+ | |||
+ | You can start the MySQL daemon with: | ||
+ | cd /usr ; / | ||
+ | |||
+ | You can test the MySQL daemon with mysql-test-run.pl | ||
+ | cd / | ||
+ | |||
+ | Please report any problems with the / | ||
+ | |||
+ | | ||
+ | Démarrage de mysqld : [ OK ] | ||
+ | </ | ||
+ | |||
+ | Configurez ensuite le service **mysqld** de démarrer lors du démarrage du système : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# chkconfig mysqld on | ||
+ | [root@centos6 ~]# chkconfig --list mysqld | ||
+ | mysqld | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Si vous installez MySQL à partir des sources, le script mysql.server se trouve dans le répertoire **support-files** | ||
+ | </ | ||
+ | |||
+ | Le script **mysql.server** appel un autre script appelé **mysqld_safe** qui lance le serveur et crée un journal d' | ||
+ | |||
+ | ===Invocation Directe=== | ||
+ | |||
+ | Il est aussi possible d' | ||
+ | |||
+ | < | ||
+ | # / | ||
+ | </ | ||
+ | |||
+ | ===Sous Windows=== | ||
+ | |||
+ | ==Le Service MySQL56== | ||
+ | |||
+ | Si le service n'est pas déjà installé, il convient de saisir la commande suivante : | ||
+ | |||
+ | < | ||
+ | C: | ||
+ | </ | ||
+ | |||
+ | Si le service n'est pas déjà démarré, il convient de saisir la commande suivante : | ||
+ | |||
+ | < | ||
+ | C: | ||
+ | </ | ||
+ | |||
+ | ==Invocation Directe== | ||
+ | |||
+ | Il est aussi possible d' | ||
+ | |||
+ | < | ||
+ | C: | ||
+ | </ | ||
+ | |||
+ | ====Arrêt du Serveur==== | ||
+ | |||
+ | ===Sous Red Hat et CentOS=== | ||
+ | |||
+ | ==Le Script mysql.server== | ||
+ | |||
+ | Ce script, qu'il soit nommé mysql.server ou simplement mysql, accepte l' | ||
+ | |||
+ | ==La Commande mysqladmin== | ||
+ | |||
+ | La comande **mysqladmin** peut aussi être utilisée pour arrêter le serveur à condition que l' | ||
+ | |||
+ | < | ||
+ | # / | ||
+ | </ | ||
+ | |||
+ | ===Sous Windows=== | ||
+ | |||
+ | ==Le Service MySQL56== | ||
+ | |||
+ | Ce service accepte l' | ||
+ | |||
+ | ==La Commande mysqladmin== | ||
+ | |||
+ | La commande **mysqladmin** peut aussi être utilisée pour arrêter le serveur à condition que l' | ||
+ | |||
+ | < | ||
+ | C: | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Le nom d' | ||
+ | </ | ||
+ | |||
+ | ====Configuration==== | ||
+ | |||
+ | Votre première prise en mains de %%MySQL%% doit débuter par la commande **mysql** : | ||
+ | |||
+ | ===Le Client MySQL=== | ||
+ | |||
+ | ==Utilisation== | ||
+ | |||
+ | %%MySQL%% dispose d’un outil client permettant de se connecter et d’envoyer des commandes SQL au serveur. | ||
+ | |||
+ | Pour démarrer une connexion au serveur %%MySQL%% nous pouvons utiliser un C.L.I. sous Linux. | ||
+ | |||
+ | Les paramètres les plus courants sont : | ||
+ | |||
+ | $ mysql –u root –p Databasename [Entrée] | ||
+ | |||
+ | Où : | ||
+ | |||
+ | * **-u** | ||
+ | * donne le nom de l’utilisateur. Si vous renoncez à l’option –u , le nom de login sera utilisé sous Unix/Linux et le nom ODBC sous Windows. | ||
+ | |||
+ | * **-p** | ||
+ | * permet de saisir le mot de passe de %%MySQL%%, cette option est obligatoire lorsque les utilisateurs %%MySQL%% sont sécurisés, | ||
+ | |||
+ | * **-h** | ||
+ | * permet de préciser le nom de l’hôte qui héberge %%MySQL%%. Par défaut le port de communication est 3306 il est possible de changer ce port soit en configurant l’instance %%MySQL%% soit en configurant le fichier **My.ini**. (Attention: vérifiez qu’un par feu ne bloque pas ce port). Enfin vous devez vous assurer que le serveur %%MySQL%% est configuré de sorte à autoriser les accès depuis votre ordinateur local ce qui n’est pas le cas par défaut. | ||
+ | |||
+ | * **- -protocol = name** | ||
+ | * cette option permet de spécifier le protocole de communication à utiliser. Il est rarement nécessaire d’indiquer cette option, puisque %%MySQL%% choisit le bon protocole par défaut. Lorsque le client %%MySQL%% et le serveur %%MySQL%% ne tournent pas sur le même ordinateur, le seul protocole réseau possible est le **TCP**, dans ce cas n’oubliez pas de préciser le paramètre –h. | ||
+ | |||
+ | * **-p n** | ||
+ | * permet de préciser le port de communication utilisée pour se connecter à %%MySQL%%. Cette option est effective que lorsque la communication passe par TCP/IP. | ||
+ | |||
+ | * **- -default-character-set = nom** | ||
+ | * cette option indique le jeu de caractères utilisés dans le cadre de communication entre %%MySQL%% et le serveur %%MySQL%%. En théorie, il s’agit du même jeu de caractères que celui utilisé par défaut dans la vie de commandes sous Windows ou la console sous Linux. Les jeux de caractères pris en charge par %%MySQL%% sont notamment Latin 1 (ISO-8559-1), | ||
+ | |||
+ | * Databasename | ||
+ | * ce dernier paramètre indique à %%MySQL%% le nom d’une base de données, ce qui permet de l’utiliser directement dès l’ouverture de %%MySQL%%. Si vous désirez changer ici de base de données après sa connexion vous pouvez utiliser la commande SQL USE name. | ||
+ | |||
+ | Exemple : | ||
+ | |||
+ | $ mysql -u root -p -h server --protocol=tcp [Entrée] | ||
+ | $ Password : ********** [Entrée] | ||
+ | |||
+ | ==Options== | ||
+ | |||
+ | Dans la console %%MySQL%% nous avons diverses options. | ||
+ | |||
+ | ^ Abréviation ^ Commande ^ Signification ^ | ||
+ | | \c | clear | Annule une commande en cours de saisie | | ||
+ | | \h | help | Affiche la liste des commandes | | ||
+ | | \q | exit ou quit | Ferme la connexion à %%MySQL%%. Sous Unix/Linux, il est possible utilisé le raccourci ctrl+D | | ||
+ | | \s | status | Affiche les informations de statut du serveur %%MySQL%% | | ||
+ | | \T[f] | tee[filename] | Enregistre tous ce qui apparaît dans la fenêtre de commandes dans le fichier indiqué | | ||
+ | | L | notee | Ferme tee. Le protocole doit être repris à tout instant avec tee ou \T. Il n’est pas nécessaire de saisir de nouveau le nom de fichier. | | ||
+ | | \u db | use database | La base de données saisie devient la base de données par défaut | | ||
+ | | \. Fn | source file name | exécute les commandes SQL contenues dans le fichier spécifié. Les commandes doivent à séparer par des pointsvirgules. | | ||
+ | |||
+ | NB : la fonction \c n’a aucun effet dans les chaînes de caractères( "" | ||
+ | |||
+ | Notez aussi que %%MySQL%% se souvient des dernières commandes grâce aux touches **flèche vers le haut** et **flèche vers le bas**. | ||
+ | |||
+ | ===LAB #1 - Configuration de Base=== | ||
+ | |||
+ | ==Sous **Red Hat** et **CentOS**== | ||
+ | |||
+ | Saisissez la commande **mysql** : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysql | ||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 2 | ||
+ | Server version: 5.1.61 Source distribution | ||
+ | |||
+ | Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Pour visualiser la liste des bases de données par défaut, utilisez la commande suivante : | ||
+ | |||
+ | < | ||
+ | mysql> show databases; | ||
+ | +--------------------+ | ||
+ | | Database | ||
+ | +--------------------+ | ||
+ | | information_schema | | ||
+ | | mysql | | ||
+ | | performance_schema | | ||
+ | | test | | ||
+ | +--------------------+ | ||
+ | 4 rows in set (0.02 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Ensuite changez de base de données avec la commande **USE**. | ||
+ | |||
+ | < | ||
+ | mysql> USE mysql; | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Afin de consulter les tables présentes dans la base, utilisez la commande **SHOW**. | ||
+ | |||
+ | < | ||
+ | mysql> SHOW TABLES; | ||
+ | +---------------------------+ | ||
+ | | Tables_in_mysql | ||
+ | +---------------------------+ | ||
+ | | columns_priv | ||
+ | | db | | ||
+ | | event | | ||
+ | | func | | ||
+ | | general_log | ||
+ | | help_category | ||
+ | | help_keyword | ||
+ | | help_relation | ||
+ | | help_topic | ||
+ | | host | | ||
+ | | ndb_binlog_index | ||
+ | | plugin | ||
+ | | proc | | ||
+ | | procs_priv | ||
+ | | servers | ||
+ | | slow_log | ||
+ | | tables_priv | ||
+ | | time_zone | ||
+ | | time_zone_leap_second | ||
+ | | time_zone_name | ||
+ | | time_zone_transition | ||
+ | | time_zone_transition_type | | ||
+ | | user | | ||
+ | +---------------------------+ | ||
+ | 23 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Pour consulter une table spécifique, | ||
+ | |||
+ | < | ||
+ | mysql> DESCRIBE user; | ||
+ | +-----------------------+-----------------------------------+------+-----+---------+-------+ | ||
+ | | Field | Type | Null | Key | Default | Extra | | ||
+ | +-----------------------+-----------------------------------+------+-----+---------+-------+ | ||
+ | | Host | char(60) | ||
+ | | User | char(16) | ||
+ | | Password | ||
+ | | Select_priv | ||
+ | | Insert_priv | ||
+ | | Update_priv | ||
+ | | Delete_priv | ||
+ | | Create_priv | ||
+ | | Drop_priv | ||
+ | | Reload_priv | ||
+ | | Shutdown_priv | ||
+ | | Process_priv | ||
+ | | File_priv | ||
+ | | Grant_priv | ||
+ | | References_priv | ||
+ | | Index_priv | ||
+ | | Alter_priv | ||
+ | | Show_db_priv | ||
+ | | Super_priv | ||
+ | | Create_tmp_table_priv | enum(' | ||
+ | | Lock_tables_priv | ||
+ | | Execute_priv | ||
+ | | Repl_slave_priv | ||
+ | | Repl_client_priv | ||
+ | | Create_view_priv | ||
+ | | Show_view_priv | ||
+ | | Create_routine_priv | ||
+ | | Alter_routine_priv | ||
+ | | Create_user_priv | ||
+ | | Event_priv | ||
+ | | Trigger_priv | ||
+ | | ssl_type | ||
+ | | ssl_cipher | ||
+ | | x509_issuer | ||
+ | | x509_subject | ||
+ | | max_questions | ||
+ | | max_updates | ||
+ | | max_connections | ||
+ | | max_user_connections | ||
+ | +-----------------------+-----------------------------------+------+-----+---------+-------+ | ||
+ | 39 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Pour visualiser la liste des utilisateurs autorisés pour %%MySQL%%, utilisez la commande **SELECT**. | ||
+ | |||
+ | < | ||
+ | mysql> SELECT host, user, password FROM user; | ||
+ | +-----------+------+----------+ | ||
+ | | host | user | password | | ||
+ | +-----------+------+----------+ | ||
+ | | localhost | root | | | ||
+ | | centos | ||
+ | | 127.0.0.1 | root | | | ||
+ | | localhost | | | | ||
+ | | centos | ||
+ | +-----------+------+----------+ | ||
+ | 5 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Vous noterez que l' | ||
+ | |||
+ | Il faut par conséquence en définir un en urgence ! | ||
+ | |||
+ | Pour sortir de l' | ||
+ | |||
+ | < | ||
+ | mysql> exit | ||
+ | Bye | ||
+ | [root@centos6 ~]# | ||
+ | </ | ||
+ | |||
+ | Pour définir le mot de passe **fenestros** pour root, il convient de saisir la commande suivante : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysqladmin -u root password fenestros | ||
+ | </ | ||
+ | |||
+ | Lors de la prochaine tentative de connexion en tant que root, vous obtiendrez un message d' | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysql -u root | ||
+ | ERROR 1045 (28000): Access denied for user ' | ||
+ | </ | ||
+ | |||
+ | Pour vous connecter en tant que l' | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysql -u root -p mysql | ||
+ | Enter password: fenestros | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 5 | ||
+ | Server version: 5.1.61 Source distribution | ||
+ | |||
+ | Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez l' | ||
+ | </ | ||
+ | |||
+ | Saisissez la commande suivante pour vérifier la table des utilisateurs : | ||
+ | |||
+ | < | ||
+ | mysql> SELECT host, user, password FROM user; | ||
+ | +-----------+------+-------------------------------------------+ | ||
+ | | host | user | password | ||
+ | +-----------+------+-------------------------------------------+ | ||
+ | | localhost | root | *00269BA49BEC800F9CCF34C20C1FD83E0236B89A | | ||
+ | | centos | ||
+ | | 127.0.0.1 | root | | | ||
+ | | localhost | | | | ||
+ | | centos | ||
+ | +-----------+------+-------------------------------------------+ | ||
+ | 5 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que non seulement le mot de passe de root est présent mais qu'il a été crypté. Vous avez aussi la possibilité de sécuriser votre installation de MySQL en utilisant le script **/ | ||
+ | </ | ||
+ | |||
+ | ==Sous Windows== | ||
+ | |||
+ | Cliquez sur **Tous les programmes > MySQL > MySQL Server 5.6 > MySQL 5.6 Command Line Client** : | ||
+ | |||
+ | < | ||
+ | Enter password: ********* | ||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 2 | ||
+ | Server version: 5.6.28-log MySQL Community Server (GPL) | ||
+ | |||
+ | Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Pour visualiser la liste des bases de données par défaut, utilisez la commande suivante : | ||
+ | |||
+ | < | ||
+ | mysql> SHOW databases; | ||
+ | +--------------------+ | ||
+ | | Database | ||
+ | +--------------------+ | ||
+ | | information_schema | | ||
+ | | mysql | | ||
+ | | performance_schema | | ||
+ | | test | | ||
+ | +--------------------+ | ||
+ | 4 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Ensuite changez de base de données avec la commande **USE**. | ||
+ | |||
+ | < | ||
+ | mysql> USE mysql; | ||
+ | Database changed | ||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Afin de consulter les tables présentes dans la base, utilisez la commande **SHOW**. | ||
+ | |||
+ | < | ||
+ | mysql> SHOW TABLES; | ||
+ | +---------------------------+ | ||
+ | | Tables_in_mysql | ||
+ | +---------------------------+ | ||
+ | | columns_priv | ||
+ | | db | | ||
+ | | event | | ||
+ | | func | | ||
+ | | general_log | ||
+ | | help_category | ||
+ | | help_keyword | ||
+ | | help_relation | ||
+ | | help_topic | ||
+ | | innodb_index_stats | ||
+ | | innodb_table_stats | ||
+ | | ndb_binlog_index | ||
+ | | plugin | ||
+ | | proc | | ||
+ | | procs_priv | ||
+ | | proxies_priv | ||
+ | | servers | ||
+ | | slave_master_info | ||
+ | | slave_relay_log_info | ||
+ | | slave_worker_info | ||
+ | | slow_log | ||
+ | | tables_priv | ||
+ | | time_zone | ||
+ | | time_zone_leap_second | ||
+ | | time_zone_name | ||
+ | | time_zone_transition | ||
+ | | time_zone_transition_type | | ||
+ | | user | | ||
+ | +---------------------------+ | ||
+ | 28 rows in set (0.03 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Pour consulter une table spécifique, | ||
+ | |||
+ | < | ||
+ | mysql> DESCRIBE user; | ||
+ | +------------------------+-----------------------------------+------+-----+-----------------------+-------+ | ||
+ | | Field | Type | Null | Key | Default | ||
+ | +------------------------+-----------------------------------+------+-----+-----------------------+-------+ | ||
+ | | Host | char(60) | ||
+ | | User | char(16) | ||
+ | | Password | ||
+ | | Select_priv | ||
+ | | Insert_priv | ||
+ | | Update_priv | ||
+ | | Delete_priv | ||
+ | | Create_priv | ||
+ | | Drop_priv | ||
+ | | Reload_priv | ||
+ | | Shutdown_priv | ||
+ | | Process_priv | ||
+ | | File_priv | ||
+ | | Grant_priv | ||
+ | | References_priv | ||
+ | | Index_priv | ||
+ | | Alter_priv | ||
+ | | Show_db_priv | ||
+ | | Super_priv | ||
+ | | Create_tmp_table_priv | ||
+ | | Lock_tables_priv | ||
+ | | Execute_priv | ||
+ | | Repl_slave_priv | ||
+ | | Repl_client_priv | ||
+ | | Create_view_priv | ||
+ | | Show_view_priv | ||
+ | | Create_routine_priv | ||
+ | | Alter_routine_priv | ||
+ | | Create_user_priv | ||
+ | | Event_priv | ||
+ | | Trigger_priv | ||
+ | | Create_tablespace_priv | enum(' | ||
+ | | ssl_type | ||
+ | | ssl_cipher | ||
+ | | x509_issuer | ||
+ | | x509_subject | ||
+ | | max_questions | ||
+ | | max_updates | ||
+ | | max_connections | ||
+ | | max_user_connections | ||
+ | | plugin | ||
+ | | authentication_string | ||
+ | | password_expired | ||
+ | +------------------------+-----------------------------------+------+-----+-----------------------+-------+ | ||
+ | 43 rows in set (0.02 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Pour visualiser la liste des utilisateurs autorisés pour %%MySQL%%, utilisez la commande **SELECT**. | ||
+ | |||
+ | < | ||
+ | mysql> SELECT host, user, password FROM user; | ||
+ | +-----------+------+-------------------------------------------+ | ||
+ | | host | user | password | ||
+ | +-----------+------+-------------------------------------------+ | ||
+ | | localhost | root | *00269BA49BEC800F9CCF34C20C1FD83E0236B89A | | ||
+ | | 127.0.0.1 | root | *00269BA49BEC800F9CCF34C20C1FD83E0236B89A | | ||
+ | | ::1 | root | *00269BA49BEC800F9CCF34C20C1FD83E0236B89A | | ||
+ | +-----------+------+-------------------------------------------+ | ||
+ | 3 rows in set (0.02 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que les mots de passe de root sont présents mais qu'ils ont été cryptés. Vous avez aussi la possibilité de sécuriser votre installation de MySQL en utilisant le | ||
+ | script **C: | ||
+ | </ | ||
+ | |||
+ | ===LAB #2 - Configuration Avancée=== | ||
+ | |||
+ | ==Sous Red Hat et CentOS== | ||
+ | |||
+ | La configuration avancée du serveur MySQL se fait : | ||
+ | |||
+ | * soit en éditant le fichier **/ | ||
+ | * soit en passant des paramètres à l' | ||
+ | * soit en paramétrant le serveur dynamiquement. | ||
+ | |||
+ | **Le fichier my.cnf** | ||
+ | |||
+ | <file text my.cnf> | ||
+ | [mysqld] | ||
+ | datadir=/ | ||
+ | socket=/ | ||
+ | |||
+ | # Disabling symbolic-links is recommended to prevent assorted security risks | ||
+ | symbolic-links=0 | ||
+ | |||
+ | # Settings user and group are ignored when systemd is used (fedora >= 15). | ||
+ | # If you need to run mysqld under a different user or group, | ||
+ | # customize your systemd unit file for mysqld according to the | ||
+ | # instructions in http:// | ||
+ | user=mysql | ||
+ | |||
+ | # Semisynchronous Replication | ||
+ | # http:// | ||
+ | # uncomment next line on MASTER | ||
+ | ; | ||
+ | # uncomment next line on SLAVE | ||
+ | ; | ||
+ | |||
+ | # Others options for Semisynchronous Replication | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | |||
+ | # http:// | ||
+ | ; | ||
+ | |||
+ | |||
+ | [mysqld_safe] | ||
+ | log-error=/ | ||
+ | pid-file=/ | ||
+ | </ | ||
+ | |||
+ | Ce fichier n'est pas cependant le seul endroit où est configuré le serveur. En effet, le serveur lit des directives des fichiers /etc/my.cnf / | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# / | ||
+ | 140125 14:59:00 [Note] libgovernor.so not found | ||
+ | 140125 14:59:00 [Warning] Although a path was specified for the --log-slow-queries option, log tables are used. To enable logging to files use the --log-output=file option. | ||
+ | 140125 14:59:00 [Note] Plugin ' | ||
+ | /etc/my.cnf / | ||
+ | my.cnf, $MYSQL_TCP_PORT, | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | En cas de duplicité de directives, c'est la dernière lue qui l' | ||
+ | </ | ||
+ | |||
+ | Le fichier my.cnf est organisé en sections, aussi appelées des groupes. Ces sections font référence au programme concerné par la configuration. Par exemple la section **[mysqld]** fait référence au serveur, tandis qu'une section [mysql] ferait référence au client en mode texte. Il est aussi possible de trouver les sections suivantes : | ||
+ | |||
+ | * [mysqldump], | ||
+ | * [mysqladmin], | ||
+ | * [mysqlhotcopy], | ||
+ | * [myisamchk], | ||
+ | * [client], | ||
+ | * etc. | ||
+ | |||
+ | <WRAP center round important> | ||
+ | [client] est une section qui configure **tous** les clients. [mysqld] peut être remplacé par [server]. Toute ligne commençant par le caractère **#** ou **;** est un **commentaire**. | ||
+ | </ | ||
+ | |||
+ | Le fichier de configuration peut aussi contenir des lignes **!include** qui référencent des fichiers tiers de configuration ainsi que des lignes **!includedir** qui référencent des répertoires contenant plusieurs fichiers de configuration. Attention, dans ce dernier cas, l' | ||
+ | |||
+ | Chaque section contient des directives au format **option=valeur** ou au format binaire, par exemple **enable-federated**. | ||
+ | |||
+ | Avec presque **300** options possibles et avec autant d' | ||
+ | |||
+ | * Comment savoir bien configurer le serveur, | ||
+ | * Comment connaître avec exactitude la configuration actuelle. | ||
+ | |||
+ | **Comment Savoir Bien Configurer le Serveur ?** | ||
+ | |||
+ | La réponse au premier problème se trouve dans les fichiers exemples fournis par Oracle. Ces fichiers se trouvent dans le répertoire **support-files**. Oracle propose des fichiers de configuration en fonction de la mémoire du serveur : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# ls -l / | ||
+ | -rw-r--r--. 1 root root | ||
+ | -rw-r--r--. 1 root root 19779 2 août 23:07 my-innodb-heavy-4G.cnf | ||
+ | -rw-r--r--. 1 root root | ||
+ | -rw-r--r--. 1 root root | ||
+ | -rw-r--r--. 1 root root | ||
+ | </ | ||
+ | |||
+ | Par exemple : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# cat / | ||
+ | # Example MySQL config file for very large systems. | ||
+ | # | ||
+ | # This is for a large system with memory of 1G-2G where the system runs mainly | ||
+ | # MySQL. | ||
+ | # | ||
+ | # MySQL programs look for option files in a set of | ||
+ | # locations which depend on the deployment platform. | ||
+ | # You can copy this option file to one of those | ||
+ | # locations. For information about these locations, see: | ||
+ | # http:// | ||
+ | # | ||
+ | # In this file, you can use all long options that a program supports. | ||
+ | # If you want to know which options a program supports, run the program | ||
+ | # with the " | ||
+ | |||
+ | # The following options will be passed to all MySQL clients | ||
+ | [client] | ||
+ | #password = your_password | ||
+ | port = 3306 | ||
+ | socket = / | ||
+ | |||
+ | # Here follows entries for some specific programs | ||
+ | |||
+ | # The MySQL server | ||
+ | [mysqld] | ||
+ | port = 3306 | ||
+ | socket = / | ||
+ | skip-external-locking | ||
+ | key_buffer_size = 384M | ||
+ | max_allowed_packet = 1M | ||
+ | table_open_cache = 512 | ||
+ | sort_buffer_size = 2M | ||
+ | read_buffer_size = 2M | ||
+ | read_rnd_buffer_size = 8M | ||
+ | myisam_sort_buffer_size = 64M | ||
+ | thread_cache_size = 8 | ||
+ | query_cache_size = 32M | ||
+ | # Try number of CPU' | ||
+ | thread_concurrency = 8 | ||
+ | |||
+ | # Don't listen on a TCP/IP port at all. This can be a security enhancement, | ||
+ | # if all processes that need to connect to mysqld run on the same host. | ||
+ | # All interaction with mysqld must be made via Unix sockets or named pipes. | ||
+ | # Note that using this option without enabling named pipes on Windows | ||
+ | # (via the " | ||
+ | # | ||
+ | # | ||
+ | |||
+ | # Replication Master Server (default) | ||
+ | # binary logging is required for replication | ||
+ | log-bin=mysql-bin | ||
+ | |||
+ | # required unique id between 1 and 2^32 - 1 | ||
+ | # defaults to 1 if master-host is not set | ||
+ | # but will not function as a master if omitted | ||
+ | server-id = 1 | ||
+ | |||
+ | # Replication Slave (comment out master section to use this) | ||
+ | # | ||
+ | # To configure this host as a replication slave, you can choose between | ||
+ | # two methods : | ||
+ | # | ||
+ | # 1) Use the CHANGE MASTER TO command (fully described in our manual) - | ||
+ | # the syntax is: | ||
+ | # | ||
+ | # CHANGE MASTER TO MASTER_HOST=< | ||
+ | # MASTER_USER=< | ||
+ | # | ||
+ | # where you replace < | ||
+ | # < | ||
+ | # | ||
+ | # Example: | ||
+ | # | ||
+ | # CHANGE MASTER TO MASTER_HOST=' | ||
+ | # MASTER_USER=' | ||
+ | # | ||
+ | # OR | ||
+ | # | ||
+ | # 2) Set the variables below. However, in case you choose this method, then | ||
+ | # start replication for the first time (even unsuccessfully, | ||
+ | # if you mistyped the password in master-password and the slave fails to | ||
+ | # connect), the slave will create a master.info file, and any later | ||
+ | # change in this file to the variables' | ||
+ | # overridden by the content of the master.info file, unless you shutdown | ||
+ | # the slave server, delete master.info and restart the slaver server. | ||
+ | # For that reason, you may want to leave the lines below untouched | ||
+ | # (commented) and instead use CHANGE MASTER TO (see above) | ||
+ | # | ||
+ | # required unique id between 2 and 2^32 - 1 | ||
+ | # (and different from the master) | ||
+ | # defaults to 2 if master-host is set | ||
+ | # but will not function as a slave if omitted | ||
+ | # | ||
+ | # | ||
+ | # The replication master for this slave - required | ||
+ | # | ||
+ | # | ||
+ | # The username the slave will use for authentication when connecting | ||
+ | # to the master - required | ||
+ | # | ||
+ | # | ||
+ | # The password the slave will authenticate with when connecting to | ||
+ | # the master - required | ||
+ | # | ||
+ | # | ||
+ | # The port the master is listening on. | ||
+ | # optional - defaults to 3306 | ||
+ | # | ||
+ | # | ||
+ | # binary logging - not required for slaves, but recommended | ||
+ | # | ||
+ | # | ||
+ | # binary logging format - mixed recommended | ||
+ | # | ||
+ | |||
+ | # Uncomment the following if you are using InnoDB tables | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # You can set .._buffer_pool_size up to 50 - 80 % | ||
+ | # of RAM but beware of setting memory usage too high | ||
+ | # | ||
+ | # | ||
+ | # Set .._log_file_size to 25 % of buffer pool size | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | |||
+ | [mysqldump] | ||
+ | quick | ||
+ | max_allowed_packet = 16M | ||
+ | |||
+ | [mysql] | ||
+ | no-auto-rehash | ||
+ | # Remove the next comment character if you are not familiar with SQL | ||
+ | # | ||
+ | |||
+ | [myisamchk] | ||
+ | key_buffer_size = 256M | ||
+ | sort_buffer_size = 256M | ||
+ | read_buffer = 2M | ||
+ | write_buffer = 2M | ||
+ | |||
+ | [mysqlhotcopy] | ||
+ | interactive-timeout | ||
+ | </ | ||
+ | |||
+ | Pour connaître toutes les options valides pour le serveur, il convient de saisir la commande suivante : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# / | ||
+ | 140125 15:32:58 [Note] libgovernor.so not found | ||
+ | 140125 15:32:58 [Warning] Although a path was specified for the --log-slow-queries option, log tables are used. To enable logging to files use the --log-output=file option. | ||
+ | 140125 15:32:58 [Note] Plugin ' | ||
+ | / | ||
+ | Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Starts the MySQL database server. | ||
+ | |||
+ | Usage: / | ||
+ | |||
+ | Default options are read from the following files in the given order: | ||
+ | /etc/my.cnf / | ||
+ | The following groups are read: mysqld server mysqld-5.5 | ||
+ | The following options may be given as the first argument: | ||
+ | --print-defaults | ||
+ | --no-defaults | ||
+ | --defaults-file=# | ||
+ | --defaults-extra-file=# | ||
+ | |||
+ | --abort-slave-event-count=# | ||
+ | Option used by mysql-test for debugging and testing of | ||
+ | replication. | ||
+ | --allow-suspicious-udfs | ||
+ | Allows use of UDFs consisting of only one symbol xxx() | ||
+ | without corresponding xxx_init() or xxx_deinit(). That | ||
+ | also means that one can load any function from any | ||
+ | library, for example exit() from libc.so | ||
+ | -a, --ansi | ||
+ | will also set transaction isolation level ' | ||
+ | --archive[=name] | ||
+ | OFF, FORCE (don't start if the plugin fails to load). | ||
+ | --Plus-- | ||
+ | </ | ||
+ | |||
+ | Pour connaître les options valides pour le client mysql, l' | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysql --help | more | ||
+ | mysql Ver 14.14 Distrib 5.5.33, for Linux (i686) using readline 5.1 | ||
+ | Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Usage: mysql [OPTIONS] [database] | ||
+ | -?, --help | ||
+ | -I, --help | ||
+ | --auto-rehash | ||
+ | ' | ||
+ | and reconnecting may take a longer time. Disable with | ||
+ | --disable-auto-rehash. | ||
+ | (Defaults to on; use --skip-auto-rehash to disable.) | ||
+ | -A, --no-auto-rehash | ||
+ | No automatic rehashing. One has to use ' | ||
+ | table and field completion. This gives a quicker start of | ||
+ | mysql and disables rehashing on reconnect. | ||
+ | --auto-vertical-output | ||
+ | Automatically switch to vertical output mode if the | ||
+ | result is wider than the terminal width. | ||
+ | -B, --batch | ||
+ | (Enables --silent.) | ||
+ | --character-sets-dir=name | ||
+ | Directory for character set files. | ||
+ | --column-type-info | ||
+ | -c, --comments | ||
+ | default is --skip-comments (discard comments), enable | ||
+ | with --comments. | ||
+ | -C, --compress | ||
+ | -#, --debug[=# | ||
+ | --Plus-- | ||
+ | </ | ||
+ | |||
+ | **Comment Connaître avec Exactitude la Configuration Actuelle ?** | ||
+ | |||
+ | La réponse à la deuxième question est obtenue en utilisant la commande **mysqladmin** : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysqladmin variables | more | ||
+ | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------- | ||
+ | -----+ | ||
+ | | Variable_name | ||
+ | | | ||
+ | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------- | ||
+ | -----+ | ||
+ | | auto_increment_increment | ||
+ | | | ||
+ | | auto_increment_offset | ||
+ | | | ||
+ | | autocommit | ||
+ | | | ||
+ | | automatic_sp_privileges | ||
+ | | | ||
+ | | back_log | ||
+ | | | ||
+ | | basedir | ||
+ | | | ||
+ | | big_tables | ||
+ | | | ||
+ | | binlog_cache_size | ||
+ | | | ||
+ | | binlog_direct_non_transactional_updates | ||
+ | | | ||
+ | | binlog_format | ||
+ | | | ||
+ | | binlog_stmt_cache_size | ||
+ | | | ||
+ | | bulk_insert_buffer_size | ||
+ | | | ||
+ | | character_set_client | ||
+ | | | ||
+ | --Plus-- | ||
+ | </ | ||
+ | |||
+ | **Passer des Paramètres à l' | ||
+ | |||
+ | Le serveur mysqld peut être paramétrer en passant des options à l' | ||
+ | |||
+ | **Paramétrer le Serveur Dynamiquement** | ||
+ | |||
+ | Pour paramétrer le serveur à chaud, il convient d' | ||
+ | |||
+ | La portée des options peut être SESSION, c' | ||
+ | |||
+ | **SESSION** | ||
+ | |||
+ | Prenant l' | ||
+ | |||
+ | < | ||
+ | mysql> SHOW GLOBAL VARIABLES LIKE ' | ||
+ | +----------------+----------+ | ||
+ | | Variable_name | ||
+ | +----------------+----------+ | ||
+ | | tmp_table_size | 16777216 | | ||
+ | +----------------+----------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SHOW SESSION VARIABLES LIKE ' | ||
+ | +----------------+----------+ | ||
+ | | Variable_name | ||
+ | +----------------+----------+ | ||
+ | | tmp_table_size | 16777216 | | ||
+ | +----------------+----------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SET SESSION tmp_table_size=8388608; | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> SHOW GLOBAL VARIABLES LIKE ' | ||
+ | +----------------+----------+ | ||
+ | | Variable_name | ||
+ | +----------------+----------+ | ||
+ | | tmp_table_size | 16777216 | | ||
+ | +----------------+----------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SHOW SESSION VARIABLES LIKE ' | ||
+ | +----------------+---------+ | ||
+ | | Variable_name | ||
+ | +----------------+---------+ | ||
+ | | tmp_table_size | 8388608 | | ||
+ | +----------------+---------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que la modification est immédiate. | ||
+ | </ | ||
+ | |||
+ | **GLOBAL** | ||
+ | |||
+ | En utilisant la même option : | ||
+ | |||
+ | < | ||
+ | mysql> SHOW GLOBAL VARIABLES LIKE ' | ||
+ | +----------------+----------+ | ||
+ | | Variable_name | ||
+ | +----------------+----------+ | ||
+ | | tmp_table_size | 16777216 | | ||
+ | +----------------+----------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SHOW SESSION VARIABLES LIKE ' | ||
+ | +----------------+---------+ | ||
+ | | Variable_name | ||
+ | +----------------+---------+ | ||
+ | | tmp_table_size | 8388608 | | ||
+ | +----------------+---------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SET GLOBAL tmp_table_size=16777216; | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> SHOW SESSION VARIABLES LIKE ' | ||
+ | +----------------+---------+ | ||
+ | | Variable_name | ||
+ | +----------------+---------+ | ||
+ | | tmp_table_size | 8388608 | | ||
+ | +----------------+---------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que pour une option ayant à la fois une portée globale et une portée session, la modification de la valeur globale n'est pas prise en compte dans la session active. | ||
+ | </ | ||
+ | |||
+ | Prenons maintenant le cas d'une option qui n'a **qu' | ||
+ | |||
+ | < | ||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +------------------+-------+ | ||
+ | | Variable_name | ||
+ | +------------------+-------+ | ||
+ | | query_cache_size | 0 | | ||
+ | +------------------+-------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SET SESSION query_cache_size=122880; | ||
+ | ERROR 1229 (HY000): Variable ' | ||
+ | mysql> SET GLOBAL query_cache_size=122880; | ||
+ | Query OK, 0 rows affected (0.01 sec) | ||
+ | |||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +------------------+--------+ | ||
+ | | Variable_name | ||
+ | +------------------+--------+ | ||
+ | | query_cache_size | 122880 | | ||
+ | +------------------+--------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que pour une option ayant uniquement une portée globale, la modification de la valeur globale est prise en compte dans la session active. | ||
+ | </ | ||
+ | |||
+ | <WRAP center round alert> | ||
+ | Les modifications à chaud ne sont pas persistants. | ||
+ | </ | ||
+ | |||
+ | ==Sous Windows== | ||
+ | |||
+ | La configuration avancée du serveur MySQL se fait : | ||
+ | |||
+ | * soit en éditant le fichier **C: | ||
+ | * soit en passant des paramètres à l' | ||
+ | * soit en paramétrant le serveur dynamiquement. | ||
+ | |||
+ | **Le fichier C: | ||
+ | |||
+ | <file text my.ini> | ||
+ | C: | ||
+ | # Other default tuning values | ||
+ | # MySQL Server Instance Configuration File | ||
+ | # ---------------------------------------------------------------------- | ||
+ | # Generated by the MySQL Server Instance Configuration Wizard | ||
+ | # | ||
+ | # | ||
+ | # Installation Instructions | ||
+ | # ---------------------------------------------------------------------- | ||
+ | # | ||
+ | # On Linux you can copy this file to /etc/my.cnf to set global options, | ||
+ | # mysql-data-dir/ | ||
+ | # (@localstatedir@ for this installation) or to | ||
+ | # ~/.my.cnf to set user-specific options. | ||
+ | # | ||
+ | # On Windows you should keep this file in the installation directory | ||
+ | # of your server (e.g. C:\Program Files\MySQL\MySQL Server X.Y). To | ||
+ | # make sure the server reads the config file use the startup option | ||
+ | # " | ||
+ | # | ||
+ | # To run run the server from the command line, execute this in a | ||
+ | # command line shell, e.g. | ||
+ | # mysqld --defaults-file=" | ||
+ | # | ||
+ | # To install the server as a Windows service manually, execute this in a | ||
+ | # command line shell, e.g. | ||
+ | # mysqld --install MySQLXY --defaults-file=" | ||
+ | # | ||
+ | # And then execute this in a command line shell to start the server, e.g. | ||
+ | # net start MySQLXY | ||
+ | # | ||
+ | # | ||
+ | # Guildlines for editing this file | ||
+ | # ---------------------------------------------------------------------- | ||
+ | # | ||
+ | # In this file, you can use all long options that the program supports. | ||
+ | # If you want to know the options a program supports, start the program | ||
+ | # with the " | ||
+ | # | ||
+ | # More detailed information about the individual options can also be | ||
+ | # found in the manual. | ||
+ | # | ||
+ | # For advice on how to change settings please see | ||
+ | # http:// | ||
+ | # | ||
+ | # | ||
+ | # CLIENT SECTION | ||
+ | # ---------------------------------------------------------------------- | ||
+ | # | ||
+ | # The following options will be read by MySQL client applications. | ||
+ | # Note that only client applications shipped by MySQL are guaranteed | ||
+ | -- Suite (14%) -- | ||
+ | </ | ||
+ | |||
+ | Ce fichier n'est pas cependant le seul endroit où est configuré le serveur. En effet, le serveur lit des directives des fichiers C: | ||
+ | C:\my.ini, C:\my.cnf, C:\Program Files\MySQL\MySQL Server 5.6\my.ini et C:\Program Files\MySQL\MySQL Server 5.6\my.cnf dans l' | ||
+ | commande **mysqld --help --verbose | findstr my.ini** : | ||
+ | |||
+ | < | ||
+ | C:\Program Files\MySQL\MySQL Server 5.6\bin> | ||
+ | 2016-02-22 14:42:03 0 [Note] mysqld (mysqld 5.6.28) starting as process 3636 ... | ||
+ | 2016-02-22 14:42:03 3636 [Note] Plugin ' | ||
+ | C: | ||
+ | 2016-02-22 14:42:03 3636 [Note] Binlog end | ||
+ | 2016-02-22 14:42:03 3636 [Note] Shutting down plugin ' | ||
+ | 2016-02-22 14:42:03 3636 [Note] Shutting down plugin ' | ||
+ | |||
+ | C:\Program Files\MySQL\MySQL Server 5.6\bin> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | En cas de duplicité de directives, c'est la dernière lue qui l' | ||
+ | l' | ||
+ | </ | ||
+ | |||
+ | Le fichier my.ini est organisé en sections, aussi appelées des groupes. Ces sections font référence au programme concerné par la configuration. Par exemple la section | ||
+ | **[mysqld]** fait référence au serveur, tandis qu'une section [mysql] ferait référence au client en mode texte. Il est aussi possible de trouver les sections suivantes | ||
+ | : | ||
+ | |||
+ | * [mysqldump], | ||
+ | * [mysqladmin], | ||
+ | * [mysqlhotcopy], | ||
+ | * [myisamchk], | ||
+ | * [client], | ||
+ | * etc. | ||
+ | |||
+ | <WRAP center round important> | ||
+ | [client] est une section qui configure **tous** les clients. [mysqld] peut être remplacé par [server]. Toute ligne commençant par le caractère **#** ou **;** est un | ||
+ | **commentaire**. | ||
+ | </ | ||
+ | |||
+ | Le fichier de configuration peut aussi contenir des lignes **!include** qui référencent des fichiers tiers de configuration ainsi que des lignes **!includedir** qui | ||
+ | référencent des répertoires contenant plusieurs fichiers de configuration. Attention, dans ce dernier cas, l' | ||
+ | des fichiers par le serveur. | ||
+ | |||
+ | Chaque section contient des directives au format **option=valeur** ou au format binaire, par exemple **enable-federated**. | ||
+ | |||
+ | Avec presque **300** options possibles et avec autant d' | ||
+ | |||
+ | * Comment savoir bien configurer le serveur, | ||
+ | * Comment connaître avec exactitude la configuration actuelle. | ||
+ | |||
+ | **Comment Savoir Bien Configurer le Serveur ?** | ||
+ | |||
+ | La réponse au premier problème se trouve dans les fichiers exemples fournis par Oracle. Ces fichiers se trouvent dans le répertoire **support-files**. Oracle propose | ||
+ | des fichiers de configuration en fonction de la version du serveur : | ||
+ | |||
+ | < | ||
+ | c: | ||
+ | Le volume dans le lecteur C n'a pas de nom. | ||
+ | Le numéro de série du volume est 7C10-520B | ||
+ | |||
+ | | ||
+ | |||
+ | 21/ | ||
+ | 21/ | ||
+ | 21/ | ||
+ | 21/ | ||
+ | 21/ | ||
+ | 21/ | ||
+ | 21/ | ||
+ | 5 fichier(s) | ||
+ | 2 Rép(s) | ||
+ | |||
+ | c: | ||
+ | </ | ||
+ | |||
+ | Par exemple : | ||
+ | |||
+ | < | ||
+ | c: | ||
+ | ## MySQL Server Instance Configuration File Template | ||
+ | ## ---------------------------------------------------------------------- | ||
+ | ## Version 1.0.10 | ||
+ | ## | ||
+ | ## <-- Indicates Template comment. | ||
+ | ## | ||
+ | ## Replaceable things must be like: | ||
+ | ## | ||
+ | ## # [VARIABLE_NAME]=" | ||
+ | ## parameter=default value | ||
+ | ## | ||
+ | ## For example: | ||
+ | ## | ||
+ | ## # [PORT]=" | ||
+ | ## port=3306 | ||
+ | ## | ||
+ | ## Note - In the example, the formula consists of a variable named ' | ||
+ | ## | ||
+ | ## In addition to the standard max operators (+, -, /, *), the " | ||
+ | ## | ||
+ | ## rnd(x, y) = Round x to the nearest y | ||
+ | ## max(x, y) = Max value from x, y | ||
+ | ## min(x, y) = Min value from x, y | ||
+ | ## | ||
+ | ## and named variables. | ||
+ | ## | ||
+ | ## For example: | ||
+ | ## | ||
+ | ## # [MAX_CONNECTIONS]=" | ||
+ | ## max_connections= | ||
+ | ## | ||
+ | ## ( Note - Uninitialized variables have a value of 0. ) | ||
+ | ## | ||
+ | ## Finally, there is a special directive named [STATE_CHANGE] that allows for a function to be exectuted at that | ||
+ | ## point during template processing. | ||
+ | ## | ||
+ | ## For example: | ||
+ | ## # [STATE_CHANGE]=" | ||
+ | ## | ||
+ | ## The following variables must be defined before the formulas are evaluated (otherwise, you get many values set to 0): | ||
+ | ## | ||
+ | ## memory | ||
+ | ## Dedicated Server (90% of System Memory), Server (50% of System Memory), All others( rnd(max( 1/12 System Memory, 40*1024*1024 | ||
+ | 4)) | ||
+ | ## myiasm_percentage | ||
+ | ## If main InnoDB, set to 5. Allow userdef. | ||
+ | ## active_connections - # Connections. | ||
+ | ## DSS = 20, OLTP = 500, else user_defined. | ||
+ | ## cpus - Number of CPUS on the machine. | ||
+ | ## | ||
+ | -- Suite (8%) -- | ||
+ | </ | ||
+ | |||
+ | Pour connaître toutes les options valides pour le serveur, il convient de saisir la commande suivante : | ||
+ | |||
+ | < | ||
+ | C:\Program Files\MySQL\MySQL Server 5.6\bin> | ||
+ | 2016-02-22 15:19:30 0 [Note] mysqld (mysqld 5.6.28) starting as process 2336 ... | ||
+ | 2016-02-22 15:19:30 2336 [Note] Plugin ' | ||
+ | mysqld | ||
+ | Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Starts the MySQL database server. | ||
+ | |||
+ | Usage: mysqld [OPTIONS] | ||
+ | NT and Win32 specific options: | ||
+ | --install | ||
+ | --install-manual | ||
+ | --install service_name | ||
+ | --install-manual service_name Install an optional service started manually (NT). | ||
+ | --remove | ||
+ | --remove service_name | ||
+ | --enable-named-pipe | ||
+ | --standalone | ||
+ | |||
+ | |||
+ | Default options are read from the following files in the given order: | ||
+ | C: | ||
+ | The following groups are read: mysqld server mysqld-5.6 | ||
+ | The following options may be given as the first argument: | ||
+ | --print-defaults | ||
+ | --no-defaults | ||
+ | except for login file. | ||
+ | --defaults-file=# | ||
+ | --defaults-extra-file=# | ||
+ | --defaults-group-suffix=# | ||
+ | Also read groups with concat(group, | ||
+ | --login-path=# | ||
+ | |||
+ | --abort-slave-event-count=# | ||
+ | Option used by mysql-test for debugging and testing of | ||
+ | replication. | ||
+ | --allow-suspicious-udfs | ||
+ | Allows use of UDFs consisting of only one symbol xxx() | ||
+ | without corresponding xxx_init() or xxx_deinit(). That | ||
+ | also means that one can load any function from any | ||
+ | library, for example exit() from libc.so | ||
+ | -a, --ansi | ||
+ | will also set transaction isolation level ' | ||
+ | --archive[=name] | ||
+ | OFF, FORCE (don't start if the plugin fails to load). | ||
+ | --auto-increment-increment[=# | ||
+ | Auto-increment columns are incremented by this | ||
+ | --auto-increment-offset[=# | ||
+ | Offset added to Auto-increment columns. Used when | ||
+ | -- Suite -- | ||
+ | </ | ||
+ | |||
+ | Pour connaître les options valides pour le client mysql, l' | ||
+ | |||
+ | < | ||
+ | C:\Program Files\MySQL\MySQL Server 5.6\bin> | ||
+ | mysql Ver 14.14 Distrib 5.6.28, for Win32 (AMD64) | ||
+ | Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Usage: mysql [OPTIONS] [database] | ||
+ | -?, --help | ||
+ | -I, --help | ||
+ | --auto-rehash | ||
+ | ' | ||
+ | and reconnecting may take a longer time. Disable with | ||
+ | --disable-auto-rehash. | ||
+ | (Defaults to on; use --skip-auto-rehash to disable.) | ||
+ | -A, --no-auto-rehash | ||
+ | No automatic rehashing. One has to use ' | ||
+ | table and field completion. This gives a quicker start of | ||
+ | mysql and disables rehashing on reconnect. | ||
+ | --auto-vertical-output | ||
+ | Automatically switch to vertical output mode if the | ||
+ | result is wider than the terminal width. | ||
+ | -B, --batch | ||
+ | (Enables --silent.) | ||
+ | --bind-address=name IP address to bind to. | ||
+ | --character-sets-dir=name | ||
+ | Directory for character set files. | ||
+ | --column-type-info | ||
+ | -c, --comments | ||
+ | default is --skip-comments (discard comments), enable | ||
+ | with --comments. | ||
+ | -C, --compress | ||
+ | -#, --debug[=# | ||
+ | --debug-check | ||
+ | -T, --debug-info | ||
+ | -D, --database=name Database to use. | ||
+ | --default-character-set=name | ||
+ | Set the default character set. | ||
+ | --delimiter=name | ||
+ | --enable-cleartext-plugin | ||
+ | Enable/ | ||
+ | -e, --execute=name | ||
+ | file.) | ||
+ | -E, --vertical | ||
+ | -f, --force | ||
+ | -G, --named-commands | ||
+ | Enable named commands. Named commands mean this program' | ||
+ | internal commands; see mysql> help . When enabled, the | ||
+ | named commands can be used from any line of the query, | ||
+ | otherwise only from the first line, before an enter. | ||
+ | -- Suite -- | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Comment Connaître avec Exactitude la Configuration Actuelle ?** | ||
+ | |||
+ | La réponse à la deuxième question est obtenue en utilisant la commande **mysqladmin** : | ||
+ | |||
+ | < | ||
+ | C:\Program Files\MySQL\MySQL Server 5.6\bin> | ||
+ | Warning: Using a password on the command line interface can be insecure. | ||
+ | +-----------------------------------------------+-------------+ | ||
+ | | Variable_name | ||
+ | +-----------------------------------------------+-------------+ | ||
+ | | Aborted_clients | ||
+ | | Aborted_connects | ||
+ | | Binlog_cache_disk_use | ||
+ | | Binlog_cache_use | ||
+ | | Binlog_stmt_cache_disk_use | ||
+ | | Binlog_stmt_cache_use | ||
+ | | Bytes_received | ||
+ | | Bytes_sent | ||
+ | | Com_admin_commands | ||
+ | | Com_assign_to_keycache | ||
+ | | Com_alter_db | ||
+ | | Com_alter_db_upgrade | ||
+ | | Com_alter_event | ||
+ | | Com_alter_function | ||
+ | | Com_alter_procedure | ||
+ | | Com_alter_server | ||
+ | | Com_alter_table | ||
+ | | Com_alter_tablespace | ||
+ | | Com_alter_user | ||
+ | | Com_analyze | ||
+ | | Com_begin | ||
+ | | Com_binlog | ||
+ | | Com_call_procedure | ||
+ | | Com_change_db | ||
+ | | Com_change_master | ||
+ | | Com_check | ||
+ | | Com_checksum | ||
+ | | Com_commit | ||
+ | | Com_create_db | ||
+ | | Com_create_event | ||
+ | | Com_create_function | ||
+ | | Com_create_index | ||
+ | | Com_create_procedure | ||
+ | | Com_create_server | ||
+ | | Com_create_table | ||
+ | | Com_create_trigger | ||
+ | | Com_create_udf | ||
+ | | Com_create_user | ||
+ | | Com_create_view | ||
+ | | Com_dealloc_sql | ||
+ | | Com_delete | ||
+ | | Com_delete_multi | ||
+ | | Com_do | ||
+ | | Com_drop_db | ||
+ | | Com_drop_event | ||
+ | | Com_drop_function | ||
+ | | Com_drop_index | ||
+ | -- Suite -- | ||
+ | </ | ||
+ | |||
+ | **Passer des Paramètres à l' | ||
+ | |||
+ | Le serveur mysqld peut être paramétrer en passant des options à l' | ||
+ | my.ini, précédées par deux tirés. | ||
+ | |||
+ | **Paramétrer le Serveur Dynamiquement** | ||
+ | |||
+ | Pour paramétrer le serveur à chaud, il convient d' | ||
+ | |||
+ | La portée des options peut être SESSION, c' | ||
+ | |||
+ | **SESSION** | ||
+ | |||
+ | Prenant l' | ||
+ | |||
+ | < | ||
+ | mysql> SHOW GLOBAL VARIABLES LIKE ' | ||
+ | +----------------+----------+ | ||
+ | | Variable_name | ||
+ | +----------------+----------+ | ||
+ | | tmp_table_size | 63963136 | | ||
+ | +----------------+----------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SHOW SESSION VARIABLES LIKE ' | ||
+ | +----------------+----------+ | ||
+ | | Variable_name | ||
+ | +----------------+----------+ | ||
+ | | tmp_table_size | 63963136 | | ||
+ | +----------------+----------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> SET SESSION tmp_table_size=8388608; | ||
+ | Query OK, 0 rows affected (0.01 sec) | ||
+ | |||
+ | mysql> SHOW GLOBAL VARIABLES LIKE ' | ||
+ | +----------------+----------+ | ||
+ | | Variable_name | ||
+ | +----------------+----------+ | ||
+ | | tmp_table_size | 63963136 | | ||
+ | +----------------+----------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SHOW SESSION VARIABLES LIKE ' | ||
+ | +----------------+---------+ | ||
+ | | Variable_name | ||
+ | +----------------+---------+ | ||
+ | | tmp_table_size | 8388608 | | ||
+ | +----------------+---------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que la modification est immédiate. | ||
+ | </ | ||
+ | |||
+ | **GLOBAL** | ||
+ | |||
+ | < | ||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +------------------+---------+ | ||
+ | | Variable_name | ||
+ | +------------------+---------+ | ||
+ | | query_cache_size | 1048576 | | ||
+ | +------------------+---------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> SET SESSION query_cache_size=122880; | ||
+ | ERROR 1229 (HY000): Variable ' | ||
+ | mysql> SET GLOBAL query_cache_size=122880; | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +------------------+--------+ | ||
+ | | Variable_name | ||
+ | +------------------+--------+ | ||
+ | | query_cache_size | 122880 | | ||
+ | +------------------+--------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que pour une option ayant uniquement une portée globale, la modification de la valeur globale est prise en compte dans la session active. | ||
+ | </ | ||
+ | |||
+ | <WRAP center round alert> | ||
+ | Les modifications à chaud ne sont pas persistants. | ||
+ | </ | ||
+ | |||
+ | ===LAB #3 - Le Mode SQL=== | ||
+ | |||
+ | ==Sous Red Hat et CentOS== | ||
+ | |||
+ | Le mode SQL est utilisé principalement pour empêcher l' | ||
+ | |||
+ | < | ||
+ | mysql> SHOW SESSION VARIABLES LIKE ' | ||
+ | +---------------+-------+ | ||
+ | | Variable_name | Value | | ||
+ | +---------------+-------+ | ||
+ | | sql_mode | ||
+ | +---------------+-------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Par exemple, l' | ||
+ | |||
+ | < | ||
+ | mysql> SHOW SESSION VARIABLES LIKE ' | ||
+ | +---------------+-------+ | ||
+ | | Variable_name | Value | | ||
+ | +---------------+-------+ | ||
+ | | sql_mode | ||
+ | +---------------+-------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> USE test; | ||
+ | Database changed | ||
+ | mysql> CREATE TABLE t_federated(i int)ENGINE=FEDERATED; | ||
+ | Query OK, 0 rows affected, 2 warnings (0.06 sec) | ||
+ | |||
+ | mysql> SHOW WARNINGS; | ||
+ | +---------+------+-----------------------------------------------------+ | ||
+ | | Level | Code | Message | ||
+ | +---------+------+-----------------------------------------------------+ | ||
+ | | Warning | 1286 | Unknown storage engine ' | ||
+ | | Warning | 1266 | Using storage engine InnoDB for table ' | ||
+ | +---------+------+-----------------------------------------------------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> SET SESSION sql_mode=' | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> CREATE TABLE t_federated1(i int)ENGINE=FEDERATED; | ||
+ | ERROR 1286 (42000): Unknown storage engine ' | ||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | D' | ||
+ | |||
+ | * STRICT_ALL_TABLES, | ||
+ | * STRICT_TRANS_TABLES, | ||
+ | * NO_ZERO_DATE, | ||
+ | * NO_ZERO_IN_DATE, | ||
+ | * ERROR_FOR_DIVISION_BY_ZERO, | ||
+ | * NO_AUTO_CREATE_USER. | ||
+ | |||
+ | <WRAP center round todo> | ||
+ | Renseignez-vous sur la signification de chaque valeur de l' | ||
+ | </ | ||
+ | |||
+ | Les valeurs de l' | ||
+ | |||
+ | < | ||
+ | mysql> SET SESSION sql_mode=' | ||
+ | Query OK, 0 rows affected (0.01 sec) | ||
+ | |||
+ | mysql> SHOW SESSION VARIABLES LIKE ' | ||
+ | +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ | ||
+ | | Variable_name | Value | | ||
+ | +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ | ||
+ | | sql_mode | ||
+ | +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ==Sous Windows== | ||
+ | |||
+ | La valeur par défaut du mode SQL peut être visualisée avec la commande suivante : | ||
+ | |||
+ | < | ||
+ | mysql> SHOW SESSION VARIABLES LIKE ' | ||
+ | +---------------+----------------------------------------------------------------+ | ||
+ | | Variable_name | Value | | ||
+ | +---------------+----------------------------------------------------------------+ | ||
+ | | sql_mode | ||
+ | +---------------+----------------------------------------------------------------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Par exemple, l' | ||
+ | moteur demandé n'est pas disponible : | ||
+ | |||
+ | < | ||
+ | mysql> USE test; | ||
+ | Database changed | ||
+ | mysql> CREATE TABLE t_federated(i int)ENGINE=FEDERATED; | ||
+ | ERROR 1286 (42000): Unknown storage engine ' | ||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | D' | ||
+ | |||
+ | * STRICT_ALL_TABLES, | ||
+ | * STRICT_TRANS_TABLES, | ||
+ | * NO_ZERO_DATE, | ||
+ | * NO_ZERO_IN_DATE, | ||
+ | * ERROR_FOR_DIVISION_BY_ZERO, | ||
+ | * NO_AUTO_CREATE_USER. | ||
+ | |||
+ | <WRAP center round todo> | ||
+ | Renseignez-vous sur la signification de chaque valeur de l' | ||
+ | </ | ||
+ | |||
+ | Les valeurs de l' | ||
+ | |||
+ | < | ||
+ | mysql> SET SESSION sql_mode=' | ||
+ | Query OK, 0 rows affected (0.01 sec) | ||
+ | |||
+ | mysql> SHOW SESSION VARIABLES LIKE ' | ||
+ | +---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ | ||
+ | | Variable_name | Value | ||
+ | +---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ | ||
+ | | sql_mode | ||
+ | +---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | =====SQL, Champs, Moteurs et Jointures===== | ||
+ | |||
+ | ====SQL==== | ||
+ | |||
+ | ===Chaînes de caractères=== | ||
+ | |||
+ | Les chaînes de caractères doivent être entourées de **'** ou de **"**. | ||
+ | |||
+ | // | ||
+ | |||
+ | 'Linux est incroyable' | ||
+ | |||
+ | " | ||
+ | |||
+ | "Je lui dit : "" | ||
+ | |||
+ | ===Nombres=== | ||
+ | |||
+ | Il existe 3 types de nombres : | ||
+ | |||
+ | ==Nombres Entiers== | ||
+ | |||
+ | Une séquence de chiffres **sans espaces** | ||
+ | |||
+ | //Exemple// | ||
+ | |||
+ | 999256 | ||
+ | |||
+ | 0 | ||
+ | |||
+ | ==Nombres Décimaux== | ||
+ | |||
+ | Utilisent le **point** comme séparateur. | ||
+ | |||
+ | //Exemple// | ||
+ | |||
+ | 120.54 | ||
+ | |||
+ | 5566.8956e+12 | ||
+ | |||
+ | ==Nombres Négatifs== | ||
+ | |||
+ | Sont précédés par le signe **-**. | ||
+ | |||
+ | //Exemple// | ||
+ | |||
+ | -458 | ||
+ | |||
+ | -147.36 | ||
+ | |||
+ | ===Valeurs NULL=== | ||
+ | |||
+ | Une chaîne **sans données**. | ||
+ | |||
+ | <WRAP center round alert> | ||
+ | N'est pas la même chose qu'une chaîne **vide** ou un **0** dans le cas d'un nombre. | ||
+ | </ | ||
+ | |||
+ | ===Noms de Fichiers=== | ||
+ | |||
+ | Les noms de bases, tables et colonnes : | ||
+ | |||
+ | * peuvent contenir jusqu' | ||
+ | * peuvent commencer par un chiffre | ||
+ | * ne peuvent pas contenir **que** de chiffres | ||
+ | * ne peuvent pas contenir un **/**, une **\** ou un **point** | ||
+ | |||
+ | Les alias : | ||
+ | |||
+ | * peuvent contenir jusqu' | ||
+ | * peuvent contenir un **/**, une **\** ou un **point** | ||
+ | | ||
+ | ===Variables Utilisateurs=== | ||
+ | |||
+ | Les variables n'ont pas besoin d' | ||
+ | |||
+ | ===Commentaires=== | ||
+ | |||
+ | Les commentaires **d' | ||
+ | |||
+ | Les commentaires sous plusieurs lignes sont entourés comme suit : | ||
+ | |||
+ | < | ||
+ | /* | ||
+ | Ceci est | ||
+ | un commentaire | ||
+ | sur | ||
+ | plusieurs lignes | ||
+ | */ | ||
+ | </ | ||
+ | |||
+ | ===Commandes=== | ||
+ | |||
+ | ==SELECT== | ||
+ | |||
+ | Obtenir un ensemble de données à partir d'une ou de plusieurs tables. | ||
+ | |||
+ | **Syntaxe** | ||
+ | |||
+ | < | ||
+ | SELECT [table.][colonne]|expression [AS nom][, | ||
+ | FROM nom-table [, nom_table ...] | ||
+ | [WHERE condition [AND|OR condition ...] | ||
+ | [GROUP BY [table.][colonne], | ||
+ | [ORDER BY [table.][colonne][Description], | ||
+ | </ | ||
+ | |||
+ | // | ||
+ | |||
+ | SELECT nom, prenom FROM familles ORDER BY nom | ||
+ | |||
+ | SELECT nom, prenom FROM familles GROUP BY ville | ||
+ | |||
+ | ==UPDATE== | ||
+ | |||
+ | Mettre à jour des données dans une table. | ||
+ | |||
+ | **Syntaxe** | ||
+ | |||
+ | < | ||
+ | UPDATE [LOW_PRIORITY][IGNORE] nom_table | ||
+ | SET colonne = expression | ||
+ | WHERE expression | ||
+ | ORDER BY expression | ||
+ | LIMIT valeur | ||
+ | </ | ||
+ | |||
+ | ^ Directive ^ Description ^ | ||
+ | | LOW_PRIORITY | L' | ||
+ | | IGNORE | La mise à jour continue malgré des problèmes éventuels rencontrés. Les enregistrements posant problème ne seront PAS mis à jour | | ||
+ | |||
+ | // | ||
+ | |||
+ | UPDATE familles SET Adresse2=' | ||
+ | |||
+ | UPDATE familles SET nb_enfants=8 ORDER BY Nom LIMIT 3; | ||
+ | |||
+ | ==DELETE FROM== | ||
+ | |||
+ | Supprimer des enregistrements d'une table. | ||
+ | |||
+ | **Syntaxe** | ||
+ | |||
+ | < | ||
+ | DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM nom_table | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | //Exemple// | ||
+ | |||
+ | DELETE FROM familles WHERE Nom = Durant; | ||
+ | |||
+ | ==DROP TABLE== | ||
+ | |||
+ | **Syntaxe** | ||
+ | |||
+ | < | ||
+ | DROP DATABASE [IF EXISTS] db_name | ||
+ | </ | ||
+ | |||
+ | Supprimer une table d'une base de données. | ||
+ | |||
+ | //Exemple// | ||
+ | |||
+ | DROP TABLE Test; | ||
+ | |||
+ | ==INSERT== | ||
+ | |||
+ | **Syntaxe** | ||
+ | |||
+ | < | ||
+ | INSERT [LOW_PRIORITY] | [DELAYED] [IGNORE] | ||
+ | [INTO] nom_table [(nom_colonne ...)] | ||
+ | VALUES ((expression | DEFAULT) ...) , (...) | ||
+ | </ | ||
+ | |||
+ | ou | ||
+ | |||
+ | < | ||
+ | INSERT [LOW_PRIORITY] | [DELAYED] [IGNORE] | ||
+ | [INTO] nom_table [(nom_colonne ...)] | ||
+ | SELECT ... | ||
+ | </ | ||
+ | |||
+ | ^ Directive ^ Description ^ | ||
+ | | LOW_PRIORITY | L' | ||
+ | | DELAYED | Permet à un client d' | ||
+ | | IGNORE | La mise à jour continue malgré des problèmes éventuels rencontrés. Les enregistrements posant problème ne seront PAS mis à jour | | ||
+ | |||
+ | |||
+ | **INSERT VALUES** | ||
+ | |||
+ | Insérer des valeurs dans une table. | ||
+ | |||
+ | //Exemple// | ||
+ | |||
+ | INSERT INTO familles (Nom, Prenom) VALUES (' | ||
+ | |||
+ | **INSERT SELECT** | ||
+ | |||
+ | Insérer des valeurs en provenance d'une autre table dans la table cible. | ||
+ | |||
+ | //Exemple// | ||
+ | |||
+ | INSERT INTO familles (Prenom) SELECT enfants.prenom FROM enfants; | ||
+ | |||
+ | ==ALTER== | ||
+ | |||
+ | Ajouter, supprimer ou modifier une colonne, index ou nom de table. | ||
+ | |||
+ | |||
+ | **ALTER ADD** | ||
+ | |||
+ | ^ Commande ^ Description ^ | ||
+ | | ADD [COLUMN] | Ajouter un champ | | ||
+ | | ADD INDEX | Ajouter un index | | ||
+ | | ADD PRIMARY KEY | Ajouter une clef primaire | | ||
+ | | ADD UNIQUE | Ajouter un index unique | ||
+ | | ADD FULLTEXT | Ajouter une recherche texte entier | | ||
+ | |||
+ | // | ||
+ | |||
+ | ALTER TABLE familles ADD Sports VARCHAR(50) NOT NULL; | ||
+ | |||
+ | ALTER TABLE familles ADD INDEX (Sports); | ||
+ | |||
+ | |||
+ | **ALTER CHANGE** | ||
+ | |||
+ | Permet de modifier le nom ou le type d'une colonne. | ||
+ | |||
+ | //Exemple// | ||
+ | |||
+ | ALTER TABLE familles CHANGE PrenomPere Prenom_Pere VARCHAR(45) NOT NULL; | ||
+ | |||
+ | **ALTER DROP** | ||
+ | |||
+ | ^ Commande ^ Description ^ | ||
+ | | DROP [COLUMN] | Supprimer un champ | | ||
+ | | DROP INDEX | Supprimer un index | | ||
+ | | DROP PRIMARY KEY | Supprimer une clef primaire | | ||
+ | |||
+ | //Exemple// | ||
+ | |||
+ | ALTER TABLE familles DROP Sports; | ||
+ | |||
+ | **ALTER KEYS** | ||
+ | |||
+ | Permet de désactiver la clef primaire momentanément. | ||
+ | |||
+ | // | ||
+ | |||
+ | ALTER TABLE familles DISABLE KEYS; | ||
+ | |||
+ | ALTER TABLE familles ENABLE KEYS; | ||
+ | |||
+ | |||
+ | **ALTER RENAME** | ||
+ | |||
+ | Permet de renommer une table. | ||
+ | |||
+ | //Exemple// | ||
+ | |||
+ | ALTER TABLE enfants RENAME familles_enfants; | ||
+ | |||
+ | |||
+ | **ALTER ORDER BY** | ||
+ | |||
+ | Permet de reclasser physiquement une table. | ||
+ | |||
+ | //Exemple// | ||
+ | |||
+ | ALTER TABLE familles ORDER BY Prenom_Pere; | ||
+ | |||
+ | |||
+ | ==MATCH== | ||
+ | |||
+ | Permet la recherche d'un mot, d'une phrase ou d'une expression sur un **texte entier** | ||
+ | |||
+ | //Exemple// | ||
+ | |||
+ | SELECT * FROM familles WHERE MATCH (Commentaire) AGAINST (' | ||
+ | |||
+ | ===Opérateurs=== | ||
+ | |||
+ | ==Mathémathiques== | ||
+ | |||
+ | ^ Nom ^ Description ^ | ||
+ | | + | Addition | | ||
+ | | - | Soustraction | ||
+ | | * | Multiplication | | ||
+ | | / | Division | ||
+ | | () | Le calcul entre parenthèses est effectué en priorité | | ||
+ | |||
+ | ==Logiques== | ||
+ | |||
+ | ^ Nom ^ Description ^ | ||
+ | | ! | NON | | ||
+ | | %%||%% | OU | | ||
+ | | && | ET | | ||
+ | | XOR | XOR exclusif | ||
+ | |||
+ | |||
+ | ==Comparaison== | ||
+ | |||
+ | ^ Nom ^ Description ^ | ||
+ | | = | Egal | | ||
+ | | != ou <>| Non égal | | ||
+ | | < | Inférieur | | ||
+ | | < = | Inférieur ou égal | | ||
+ | | > | Supérieur | | ||
+ | | > =| Supérieur ou égal | | ||
+ | | < = > | Egal gérant la nullité | | ||
+ | | IS NULL | Nullité | ||
+ | | IS NOT NULL | Non nullité | ||
+ | |||
+ | ===Fonctions=== | ||
+ | |||
+ | ==Mathémathiques== | ||
+ | |||
+ | ^ Nom ^ Description ^ | ||
+ | | ABS(nbr) | Valeur absolue de nbr| | ||
+ | | SIGN(nbr)| -1 0 ou 1 en fonctionne du signe de nbr | | ||
+ | | MOD(nbr1, nbr2) | Indique le reste de la division de nbr1 par nbr2 | | ||
+ | | FLOOR(nbr) | Indique le plus grande nombre entier inférieur à nbr | | ||
+ | | CEILING(nbr) | Indique la plus petite valeur entière supérieure à nbr | | ||
+ | | ROUND(nbr)| Indique l' | ||
+ | | ROUND(nbr, | ||
+ | | EXP(nbr) | Indique l' | ||
+ | | POW(nbr, | ||
+ | | SQRT(nbr) | Indique la racine carrée de nbr | | ||
+ | | PI()| Indique la valeur de PI | | ||
+ | | COS(nbr) | Indique le cosinus de nbr | | ||
+ | | ACOS(nbr) | Indique l'arc cosinus de nbr | | ||
+ | | SIN(nbr) | Indique le sinus de nbr | | ||
+ | | ASIN(nbr) | Indique l'arc sinus de nbr | | ||
+ | | TAN(nbr)| Indique le tangent de nbr | | ||
+ | | ATAN(nbr) | Indique l'arc tangent de nbr | | ||
+ | | COT(nbr) | Indique la cotangente de nbr | | ||
+ | | RAND() | Indique une valeur en virgule flottante entre 0 et 1.0 | | ||
+ | | RAND(nbr) | Indique une valeur en virgule flottante entre 0 et 1.0. La valeur de nbr indique la limite haute | | ||
+ | | LEAST(nbr1, nbr2 ...)| Indique le plus petit des nombres nbr1 à nbrX | | ||
+ | | GREATEST(nbr1, | ||
+ | | DEGREES(nbr) | Convertit nbr de gradiants vers degrés | | ||
+ | | RADIANS(nbr) | Convertit nbr de degrés vers gradiants | | ||
+ | | TRUNCATE(nbr, | ||
+ | |||
+ | ==Chaînes== | ||
+ | |||
+ | ^ Nom ^ Description ^ | ||
+ | | LIKE | Effectue une comparaison en fonction d'un motif | | ||
+ | | NOT LIKE | L' | ||
+ | | _ | Remplace un caractère dans le motif d'une chaîne | ||
+ | | % | Remplace un ou plusieurs caractère(s) dans le motif d'une chaîne | ||
+ | | \ | Caractère d' | ||
+ | | BINARY| Rend la comparaison avec un motif sensible à la casse | | ||
+ | | STRCMP(chaîne1, | ||
+ | | MATCH | Utilisé pour des recherches de texte intégral | ||
+ | | UPPER(' | ||
+ | | LOWER(' | ||
+ | |||
+ | ==Dates== | ||
+ | |||
+ | ^ Nom ^ Description ^ | ||
+ | | NOW() | Retourne la date au format ' | ||
+ | | DATE_FORMAT(date, | ||
+ | | DAYOFWEEK(date) | Retourne un chiffre qui représente le jour de la semaine ( 1 pour dimanche, 7 pour samedi ) | | ||
+ | | WEEKDAY(date) | Retourne un chiffre qui représente le jour de la semaine ( 7 pour dimanche, 0 pour lundi ) | | ||
+ | | DAYOFMONTH(date) | Retourne un chiffre de 1 à 31 | | ||
+ | | DAYOFYEAR(date)| Retourne un chiffre de 1 à 366 | | ||
+ | | MONTH(date) | Retourne un chiffre de 1 à 12 | | ||
+ | | DAYNAME(date) | Retourne le nom du jour ( lundi, mardi ... ) | | ||
+ | | MONTHNAME(date) | Retourne le nom du mois | | ||
+ | | QUARTER(date) | Retourne un chiffre de 1 à 4 ( 1 = premier trimestre de l' | ||
+ | | WEEK(date [,depart] | Retourne une valeur de 1 à 52. La valeur de //depart// peut être 0 ou 1. Dans le cas de 0, le dimanche est considéré comme le premier jour de la semaine. Dans le cas de 1, c'est le lundi. | ||
+ | | YEAR(date) | Retourne un chiffre de 1000 à 9999 | | ||
+ | | HOUR(date) | Retourne l' | ||
+ | | MINUTE(date) | Retourne les minutes | ||
+ | | SECOND(date) | Retourne les secondes | ||
+ | | TO_DAYS(date)| Retourne le nombre de jours écoulés depuis le début de l'an 0 | | ||
+ | | FROM_DAYS(date) | Retourne la date à partir d'un nombre de jours écoulés depuis le début de l'an 0 | | ||
+ | | CURDATE() | Retourne la date courante au format AAAA-MM-JJ | ||
+ | | CURRENT_DATE() | Retourne la date courante au format AAAA-MM-JJ | ||
+ | | CURTIME()| Retourne la date courante au format HH: | ||
+ | | CURRENT_TIME() | Retourne la date courante au format HH: | ||
+ | | UNIX_TIMESTAMP([date]) | Retourne le nombre de secondes depuis la date 1970-01-01 00: | ||
+ | | FROM_UNIXTIME(unix_timestamp[, | ||
+ | |||
+ | **Motifs** | ||
+ | |||
+ | ^ Nom ^ Description ^ Exemple ^ | ||
+ | | %M | Le mois | janvier | ||
+ | | %W | Le jour de la semaine | ||
+ | | %D | La date du mois | 1st | | ||
+ | | %Y | L' | ||
+ | | %y | L' | ||
+ | | %a | L' | ||
+ | | %d | Le jour du mois | 01 | | ||
+ | | %m | Le numéro du mois | 01 | | ||
+ | | %b | L' | ||
+ | | %j | Le jour de l' | ||
+ | | %H | L' | ||
+ | | %h | L' | ||
+ | | %i | Les minutes | ||
+ | | %r | L' | ||
+ | | %T | L' | ||
+ | | %S | Les secondes | ||
+ | | %p | AM ou PM | PM | | ||
+ | | %w | Le numéro du jour de la semaine | ||
+ | | %U | Le numéro de la semaine avec le début de la semaine étant un dimanche | ||
+ | | %u | Le numéro de la semaine avec le début de la semaine étant un lundi | 02 | | ||
+ | |||
+ | Par exemple sous Red Hat et CentOS : | ||
+ | |||
+ | < | ||
+ | mysql> select DATE_FORMAT(now(), | ||
+ | +-----------------------------------+ | ||
+ | | DATE_FORMAT(now(), | ||
+ | +-----------------------------------+ | ||
+ | | Friday 19 October 2012 | | ||
+ | +-----------------------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | et sous Windows(tm) : | ||
+ | |||
+ | < | ||
+ | mysql> select DATE_FORMAT(now(), | ||
+ | +-----------------------------------+ | ||
+ | | DATE_FORMAT(now(), | ||
+ | +-----------------------------------+ | ||
+ | | Tuesday 23 February 2016 | | ||
+ | +-----------------------------------+ | ||
+ | 1 row in set (0.04 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ==Contrôle== | ||
+ | |||
+ | ^ Nom ^ Description ^ | ||
+ | | IF(exp1, exp2, exp3) | Si exp1 est vrai, exp2 est retournée sinon exp3 est retournée | ||
+ | | IFNULL(exp1, | ||
+ | | NULLIF(exp1, | ||
+ | | CASE value WHEN comp1 THEN res1 [WHEN comp2 THEN res2][ELSE elseres] END | La fonction compare //value// à comp1 ( comp2 ... ). Si une égalité est trouvée, res1 ( res2 ... ) est retournée. Si aucune égalité n'est trouvée, elseres est retournée | ||
+ | |||
+ | ==Agrégation== | ||
+ | |||
+ | ^ Nom ^ Description ^ | ||
+ | | AVG(colonne) | Moyenne de la colonne | ||
+ | | COUNT(items)| Le nombre de valeurs non nulles de la colonne | ||
+ | | MIN(colonne) | Valeur minimum de la colonne | ||
+ | | MAX(colonne) | Valeur maximum de la colonne | ||
+ | | STD(colonne) | Écart type des valeurs de la colonne | ||
+ | | SUM(colonne) | Somme des valeurs de la colonne | ||
+ | | BIT_OR(colonne) | Ou logique effectué sur les valeurs de la colonne | | ||
+ | | BIT_AND(colonne) | ET logique effectué sur les valeurs de la colonne | ||
+ | |||
+ | ==Autres== | ||
+ | |||
+ | ^ Nom ^ Description ^ | ||
+ | | CAST(expression) CONVERT(expression) | Convertit l' | ||
+ | | LAST_INSERT_ID()| Retourne la valeur d'une colonne // | ||
+ | | VERSION() | La version du serveur %%MySQL%% | ||
+ | | CONNECTION_ID() | L' | ||
+ | | DATABASE() | La base de données courante | ||
+ | | USER() | L' | ||
+ | | PASSWORD(chaîne) | Encrypte un mot de passe | | ||
+ | | ENCRYPT(chaîne, | ||
+ | | ENCODE(chaîne, | ||
+ | | DECODE(chaîne, | ||
+ | | MD5(chaîne) | Retourne une chaîne encodée à la norme MD5 | | ||
+ | | SHA1() | Retourne une chaîne encodée à la norme SHA1 | | ||
+ | |||
+ | |||
+ | ====Types de Champs==== | ||
+ | |||
+ | ===Nombres entiers=== | ||
+ | |||
+ | ^ Type ^ Intervalle ^ Taille en octets ^ Description ^ | ||
+ | | TINYINT[(M)] | ||
+ | | TINYINT[(M)] UNSIGNED | ||
+ | | SMALLINT[(M)] | ||
+ | | SMALLINT[(M)] UNSIGNED | ||
+ | | MEDIUMINT[(M)] | ||
+ | | MEDIUMINT[(M)] UNSIGNED | ||
+ | | INT[(M)] | ||
+ | | INT[(M)] UNSIGNED | ||
+ | | INTEGER[(M)] | ||
+ | | BIGINT[(M)] | ||
+ | | BIGINT[(M)] UNSIGNED | ||
+ | |||
+ | |||
+ | ===Nombres à virgule flottante=== | ||
+ | |||
+ | ^ Type ^ Intervalle ^ Taille en octets ^ Description ^ | ||
+ | | FLOAT(precision) | ||
+ | | FLOAT[(M, | ||
+ | | DOUBLE[(M, | ||
+ | | DOUBLEPRECISION[(M, | ||
+ | | REAL[(M, | ||
+ | | DECIMAL[(M[, | ||
+ | | NUMERIC | ||
+ | |||
+ | ===Dates et Heures=== | ||
+ | |||
+ | ^ Type ^ Intervalle ^ | ||
+ | | DATE | 1000-01-01 à 9999-12-31 | | ||
+ | | TIME | -838:59:59 à 838:59:59 | | ||
+ | | DATETIME | ||
+ | | TIMESTAMP[(M)] | ||
+ | | YEAR[(2)] | ||
+ | | YEAR[(4)] | ||
+ | |||
+ | ==Types de données TIMESTAMP== | ||
+ | |||
+ | ^ Type ^ Affichage ^ | ||
+ | | TIMESTAMP | ||
+ | | TIMESTAMP(14) | ||
+ | | TIMESTAMP(12) | ||
+ | | TIMESTAMP(10) | ||
+ | | TIMESTAMP(8) | ||
+ | | TIMESTAMP(6) | ||
+ | | TIMESTAMP(4) | ||
+ | | TIMESTAMP(2) | ||
+ | |||
+ | ===Chaînes=== | ||
+ | |||
+ | ^ Type ^ Longeur ^ Description ^ | ||
+ | | CHAR(M) | ||
+ | | VARCHAR(M) | 1 à 255 | Chaîne de longueur variable où M varie entre 1 et 255 | | ||
+ | |||
+ | ===TEXT et BLOB=== | ||
+ | |||
+ | * **TEXT**, | ||
+ | * TEXT respecte la casse des données, | ||
+ | * **BLOB** (Binary Large OBject), | ||
+ | * BLOB permet de stocker toute information binaire telle une image ou un son. | ||
+ | |||
+ | ^ Type ^ Longueur Maximale en caractères ^ Description ^ | ||
+ | | TINYBLOB | ||
+ | | TINYTEXT | ||
+ | | BLOB | 65 535 | Objet binaire de taille normale | ||
+ | | TEXT | 65 535 | Texte de taille normale | ||
+ | | MEDIUM BLOB | 16 777 215 | Objet binaire de taille moyenne | | ||
+ | | MEDIUM TEXT | 16 777 215 | Texte de taille moyenne | | ||
+ | | LONG BLOB | 4 294 967 295 | Objet binaire de grande taille | | ||
+ | | LONG TEXT | 4 294 967 295 | Texte de grande taille | | ||
+ | |||
+ | ===ENUM et SET=== | ||
+ | |||
+ | * **ENUM**, | ||
+ | * permet de prendre une valeur ou NULL parmi une liste de valeurs prédéfinies à la création de la colonne, | ||
+ | * **SET** | ||
+ | * permet de prendre un maximum de 64 valeurs ou NULL parmi une liste de valeurs prédéfinies à la création de la colonne, | ||
+ | |||
+ | ^ Type ^ Maximum des valeurs dans l' | ||
+ | | ENUM(' | ||
+ | | SET(' | ||
+ | |||
+ | ====Types de Moteurs de Stockage==== | ||
+ | |||
+ | Le type de moteur est spécifié lors de la création de la table. Le moteur d'une table existant peut être modifié avec la commande **ALTER TABLE**. Les différents types **principaux** sont résumés ci-après : | ||
+ | |||
+ | ^ Type de Moteur | ||
+ | | %%InnoDB%% | Le format par défaut. Supportent les transactions | ||
+ | | %%MyISAM%% | Données stockées dans un fichier .MYD. Index stockés dans un fichier .MYI. Structure da la table stockée dans un fichier .frm | | ||
+ | | MEMORY | Anciennement connues sous le nom HEAP. Les données sont stockées en mémoire tandis que la structure de la table est stockée sur disque dans un fichier .frm. Ne supportent pas les champs TEXT, BLOB. Ne supportent pas l' | ||
+ | | ARCHIVE | Ne supportent que des requêtes de lecture et d' | ||
+ | | CSV | Données sont stockées dans un fichier texte au format CSV. Utilisé pour échanger des données avec d' | ||
+ | | FEDERATED | Ne stocke pas de données. Extrait des données de tables en provenance de bases sur des serveurs distants. | | ||
+ | |||
+ | Bien que possible techniquement, | ||
+ | |||
+ | Le choix d'un moteur de stockage se fait en fonction de l' | ||
+ | |||
+ | ^ Moteur ^ Verrous ^ Transactionnel de type **[[http:// | ||
+ | | InnoDB | Enregistrement | Oui | Oui | Oui | Oui | Oui | Oui | Oui | Oui | | ||
+ | | MyISAM | Table | Non | Non | Non | Oui | Non | Non | Non | Non | | ||
+ | | Memory | Table | Non | Non | Non | Non | Non | Non | Non | Non | | ||
+ | | Archive | Enregistrement | Non | Non | Non | Oui | Non | Non | Non | Non | | ||
+ | | CSV | Table | Non | Non | Non | Oui | Non | Non | Non | Non | | ||
+ | | Federated | Table | Non | Non | Non | Oui | Non | Non | Non | Non | | ||
+ | | NDB Cluster | Enregistrement | Oui | Non | Oui | Oui | Oui | Oui | Oui | Oui | | ||
+ | |||
+ | ====Caractéristiques des Moteurs==== | ||
+ | |||
+ | ===InnoDB=== | ||
+ | |||
+ | Le moteur InnoDB est le moteur par défaut de MySQL depuis la version 5.5. Les principaux caractéristiques du moteur %%InnoDB%% sont : | ||
+ | |||
+ | * Il est transactionnel de type **[[http:// | ||
+ | * Il implémente le **[[http:// | ||
+ | * Il implémente un verrou au niveau enregistrement, | ||
+ | * Il implémente un mécanisme de restauration automatique en utilisant des journaux de transactions **ib_logfile*** ou ***** est **0**, **1**, **2** etc, | ||
+ | * La structure de la table est stockée dans un fichier .frm, | ||
+ | * Il supporte l' | ||
+ | * Il peut être sauvegardé à chaud, | ||
+ | * Il est recommandé pour des applications avec beaucoup d' | ||
+ | |||
+ | ==Mécanisme Interne== | ||
+ | |||
+ | {{ free: | ||
+ | |||
+ | Les transactions en cours sont stockées en mémoire dans le **buffer des journaux de transactions** (// | ||
+ | |||
+ | Une partie des données ainsi que les index sont stockés en mémoire dans le **buffer pool**. | ||
+ | |||
+ | ==Transactions== | ||
+ | |||
+ | Le moteur Innodb est transactionnel. Ceci implique que le moteur collectionne des requêtes jusqu' | ||
+ | |||
+ | Il est possible de modifier ce comportement automatique en utilisant la commande **BEGIN**. Par exemple : | ||
+ | |||
+ | < | ||
+ | mysql> BEGIN; | ||
+ | mysql> INSERT INTO table (colonne) VALUES (value); | ||
+ | mysql> COMMIT; | ||
+ | </ | ||
+ | |||
+ | Si la dernière commande est remplacée par la commande ROLLBACK la modification apportée par la requête INSERT INTO sera effacée : | ||
+ | |||
+ | < | ||
+ | mysql> BEGIN; | ||
+ | mysql> INSERT INTO table (colonne) VALUES (value); | ||
+ | mysql> ROLLBACK; | ||
+ | </ | ||
+ | |||
+ | ==Tablespace== | ||
+ | |||
+ | Depuis la version 5.6.6 de MySQL, il existe l' | ||
+ | |||
+ | Cette modification permet le stockage des fichiers .ibd sur un autre espace de stockage physique. De cette façon, il est possible d' | ||
+ | |||
+ | Malgré l' | ||
+ | |||
+ | <WRAP center round alert> | ||
+ | Malgré l' | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | La quantité de mémoire libre dans un fichier *.ibd ou dans la Tablespace est indiquée par la sortie de la commande **SHOW TABLE STATUS**. Cette valeur est en pages et chaque page vaut 16 Ko. Bien que vous puissiez libérer de l' | ||
+ | </ | ||
+ | |||
+ | ==Multiversion Concurrency Control== | ||
+ | |||
+ | Chaque table Innodb contient deux colonnes cachées : | ||
+ | |||
+ | * le numéro de transaction - **txn#**, | ||
+ | * un pointeur vers la version précédente de la ligne qui se trouve dans le Undo log. Ce pointeur s' | ||
+ | |||
+ | Quand une ligne est modifiée, l' | ||
+ | |||
+ | ==Transaction Isolation Levels== | ||
+ | |||
+ | Créez la base de données **nombres** : | ||
+ | |||
+ | < | ||
+ | mysql> CREATE DATABASE `Nombres` ; | ||
+ | Query OK, 1 row affected (0.01 sec) | ||
+ | |||
+ | mysql> USE Nombres; | ||
+ | Database changed | ||
+ | |||
+ | mysql> CREATE TABLE english (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, Number VARCHAR(10)); | ||
+ | Query OK, 0 rows affected (0.08 sec) | ||
+ | |||
+ | mysql> INSERT INTO english (Number) VALUES (' | ||
+ | Query OK, 1 row affected (0.01 sec) | ||
+ | |||
+ | mysql> INSERT INTO english (Number) VALUES (' | ||
+ | Query OK, 1 row affected (0.01 sec) | ||
+ | |||
+ | mysql> INSERT INTO english (Number) VALUES (' | ||
+ | Query OK, 1 row affected (0.01 sec) | ||
+ | |||
+ | mysql> SELECT * FROM english; | ||
+ | +----+--------+ | ||
+ | | id | Number | | ||
+ | +----+--------+ | ||
+ | | 1 | One | | ||
+ | | 2 | Two | | ||
+ | | 3 | Three | | ||
+ | +----+--------+ | ||
+ | 3 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | **Read Uncomitted** | ||
+ | |||
+ | Mettez à jour l' | ||
+ | |||
+ | < | ||
+ | mysql> BEGIN; | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> UPDATE english SET Number = " | ||
+ | Query OK, 1 row affected (0.04 sec) | ||
+ | Rows matched: 1 Changed: 1 Warnings: 0 | ||
+ | |||
+ | mysql> SELECT * FROM english; | ||
+ | +----+--------+ | ||
+ | | id | Number | | ||
+ | +----+--------+ | ||
+ | | 1 | Un | | ||
+ | | 2 | Two | | ||
+ | | 3 | Three | | ||
+ | +----+--------+ | ||
+ | 3 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Ouvrez une autre terminal, connectez-vous à mysql et visualisez la modification : | ||
+ | |||
+ | < | ||
+ | [root@node01 ~]# mysql | ||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 3 | ||
+ | Server version: 5.5.33-cll-lve MySQL Community Server (GPL) by Atomicorp | ||
+ | |||
+ | Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> USE Nombres; | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | |||
+ | mysql> SELECT * FROM english; | ||
+ | +----+--------+ | ||
+ | | id | Number | | ||
+ | +----+--------+ | ||
+ | | 1 | One | | ||
+ | | 2 | Two | | ||
+ | | 3 | Three | | ||
+ | +----+--------+ | ||
+ | 3 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que le deuxième client voit l' | ||
+ | </ | ||
+ | |||
+ | Pour voir la valeur dans la Tablespace, il faut modifier la valeur de l' | ||
+ | |||
+ | < | ||
+ | mysql> SET TRANSACTION ISOLATION LEVEL read uncommitted; | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> SELECT * FROM english; | ||
+ | +----+--------+ | ||
+ | | id | Number | | ||
+ | +----+--------+ | ||
+ | | 1 | Un | | ||
+ | | 2 | Two | | ||
+ | | 3 | Three | | ||
+ | +----+--------+ | ||
+ | 3 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round alert> | ||
+ | Dans ce mode, le client voit une donnée fictive car il n'y a pas encore eu de COMMIT ! | ||
+ | </ | ||
+ | |||
+ | **Read Comitted** | ||
+ | |||
+ | Dans ce mode de fonctionnement InnoDB suit les Pointeurs ROLLBACK jusqu' | ||
+ | |||
+ | < | ||
+ | mysql> SET TRANSACTION ISOLATION LEVEL read committed; | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> SELECT * FROM english; | ||
+ | +----+--------+ | ||
+ | | id | Number | | ||
+ | +----+--------+ | ||
+ | | 1 | One | | ||
+ | | 2 | Two | | ||
+ | | 3 | Three | | ||
+ | +----+--------+ | ||
+ | 3 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Retournez au premier terminal : | ||
+ | |||
+ | < | ||
+ | mysql> COMMIT; | ||
+ | Query OK, 0 rows affected (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Retournez au deuxième terminal : | ||
+ | |||
+ | < | ||
+ | < | ||
+ | +----+--------+ | ||
+ | | id | Number | | ||
+ | +----+--------+ | ||
+ | | 1 | Un | | ||
+ | | 2 | Two | | ||
+ | | 3 | Three | | ||
+ | +----+--------+ | ||
+ | 3 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ===MyISAM=== | ||
+ | |||
+ | L' | ||
+ | |||
+ | * Il n'est pas transactionnel, | ||
+ | * Il implémente un verrou au niveau table, | ||
+ | * Il n'y a pas de recouvrement automatique des données lors d'un crash, | ||
+ | * La structure de la table est stockée dans un fichier .frm, | ||
+ | * Les données sont stockées dans un fichier .MYD tandis que les index sont stockés dans un fichier .MYI, | ||
+ | * Il ne supporte pas de clefs étrangères, | ||
+ | * Il ne peut pas être sauvegardé à chaud, | ||
+ | * Il peut être compressé, | ||
+ | * Il supporte les index plain text (fulltext), | ||
+ | * Il est recommandé pour des applications avec beaucoup de lectures. | ||
+ | |||
+ | Il existe trois types de moteurs %%MyISAM%% : FIXED , DYNAMIC et COMPRESSED : | ||
+ | |||
+ | == MyISAM FIXED== | ||
+ | |||
+ | Une table est FIXED si elle ne contient aucun champ de type VARCHAR, VARBINARY, TEXT ou BLOB ou si la valeur de l' | ||
+ | |||
+ | < | ||
+ | mysql> USE mysql; | ||
+ | Database changed | ||
+ | mysql> SHOW TABLE STATUS LIKE ' | ||
+ | *************************** 1. row *************************** | ||
+ | Name: db | ||
+ | | ||
+ | Version: 10 | ||
+ | | ||
+ | Rows: 2 | ||
+ | | ||
+ | Data_length: | ||
+ | Max_data_length: | ||
+ | | ||
+ | Data_free: 0 | ||
+ | | ||
+ | Create_time: | ||
+ | Update_time: | ||
+ | | ||
+ | Collation: utf8_bin | ||
+ | | ||
+ | | ||
+ | Comment: Database privileges | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | ERROR: | ||
+ | No query specified | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ===MyISAM DYNAMIC == | ||
+ | |||
+ | Une table est DYNAMIC si elle contient au moins un champ de type VARCHAR, VARBINARY, TEXT ou BLOB ou la valeur de l' | ||
+ | |||
+ | < | ||
+ | mysql> SHOW TABLE STATUS LIKE ' | ||
+ | *************************** 1. row *************************** | ||
+ | Name: proc | ||
+ | | ||
+ | Version: 10 | ||
+ | | ||
+ | Rows: 0 | ||
+ | | ||
+ | Data_length: | ||
+ | Max_data_length: | ||
+ | | ||
+ | Data_free: 0 | ||
+ | | ||
+ | Create_time: | ||
+ | Update_time: | ||
+ | | ||
+ | Collation: utf8_general_ci | ||
+ | | ||
+ | | ||
+ | Comment: Stored Procedures | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | ERROR: | ||
+ | No query specified | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ==MyISAM COMPRESSED== | ||
+ | |||
+ | Après avoir arrêté le serveur, la compression est obtenue en utilisant la commande **myisampack** suivi de la commande **myisamchk -rq**. Le décompression est obtenue en utilisant la commande **myisamchk --unpack**. La compression peut atteindre les 70% maximum. Une fois compressée les requêtes UPDATE, DELETE et INSERT ne peuvent pas être utilisées : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# myisampack / | ||
+ | Compressing / | ||
+ | - Calculating statistics | ||
+ | - Compressing file | ||
+ | 95.21% | ||
+ | Remember to run myisamchk -rq on compressed tables | ||
+ | |||
+ | [root@centos6 ~]# myisamchk -rq / | ||
+ | - check record delete-chain | ||
+ | - recovering (with sort) MyISAM-table '/ | ||
+ | Data records: 467 | ||
+ | - Fixing index 1 | ||
+ | - Fixing index 2 | ||
+ | |||
+ | [root@centos6 ~]# myisamchk --unpack / | ||
+ | - recovering (with sort) MyISAM-table '/ | ||
+ | Data records: 467 | ||
+ | - Fixing index 1 | ||
+ | - Fixing index 2 | ||
+ | </ | ||
+ | |||
+ | ==Particularités== | ||
+ | |||
+ | * Le moteur MyISAM est particulièrement portable car il suffit de copier les fichiers *.frm, *.MYD et *.MYI pour obtenir une sauvegarde physique, | ||
+ | * Le nombre d' | ||
+ | * Les index non-uniques peuvent être désactivés momentanément, | ||
+ | * Il est possible d' | ||
+ | |||
+ | |||
+ | ===Memory=== | ||
+ | |||
+ | Les principaux caractéristiques du moteur Memory sont : | ||
+ | |||
+ | * Il n'est pas transactionnel, | ||
+ | * Il implémente un verrou au niveau table, | ||
+ | * Il n'y a pas de recouvrement automatique des données lors d'un crash, | ||
+ | * La structure de la table est stockée dans un fichier .frm, | ||
+ | * Les données sont stockées dans la mémoire, | ||
+ | * Il ne supporte pas de clefs étrangères, | ||
+ | * Il ne peut pas être sauvegardé à chaud, | ||
+ | * Il est recommandé pour des applications ayant besoin de la vitesse. | ||
+ | |||
+ | ==Particularités== | ||
+ | |||
+ | * La consommation de la mémoire est fixée par les options **MAX_ROWS** et **max_heap_table_size**, | ||
+ | * Le moteur peut implémenter soit l' | ||
+ | * Au démarrage du serveur les tables sont évidement vides. Il est possible de les pré-remplir grâce à des instructions SQL contenues dans un fichier référencé par l' | ||
+ | |||
+ | ===Archive=== | ||
+ | |||
+ | Les principaux caractéristiques du moteur Archive sont : | ||
+ | |||
+ | * Il n'est pas transactionnel, | ||
+ | * Il implémente un verrou au niveau enregistrement, | ||
+ | * Il n'y a pas de recouvrement automatique des données lors d'un crash, | ||
+ | * Les données sont stockées en les compressant, | ||
+ | * Il ne supporte pas de clefs étrangères, | ||
+ | * Il ne peut pas être sauvegardé à chaud, | ||
+ | * Il ne supporte pas d' | ||
+ | * Il est recommandé pour réduire l' | ||
+ | |||
+ | ==Particularités== | ||
+ | |||
+ | * Le moteur ne permet que des requêtes INSERT et SELECT. | ||
+ | |||
+ | ===CSV=== | ||
+ | |||
+ | Les principaux caractéristiques du moteur CSV sont : | ||
+ | |||
+ | * Il n'est pas transactionnel, | ||
+ | * Il implémente un verrou au niveau table, | ||
+ | * Il n'y a pas de recouvrement automatique des données lors d'un crash, | ||
+ | * La structure de la table est stockée dans un fichier .frm, | ||
+ | * Les données sont séparées par des **;** et stockées dans un fichier .CSV tandis que les informations concernant l' | ||
+ | * Il ne supporte pas de clefs étrangères, | ||
+ | * Il ne peut pas être sauvegardé à chaud, | ||
+ | * Il ne supporte pas d' | ||
+ | * Il est recommandé pour des tables ayant besoin d' | ||
+ | |||
+ | ===FEDERATED=== | ||
+ | |||
+ | Les principaux caractéristiques du moteur FEDERATED sont : | ||
+ | |||
+ | * Il n'est pas transactionnel, | ||
+ | * Il n'y a pas de recouvrement automatique des données lors d'un crash, | ||
+ | * Il ne supporte pas de clefs étrangères, | ||
+ | * Il ne peut pas être sauvegardé à chaud, | ||
+ | * Il ne supporte pas d' | ||
+ | * Il supporte des requêtes SELECT, INSERT, UPDATE, DELETE, TRUNCATE et DROP TABLE, | ||
+ | * Il n' | ||
+ | * Il est utilisé pour accéder à des données localisées sur un serveur **MySQL** distant. | ||
+ | |||
+ | ===NDB Cluster=== | ||
+ | |||
+ | Le moteur NDB Cluster est le moteur de MySQL Cluster. Les principaux caractéristiques du moteur NDB Cluster sont : | ||
+ | |||
+ | * Il est transactionnel de type **[[http:// | ||
+ | * Il implémente le **[[http:// | ||
+ | * Il implémente un verrou au niveau enregistrement, | ||
+ | * Il implémente la réplication synchrone, | ||
+ | * Il implémente le basculement automatique sur un autre nœud en cas de panne et la synchronisation automatique du nœud à son démarrage, | ||
+ | * Il peut être sauvegardé à chaud, | ||
+ | * Il permet le dimensionnement des requêtes de lecture et d' | ||
+ | * Il utilise l' | ||
+ | * Il implémente l’absence du **[[http:// | ||
+ | |||
+ | ===Autres Moteurs Non Standards=== | ||
+ | |||
+ | ==XtraDB== | ||
+ | |||
+ | **[[http:// | ||
+ | |||
+ | * Il est transactionnel de type **[[http:// | ||
+ | * Il implémente le **[[http:// | ||
+ | * Il implémente un verrou au niveau enregistrement, | ||
+ | * Il implémente un mécanisme de restauration automatique, | ||
+ | * Il supporte l' | ||
+ | * Il peut être sauvegarder à chaud, | ||
+ | * Le moteur peut implémenter soit l' | ||
+ | |||
+ | ==Aria== | ||
+ | |||
+ | **[[https:// | ||
+ | |||
+ | * En version 2.0, il est transactionnel de type **[[http:// | ||
+ | * Il implémente un verrou au niveau enregistrement, | ||
+ | * Il implémente un mécanisme de restauration automatique. | ||
+ | |||
+ | ====Jointures==== | ||
+ | |||
+ | Les jointures permettent de créer un lien entre deux tables. Le champ utilisé pour la jointure dans la première table est souvent la **clef primaire**. Le champs utilisé dans la deuxième table est appelé le **clef étrangère**. La clef primaire et la clef étrangère doivent être du même **type**. | ||
+ | |||
+ | Dans le cas où on utilise un champs autre que la clef primaire pour assurer la jointure, cet autre champs doit être **indexé**. | ||
+ | |||
+ | ===FULL JOIN=== | ||
+ | |||
+ | Ce type de jointure permet de renvoyer uniquement les enregistrements des **deux** tables 1 et 2 ayant une correspondance : | ||
+ | |||
+ | mysql> SELECT table1.champ1, | ||
+ | |||
+ | ou | ||
+ | |||
+ | mysql> SELECT table1.champ1, | ||
+ | |||
+ | ===LEFT JOIN=== | ||
+ | |||
+ | Ce type de jointure permet de renvoyer les enregistrements de la première table qui ont une correspondance dans la deuxième table. La syntaxe est la suivante : | ||
+ | |||
+ | mysql> SELECT table1.champ1, | ||
+ | |||
+ | Le résultat de cette requête est l' | ||
+ | |||
+ | mysql> SELECT table1.champ1, | ||
+ | |||
+ | ===RIGHT JOIN=== | ||
+ | |||
+ | Ce type de jointure est l' | ||
+ | |||
+ | ====LAB #4 - Le Langage SQL==== | ||
+ | |||
+ | Créez maintenant la base de données **%%CarnetAdresses%%** : | ||
+ | |||
+ | < | ||
+ | mysql> CREATE DATABASE `CarnetAdresses` ; | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Créez ensuite deux tables **familles** et **enfants** dans la base **CarnetAdresses** : | ||
+ | |||
+ | < | ||
+ | mysql> USE CarnetAdresses ; | ||
+ | Database changed | ||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> CREATE TABLE familles (CodeFamille BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, Nom VARCHAR(40), | ||
+ | -> PrenomPere VARCHAR(40) , PrenomMere VARCHAR(40) , Adresse1 VARCHAR(40) , Adresse2 VARCHAR(40), | ||
+ | -> CodePostal VARCHAR(5), Ville VARCHAR(40), | ||
+ | Query OK, 0 rows affected (0.03 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Pour plus de facilité, copiez simplement la requête et collez-la dans votre terminal : | ||
+ | |||
+ | <file text familles> | ||
+ | CREATE TABLE familles (CodeFamille BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, Nom VARCHAR(40), | ||
+ | PrenomPere VARCHAR(40) , PrenomMere VARCHAR(40) , Adresse1 VARCHAR(40) , Adresse2 VARCHAR(40), | ||
+ | CodePostal VARCHAR(5), Ville VARCHAR(40), | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> CREATE TABLE Enfants ( CodeFamille BIGINT NOT NULL, Prenom VARCHAR(40) NOT NULL, | ||
+ | -> Sexe VARCHAR(1) NOT NULL, DateNaissance DATE NOT NULL, PRIMARY KEY (CodeFamille)); | ||
+ | Query OK, 0 rows affected (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Pour plus de facilité, copiez simplement la requête et collez-la dans votre terminal : | ||
+ | |||
+ | <file text enfants> | ||
+ | CREATE TABLE Enfants ( CodeFamille BIGINT NOT NULL, Prenom VARCHAR(40) NOT NULL,\\ | ||
+ | Sexe VARCHAR(1) NOT NULL, DateNaissance DATE NOT NULL, PRIMARY KEY (CodeFamille)); | ||
+ | </ | ||
+ | |||
+ | Utilisez ensuite la commande SHOW pour visualiser le résultat de chaque instruction, | ||
+ | |||
+ | < | ||
+ | mysql> SHOW DATABASES; | ||
+ | +--------------------+ | ||
+ | | Database | ||
+ | +--------------------+ | ||
+ | | information_schema | | ||
+ | | CarnetAdresses | ||
+ | | mysql | | ||
+ | | test | | ||
+ | +--------------------+ | ||
+ | 4 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> SHOW TABLES FROM CarnetAdresses; | ||
+ | +--------------------------+ | ||
+ | | Tables_in_CarnetAdresses | | ||
+ | +--------------------------+ | ||
+ | | Enfants | ||
+ | | familles | ||
+ | +--------------------------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> SHOW COLUMNS FROM familles FROM CarnetAdresses; | ||
+ | +-------------+-------------+------+-----+---------+----------------+ | ||
+ | | Field | Type | Null | Key | Default | Extra | | ||
+ | +-------------+-------------+------+-----+---------+----------------+ | ||
+ | | CodeFamille | bigint(20) | ||
+ | | Nom | varchar(40) | YES | | NULL | | | ||
+ | | PrenomPere | ||
+ | | PrenomMere | ||
+ | | Adresse1 | ||
+ | | Adresse2 | ||
+ | | CodePostal | ||
+ | | Ville | varchar(40) | YES | | NULL | | | ||
+ | | ProfPere | ||
+ | | ProfMere | ||
+ | +-------------+-------------+------+-----+---------+----------------+ | ||
+ | 10 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> SHOW INDEX FROM familles; | ||
+ | +----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | ||
+ | | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | | ||
+ | +----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | ||
+ | | familles | 0 | PRIMARY | ||
+ | +----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> SHOW TABLE STATUS FROM CarnetAdresses; | ||
+ | +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+ | ||
+ | | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | ||
+ | +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+ | ||
+ | | Enfants | ||
+ | | familles | InnoDB | 10 | Compact | ||
+ | +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Créez les enregistrements dans la table **familles** : | ||
+ | |||
+ | <file text data> | ||
+ | INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES (' | ||
+ | </ | ||
+ | |||
+ | Saisissez maintenant chacune des commandes suivantes et expliquez le résultat obtenu. Les instructions sont numérotées pour faciliter vos prises de notes. | ||
+ | |||
+ | | 1 | ALTER TABLE Enfants ADD INDEX (Prenom); | | ||
+ | | 2 | ALTER TABLE Enfants DROP INDEX Prenom; | | ||
+ | | 3 | ALTER TABLE Enfants ADD %%TelPort%% VARCHAR(50) NOT NULL; | | ||
+ | | 4 | ALTER TABLE Enfants CHANGE %%TelPort%% %%TelPort%% VARCHAR( 22 ) NOT NULL; | | ||
+ | | 5 | ALTER TABLE Enfants ADD Test VARCHAR( 40 ) NOT NULL; | | ||
+ | | 6 | ALTER TABLE Enfants DROP Test; | | ||
+ | | 7 | SELECT * FROM familles; | | ||
+ | | 8 | SELECT * FROM familles LIMIT 8,12; | | ||
+ | |||
+ | <WRAP center round tip> | ||
+ | **LIMIT** - Avec un argument, la valeur spécifie le nombre de lignes à retourner depuis le début du jeu de résultat. Si deux arguments sont donnés, le premier indique le décalage du premier enregistrement à retourner, le second donne le nombre maximum d' | ||
+ | </ | ||
+ | |||
+ | | 9 | UPDATE familles SET Adresse1 = '120 rue de Vaugirard', | ||
+ | | 10 | DELETE FROM familles WHERE Nom = ' | ||
+ | | 11 | DELETE FROM familles WHERE Ville = ' | ||
+ | | 12 | SELECT * FROM familles LIMIT 8,12; | | ||
+ | | 13 | SELECT nom, %%PrenomPere%% FROM familles; | | ||
+ | | 14 | SELECT Nom AS 'Nom de famille', | ||
+ | | 15 | INSERT INTO Enfants (Prenom, Sexe, %%CodeFamille%%) VALUES (' | ||
+ | | 16 | SELECT familles.nom, | ||
+ | |||
+ | <WRAP center round todo> | ||
+ | Créez la colonne **familles.nb_enfants**. | ||
+ | </ | ||
+ | |||
+ | | 17 | UPDATE familles SET nb_enfants = ' | ||
+ | | 18 | UPDATE familles SET nb_enfants = ' | ||
+ | | 19 | UPDATE familles SET nb_enfants = ' | ||
+ | | 20 | UPDATE familles SET nb_enfants = ' | ||
+ | | 21 | UPDATE familles SET nb_enfants = ' | ||
+ | | 22 | UPDATE familles SET nb_enfants = ' | ||
+ | | 23 | UPDATE familles SET nb_enfants = ' | ||
+ | | 24 | UPDATE familles SET nb_enfants = ' | ||
+ | | 25 | UPDATE familles SET nb_enfants = ' | ||
+ | | 26 | SELECT SUM(nb_enfants) FROM familles; | | ||
+ | | 27 | SELECT MIN(nb_enfants) AS 'Nb enfants minimum', | ||
+ | | 28 | SELECT nom FROM familles WHERE ville = ' | ||
+ | | 29 | SELECT nom FROM familles WHERE ville = ' | ||
+ | | 30 | ALTER TABLE Enfants DROP PRIMARY KEY; | | ||
+ | | 31 | INSERT INTO Enfants (Prenom, Sexe, %%CodeFamille%%) VALUES (' | ||
+ | | 32 | INSERT INTO Enfants (Prenom, Sexe, %%CodeFamille%%) VALUES (' | ||
+ | | 33 | INSERT INTO Enfants (Prenom, Sexe, %%CodeFamille%%) VALUES (' | ||
+ | | 34 | SELECT | ||
+ | | 35 | SELECT familles.nom, | ||
+ | | 36 | SELECT ville, min(nb_enfants) as 'Nb enfants minimum', | ||
+ | | 37 | SELECT * FROM familles ORDER BY nom; | | ||
+ | | 38 | SELECT * FROM familles GROUP BY ville, Nom; | | ||
+ | | 39 | %%UPDATE familles SET Adresse2 = ' | ||
+ | | 40 | %%UPDATE familles SET Adresse2 = ' | ||
+ | | 41 | UPDATE familles SET nb_enfants=4 WHERE Ville = ' | ||
+ | | 42 | UPDATE familles SET nb_enfants=7 LIMIT 4; | | ||
+ | | 43 | UPDATE familles SET nb_enfants=8 ORDER BY Nom LIMIT 3; | | ||
+ | | 44 | DELETE FROM familles WHERE Nom = ' | ||
+ | | 45 | CREATE TABLE loisirs( Nom VARCHAR( 30 ) NOT NULL ); | | ||
+ | | 46 | DROP TABLE loisirs; | | ||
+ | | 47 | INSERT INTO familles (Nom, %%PrenomPere%%) VALUES (' | ||
+ | | 48 | INSERT INTO familles (%%PrenomPere%%) SELECT Enfants.prenom FROM Enfants; | | ||
+ | | 49 | ALTER TABLE familles ADD Sports VARCHAR(50) NOT NULL; | | ||
+ | | 50 | ALTER TABLE familles ADD INDEX (Sports); | | ||
+ | | 51 | ALTER TABLE familles ADD INDEX (%%PrenomPere%%), | ||
+ | | 52 | ALTER TABLE familles CHANGE %%PrenomPere%% Prenom_Pere VARCHAR( 45 ) NOT NULL; | | ||
+ | | 53 | ALTER TABLE familles DROP Sports; | | ||
+ | | 54 | ALTER TABLE familles DROP INDEX %%PrenomPere%%; | ||
+ | | 55 | ALTER TABLE familles DISABLE KEYS; | | ||
+ | | 56 | ALTER TABLE Enfants RENAME familles_enfants; | ||
+ | | 57 | ALTER TABLE familles ORDER BY Prenom_Pere; | ||
+ | | 58 | ALTER TABLE familles ADD Commentaire LONGTEXT NOT NULL ; | | ||
+ | | 59 | ALTER TABLE familles ADD FULLTEXT (Commentaire); | ||
+ | | 60 | UPDATE familles SET Commentaire = 'La vie est un long fleuve tranquille' | ||
+ | | 61 | UPDATE familles SET Commentaire = ' | ||
+ | | 62 | UPDATE familles SET Commentaire = 'Le ruisseau se jette dans la rivière qui se jette dans le FLEUVE' | ||
+ | | 63 | SELECT * FROM familles WHERE MATCH (Commentaire) AGAINST (' | ||
+ | | 64 | SELECT Nom, Commentaire FROM familles WHERE MATCH (Commentaire) AGAINST (' | ||
+ | |||
+ | =====Procédures, | ||
+ | |||
+ | ====Routines Stockées==== | ||
+ | |||
+ | ===Procédures stockées === | ||
+ | |||
+ | Les procédures stockées et les fonctions sont créées avec les commandes **CREATE PROCEDURE** et **CREATE FUNCTION**. Une procédure est appelée avec la commande **CALL** et peut appeler une autre **routine stockée**. Une routine est une procédure stockée ou une fonction. | ||
+ | |||
+ | Une routine hérite de la base de données par défaut de l' | ||
+ | |||
+ | Pour illustrer les procédures stockées, vous allez travailler sur une base de données conçue pour suivre des rencontres et résultats d'un ligue d' | ||
+ | |||
+ | < | ||
+ | mysql> CREATE DATABASE ligue1; | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | CREATE TABLE ligue1.equipe ( | ||
+ | id_equipe int primary key auto_increment, | ||
+ | nom varchar(50) not null, | ||
+ | stade varchar(50) not null, | ||
+ | ville varchar(30) not null, | ||
+ | points int not null default 0, | ||
+ | buts int not null default 0 | ||
+ | ) ENGINE=MyISAM; | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | CREATE TABLE ligue1.rencontre ( | ||
+ | id_domicile int, | ||
+ | id_visiteurs int, | ||
+ | date_match DATETIME, | ||
+ | score_domicile tinyint, | ||
+ | score_visiteurs tinyint, | ||
+ | arbitre varchar(80), | ||
+ | primary key (id_domicile, | ||
+ | ) ENGINE=MyISAM; | ||
+ | </ | ||
+ | |||
+ | Consultez les bases: | ||
+ | |||
+ | < | ||
+ | mysql> SHOW DATABASES; | ||
+ | +--------------------+ | ||
+ | | Database | ||
+ | +--------------------+ | ||
+ | | information_schema | | ||
+ | | CarnetAdresses | ||
+ | | ligue1 | ||
+ | | mysql | | ||
+ | | test | | ||
+ | +--------------------+ | ||
+ | 5 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Sélectionnez la base **ligue1**: | ||
+ | |||
+ | < | ||
+ | mysql> USE ligue1; | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Ensuite créez la première procédure dans la base ligue1: | ||
+ | |||
+ | < | ||
+ | DELIMITER // | ||
+ | CREATE PROCEDURE ligue1.INIT_EQUIPE (nom_eq varchar(50), | ||
+ | BEGIN | ||
+ | INSERT INTO equipe (nom, stade, ville) VALUES (nom_eq, stade_eq, ville_eq); | ||
+ | END// | ||
+ | DELIMITER ; | ||
+ | </ | ||
+ | |||
+ | Cette procédure a pour but l' | ||
+ | |||
+ | < | ||
+ | mysql> | ||
+ | mysql> | ||
+ | -> BEGIN | ||
+ | -> | ||
+ | -> END// | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Appelez la procédure pour saisir trois équipes: | ||
+ | |||
+ | < | ||
+ | mysql> CALL ligue1.INIT_EQUIPE(' | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> CALL ligue1.INIT_EQUIPE(' | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> CALL ligue1.INIT_EQUIPE(' | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Visualisez les entrées de la table **equipe**: | ||
+ | |||
+ | < | ||
+ | mysql> SELECT * FROM ligue1.equipe; | ||
+ | +-----------+-------------+------------------+----------+--------+------+ | ||
+ | | id_equipe | nom | stade | ville | points | buts | | ||
+ | +-----------+-------------+------------------+----------+--------+------+ | ||
+ | | 1 | FC Mandriva | Parc des Princes | Paris | 0 | 0 | | ||
+ | | 2 | Debian AC | Yankee Stadium | ||
+ | | 3 | Vista FC | Qwest Field | Redmond | ||
+ | +-----------+-------------+------------------+----------+--------+------+ | ||
+ | 3 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Créez une deuxième procédure pour initialiser les rencontres: | ||
+ | |||
+ | < | ||
+ | DELIMITER // | ||
+ | CREATE PROCEDURE ligue1.SAISIR_RENCONTRE (id_dom INTEGER, id_vis INTEGER, date_m DATETIME, arbitre_m VARCHAR(80)) | ||
+ | BEGIN | ||
+ | INSERT INTO rencontre (id_domicile, | ||
+ | VALUES (id_dom, id_vis, date_m, arbitre_m); | ||
+ | END// | ||
+ | DELIMITER ; | ||
+ | </ | ||
+ | |||
+ | Cette procédure crée un rencontre entre deux équipes à une date précise et avec un arbitre précis. Vous obtiendrez un résultat similaire à celui-ci: | ||
+ | |||
+ | < | ||
+ | mysql> | ||
+ | mysql> | ||
+ | -> BEGIN | ||
+ | -> | ||
+ | -> | ||
+ | -> END// | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Appelez la procédure pour créer trois rencontres: | ||
+ | |||
+ | < | ||
+ | mysql> CALL ligue1.SAISIR_RENCONTRE(1, | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> CALL ligue1.SAISIR_RENCONTRE(2, | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> CALL ligue1.SAISIR_RENCONTRE(3, | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Visualisez les entrées de la table **rencontre**: | ||
+ | |||
+ | < | ||
+ | mysql> SELECT * FROM ligue1.rencontre; | ||
+ | +-------------+--------------+---------------------+----------------+-----------------+---------------+ | ||
+ | | id_domicile | id_visiteurs | date_match | ||
+ | +-------------+--------------+---------------------+----------------+-----------------+---------------+ | ||
+ | | 1 | 2 | 2006-12-25 00:00:00 | NULL | NULL | Paul Unix | | ||
+ | | 2 | 3 | 2006-12-26 00:00:00 | NULL | NULL | Joseph Bash | | ||
+ | | 3 | 4 | 2006-12-27 00:00:00 | NULL | NULL | Jean Fenêtre | | ||
+ | +-------------+--------------+---------------------+----------------+-----------------+---------------+ | ||
+ | 3 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Les matchs ayant eu lieu, il faut maintenant mettre à jour cette table. Créez une procédure pour la mise à jour des résultats: | ||
+ | |||
+ | < | ||
+ | DELIMITER // | ||
+ | CREATE PROCEDURE `ligue1`.`SAISIR_RESULTAT`(id_dom INTEGER, id_vis INTEGER, score_dom TINYINT(4), score_vis TINYINT(4)) | ||
+ | BEGIN | ||
+ | UPDATE ligue1.rencontre | ||
+ | SET score_domicile = score_dom, score_visiteurs = score_vis | ||
+ | WHERE id_domicile=id_dom AND id_visiteurs=id_vis; | ||
+ | IF score_dom = score_vis THEN | ||
+ | UPDATE equipe SET points = points+1 | ||
+ | WHERE id_equipe=id_dom OR id_equipe=id_vis; | ||
+ | ELSEIF score_dom > score_vis THEN | ||
+ | UPDATE equipe SET points = points+3 WHERE id_equipe = id_dom; | ||
+ | ELSE UPDATE equipe SET points = points+3 WHERE id_equipe = id_vis; | ||
+ | END IF; | ||
+ | END// | ||
+ | DELIMITER ; | ||
+ | </ | ||
+ | |||
+ | Vous obtiendrez un résultat similaire à celui-ci: | ||
+ | |||
+ | < | ||
+ | mysql> CREATE PROCEDURE `ligue1`.`SAISIR_RESULTAT`(id_dom INTEGER, id_vis INTEGER, score_dom TINYINT(4), score_vis TINYINT(4)) | ||
+ | -> BEGIN | ||
+ | -> UPDATE ligue1.rencontre | ||
+ | -> SET score_domicile = score_dom, score_visiteurs = score_vis | ||
+ | -> WHERE id_domicile=id_dom AND id_visiteurs=id_vis; | ||
+ | -> IF score_dom = score_vis THEN | ||
+ | -> UPDATE equipe SET points = points+1 | ||
+ | -> WHERE id_equipe=id_dom OR id_equipe=id_vis; | ||
+ | -> ELSEIF score_dom > score_vis THEN | ||
+ | -> UPDATE equipe SET points = points+3 WHERE id_equipe = id_dom; | ||
+ | -> ELSE UPDATE equipe SET points = points+3 WHERE id_equipe = id_vis; | ||
+ | -> END IF; | ||
+ | -> END// | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> DELIMITER ; | ||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Appelez la procédure pour les trois matchs: | ||
+ | |||
+ | < | ||
+ | mysql> CALL ligue1.SAISIR_RESULTAT(1, | ||
+ | Query OK, 1 row affected (0.01 sec) | ||
+ | |||
+ | mysql> CALL ligue1.SAISIR_RESULTAT(2, | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> CALL ligue1.SAISIR_RESULTAT(3, | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Visualisez les entrées de la table **rencontre**: | ||
+ | |||
+ | < | ||
+ | mysql> SELECT * FROM ligue1.rencontre; | ||
+ | +-------------+--------------+---------------------+----------------+-----------------+---------------+ | ||
+ | | id_domicile | id_visiteurs | date_match | ||
+ | +-------------+--------------+---------------------+----------------+-----------------+---------------+ | ||
+ | | 1 | 2 | 2006-12-25 00:00:00 | 2 | 1 | Paul Unix | | ||
+ | | 2 | 3 | 2006-12-26 00:00:00 | 1 | 3 | Joseph Bash | | ||
+ | | 3 | 4 | 2006-12-27 00:00:00 | 4 | 2 | Jean Fenêtre | | ||
+ | +-------------+--------------+---------------------+----------------+-----------------+---------------+ | ||
+ | 3 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Visualisez la table ligue1.equipe et vérifiez que les buts et les points ont été mis à jour : | ||
+ | |||
+ | < | ||
+ | mysql> SELECT * FROM equipe ; | ||
+ | +-----------+-------------+------------------+----------+--------+------+ | ||
+ | | id_equipe | nom | stade | ville | points | buts | | ||
+ | +-----------+-------------+------------------+----------+--------+------+ | ||
+ | | 1 | FC Mandriva | Parc des Princes | Paris | 3 | 0 | | ||
+ | | 2 | Debian AC | Yankee Stadium | ||
+ | | 3 | Vista FC | Qwest Field | Redmond | ||
+ | +-----------+-------------+------------------+----------+--------+------+ | ||
+ | 3 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round todo> | ||
+ | Expliquez pourquoi les buts n'ont pas été mis à jour. Proposez une solution pour que les buts soient mis à jour. | ||
+ | </ | ||
+ | |||
+ | La nouvelle saison arrivée, il serait utile d' | ||
+ | |||
+ | < | ||
+ | DELIMITER // | ||
+ | CREATE PROCEDURE `ligue1`.`INIT_RENCONTRES`() | ||
+ | BEGIN | ||
+ | DECLARE fini INT default 0; | ||
+ | DECLARE domicile, visiteur INT; | ||
+ | DECLARE cur_domicile CURSOR FOR SELECT id_equipe FROM equipe; | ||
+ | DECLARE cur_visiteur CURSOR FOR SELECT id_equipe FROM equipe; | ||
+ | DECLARE CONTINUE HANDLER FOR NOT FOUND SET fini = 1; | ||
+ | OPEN cur_domicile; | ||
+ | WHILE fini <> 1 DO | ||
+ | FETCH cur_domicile INTO domicile; | ||
+ | IF fini=0 THEN | ||
+ | OPEN cur_visiteur; | ||
+ | WHILE fini <> 1 DO | ||
+ | FETCH cur_visiteur INTO visiteur; | ||
+ | IF domicile <> visiteur AND fini <> 1 THEN | ||
+ | INSERT INTO rencontre (id_domicile, | ||
+ | END IF; | ||
+ | END WHILE; | ||
+ | CLOSE cur_visiteur; | ||
+ | SET fini=0; | ||
+ | END IF; | ||
+ | END WHILE; | ||
+ | CLOSE cur_domicile; | ||
+ | END// | ||
+ | DELIMITER ; | ||
+ | </ | ||
+ | |||
+ | Vous obtiendrez un résultat similaire à celui-ci: | ||
+ | |||
+ | < | ||
+ | mysql> DELIMITER // | ||
+ | mysql> CREATE PROCEDURE `ligue1`.`INIT_RENCONTRES`() | ||
+ | -> BEGIN | ||
+ | -> DECLARE fini INT default 0; | ||
+ | -> DECLARE domicile, visiteur INT; | ||
+ | -> DECLARE cur_domicile CURSOR FOR SELECT id_equipe FROM equipe; | ||
+ | -> DECLARE cur_visiteur CURSOR FOR SELECT id_equipe FROM equipe; | ||
+ | -> DECLARE CONTINUE HANDLER FOR NOT FOUND SET fini = 1; | ||
+ | -> OPEN cur_domicile; | ||
+ | -> WHILE fini <> 1 DO | ||
+ | -> FETCH cur_domicile INTO domicile; | ||
+ | -> IF fini=0 THEN | ||
+ | -> OPEN cur_visiteur; | ||
+ | -> WHILE fini <> 1 DO | ||
+ | -> FETCH cur_visiteur INTO visiteur; | ||
+ | -> IF domicile <> visiteur AND fini <> 1 THEN | ||
+ | -> INSERT INTO rencontre (id_domicile, | ||
+ | -> END IF; | ||
+ | -> END WHILE; | ||
+ | -> CLOSE cur_visiteur; | ||
+ | -> SET fini=0; | ||
+ | -> END IF; | ||
+ | -> END WHILE; | ||
+ | -> CLOSE cur_domicile; | ||
+ | -> END// | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> DELIMITER ; | ||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Un **curseur** est un objet permettant de parcourir d'une manière séquentielle le jeu de résultats retourné par une requête SQL. Dans notre cas, nous avons besoin de créer deux curseurs **cur_domicile** et **cur_visiteur** portant sur la même requête **SELECT id_equipe FROM equipe**. Le parcours du deuxième curseur est placé à l' | ||
+ | |||
+ | Le curseur est ouvert via l' | ||
+ | |||
+ | Un **HANDLER** sert à déterminer ce qui se passe lorsque le **SQLSTATE NOT FOUND** est atteint, autrement dit quand le curseur est au bout du jeu de résultats. En général on sort de la boucle WHILE. | ||
+ | </ | ||
+ | |||
+ | Supprimez maintenant les enregistrements de la saison précédente se trouvant dans la table ligue1.rencontres : | ||
+ | |||
+ | < | ||
+ | mysql> DELETE FROM ligue1.rencontre WHERE id_domicile IS NOT NULL; | ||
+ | Query OK, 3 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Appelez la procédure: | ||
+ | |||
+ | < | ||
+ | mysql> CALL ligue1.INIT_RENCONTRES(); | ||
+ | Query OK, 0 rows affected, 1 warning (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Visualisez les entrées de la table **rencontre**: | ||
+ | |||
+ | < | ||
+ | mysql> SELECT * FROM ligue1.rencontre; | ||
+ | +-------------+--------------+---------------------+----------------+-----------------+---------+ | ||
+ | | id_domicile | id_visiteurs | date_match | ||
+ | +-------------+--------------+---------------------+----------------+-----------------+---------+ | ||
+ | | 2 | 3 | 0000-00-00 00:00:00 | NULL | NULL | NULL | | ||
+ | | 2 | 1 | 0000-00-00 00:00:00 | NULL | NULL | NULL | | ||
+ | | 1 | 3 | 0000-00-00 00:00:00 | NULL | NULL | NULL | | ||
+ | | 1 | 2 | 0000-00-00 00:00:00 | NULL | NULL | NULL | | ||
+ | | 3 | 1 | 0000-00-00 00:00:00 | NULL | NULL | NULL | | ||
+ | | 3 | 2 | 0000-00-00 00:00:00 | NULL | NULL | NULL | | ||
+ | +-------------+--------------+---------------------+----------------+-----------------+---------+ | ||
+ | 6 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Réinitialisez la table ligue1.equipe : | ||
+ | |||
+ | < | ||
+ | mysql> UPDATE ligue1.equipe SET points=0, buts=0; | ||
+ | Query OK, 2 rows affected (0.00 sec) | ||
+ | Rows matched: 3 Changed: 2 Warnings: 0 | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Visualisez les entrées de la table **equipe** : | ||
+ | |||
+ | < | ||
+ | mysql> SELECT * FROM ligue1.equipe; | ||
+ | +-----------+-------------+------------------+----------+--------+------+ | ||
+ | | id_equipe | nom | stade | ville | points | buts | | ||
+ | +-----------+-------------+------------------+----------+--------+------+ | ||
+ | | 1 | FC Mandriva | Parc des Princes | Paris | 0 | 0 | | ||
+ | | 2 | Debian AC | Yankee Stadium | ||
+ | | 3 | Vista FC | Qwest Field | Redmond | ||
+ | +-----------+-------------+------------------+----------+--------+------+ | ||
+ | 3 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Le code d'une procédure est stocké dans la table interne **INFORMATION_SCHEMA.ROUTINES**. | ||
+ | </ | ||
+ | |||
+ | Pour visualiser les procédures créées, il convient d' | ||
+ | |||
+ | < | ||
+ | mysql> SELECT * FROM information_schema.routines WHERE ROUTINE_TYPE=' | ||
+ | *************************** 1. row *************************** | ||
+ | | ||
+ | | ||
+ | ROUTINE_SCHEMA: | ||
+ | ROUTINE_NAME: | ||
+ | ROUTINE_TYPE: | ||
+ | | ||
+ | CHARACTER_MAXIMUM_LENGTH: | ||
+ | CHARACTER_OCTET_LENGTH: | ||
+ | | ||
+ | | ||
+ | CHARACTER_SET_NAME: | ||
+ | COLLATION_NAME: | ||
+ | DTD_IDENTIFIER: | ||
+ | ROUTINE_BODY: | ||
+ | ROUTINE_DEFINITION: | ||
+ | INSERT INTO equipe (nom, stade, ville) VALUES (nom_eq, stade_eq, ville_eq); | ||
+ | END | ||
+ | | ||
+ | | ||
+ | | ||
+ | IS_DETERMINISTIC: | ||
+ | | ||
+ | SQL_PATH: NULL | ||
+ | | ||
+ | | ||
+ | LAST_ALTERED: | ||
+ | SQL_MODE: | ||
+ | | ||
+ | | ||
+ | CHARACTER_SET_CLIENT: | ||
+ | COLLATION_CONNECTION: | ||
+ | DATABASE_COLLATION: | ||
+ | *************************** 2. row *************************** | ||
+ | | ||
+ | | ||
+ | ROUTINE_SCHEMA: | ||
+ | ROUTINE_NAME: | ||
+ | ROUTINE_TYPE: | ||
+ | | ||
+ | CHARACTER_MAXIMUM_LENGTH: | ||
+ | CHARACTER_OCTET_LENGTH: | ||
+ | | ||
+ | | ||
+ | CHARACTER_SET_NAME: | ||
+ | COLLATION_NAME: | ||
+ | DTD_IDENTIFIER: | ||
+ | ROUTINE_BODY: | ||
+ | ROUTINE_DEFINITION: | ||
+ | DECLARE fini INT default 0; | ||
+ | DECLARE domicile, visiteur INT; | ||
+ | DECLARE cur_domicile CURSOR FOR SELECT id_equipe FROM equipe; | ||
+ | DECLARE cur_visiteur CURSOR FOR SELECT id_equipe FROM equipe; | ||
+ | DECLARE CONTINUE HANDLER FOR NOT FOUND SET fini = 1; | ||
+ | OPEN cur_domicile; | ||
+ | WHILE fini <> 1 DO | ||
+ | FETCH cur_domicile INTO domicile; | ||
+ | IF fini=0 THEN | ||
+ | OPEN cur_visiteur; | ||
+ | WHILE fini <> 1 DO | ||
+ | FETCH cur_visiteur INTO visiteur; | ||
+ | IF domicile <> visiteur AND fini <> 1 THEN | ||
+ | INSERT INTO rencontre (id_domicile, | ||
+ | END IF; | ||
+ | END WHILE; | ||
+ | CLOSE cur_visiteur; | ||
+ | SET fini=0; | ||
+ | END IF; | ||
+ | END WHILE; | ||
+ | CLOSE cur_domicile; | ||
+ | END | ||
+ | | ||
+ | | ||
+ | | ||
+ | IS_DETERMINISTIC: | ||
+ | | ||
+ | SQL_PATH: NULL | ||
+ | | ||
+ | | ||
+ | LAST_ALTERED: | ||
+ | SQL_MODE: | ||
+ | | ||
+ | | ||
+ | CHARACTER_SET_CLIENT: | ||
+ | COLLATION_CONNECTION: | ||
+ | DATABASE_COLLATION: | ||
+ | *************************** 3. row *************************** | ||
+ | | ||
+ | | ||
+ | ROUTINE_SCHEMA: | ||
+ | ROUTINE_NAME: | ||
+ | ROUTINE_TYPE: | ||
+ | | ||
+ | CHARACTER_MAXIMUM_LENGTH: | ||
+ | CHARACTER_OCTET_LENGTH: | ||
+ | | ||
+ | | ||
+ | CHARACTER_SET_NAME: | ||
+ | COLLATION_NAME: | ||
+ | DTD_IDENTIFIER: | ||
+ | ROUTINE_BODY: | ||
+ | ROUTINE_DEFINITION: | ||
+ | INSERT INTO rencontre (id_domicile, | ||
+ | VALUES (id_dom, id_vis, date_m, arbitre_m); | ||
+ | END | ||
+ | | ||
+ | | ||
+ | | ||
+ | IS_DETERMINISTIC: | ||
+ | | ||
+ | SQL_PATH: NULL | ||
+ | | ||
+ | | ||
+ | LAST_ALTERED: | ||
+ | SQL_MODE: | ||
+ | | ||
+ | | ||
+ | CHARACTER_SET_CLIENT: | ||
+ | COLLATION_CONNECTION: | ||
+ | DATABASE_COLLATION: | ||
+ | *************************** 4. row *************************** | ||
+ | | ||
+ | | ||
+ | ROUTINE_SCHEMA: | ||
+ | ROUTINE_NAME: | ||
+ | ROUTINE_TYPE: | ||
+ | | ||
+ | CHARACTER_MAXIMUM_LENGTH: | ||
+ | CHARACTER_OCTET_LENGTH: | ||
+ | | ||
+ | | ||
+ | CHARACTER_SET_NAME: | ||
+ | COLLATION_NAME: | ||
+ | DTD_IDENTIFIER: | ||
+ | ROUTINE_BODY: | ||
+ | ROUTINE_DEFINITION: | ||
+ | UPDATE ligue1.rencontre | ||
+ | SET score_domicile = score_dom, score_visiteurs = score_vis | ||
+ | WHERE id_domicile=id_dom AND id_visiteurs=id_vis; | ||
+ | IF score_dom = score_vis THEN | ||
+ | UPDATE equipe SET points = points+1 | ||
+ | WHERE id_equipe=id_dom OR id_equipe=id_vis; | ||
+ | ELSEIF score_dom > score_vis THEN | ||
+ | UPDATE equipe SET points = points+3 WHERE id_equipe = id_dom; | ||
+ | ELSE UPDATE equipe SET points = points+3 WHERE id_equipe = id_vis; | ||
+ | END IF; | ||
+ | END | ||
+ | | ||
+ | | ||
+ | | ||
+ | IS_DETERMINISTIC: | ||
+ | | ||
+ | SQL_PATH: NULL | ||
+ | | ||
+ | | ||
+ | LAST_ALTERED: | ||
+ | SQL_MODE: | ||
+ | | ||
+ | | ||
+ | CHARACTER_SET_CLIENT: | ||
+ | COLLATION_CONNECTION: | ||
+ | DATABASE_COLLATION: | ||
+ | 4 rows in set (0.01 sec) | ||
+ | </ | ||
+ | |||
+ | ===Fonctions Stockées=== | ||
+ | |||
+ | Vous allez maintenant créer une **Fonction Stockée** que vous utiliserez ultérieurement. La différence entre une procédure stockée et une fonction stockée est que cette dernière n'a pas besoin d' | ||
+ | |||
+ | Créez donc la fonction intégrée : | ||
+ | |||
+ | < | ||
+ | DELIMITER // | ||
+ | CREATE FUNCTION EST_RELEGABLE(idequipe INTEGER) RETURNS TINYINT | ||
+ | BEGIN | ||
+ | DECLARE relegable TINYINT default 0; | ||
+ | DECLARE id_courante INTEGER; | ||
+ | DECLARE fini TINYINT DEFAULT 0; | ||
+ | DECLARE cur1 CURSOR FOR SELECT id_equipe FROM equipe ORDER BY points ASC LIMIT 3; | ||
+ | DECLARE CONTINUE HANDLER FOR SQLSTATE ' | ||
+ | OPEN cur1; | ||
+ | BOUCLE: REPEAT | ||
+ | FETCH cur1 INTO id_courante; | ||
+ | IF idequipe=id_courante THEN | ||
+ | SET relegable=1; | ||
+ | LEAVE BOUCLE; | ||
+ | END IF; | ||
+ | UNTIL fini END REPEAT BOUCLE; | ||
+ | CLOSE cur1; | ||
+ | RETURN relegable; | ||
+ | END// | ||
+ | DELIMITER ; | ||
+ | </ | ||
+ | |||
+ | Vous obtiendrez un résultat similaire à celui-ci: | ||
+ | |||
+ | < | ||
+ | mysql> DELIMITER // | ||
+ | mysql> CREATE FUNCTION EST_RELEGABLE(idequipe INTEGER) RETURNS TINYINT | ||
+ | -> BEGIN | ||
+ | -> DECLARE relegable TINYINT default 0; | ||
+ | -> DECLARE id_courante INTEGER; | ||
+ | -> DECLARE fini TINYINT DEFAULT 0; | ||
+ | -> DECLARE cur1 CURSOR FOR SELECT id_equipe FROM equipe ORDER BY points ASC LIMIT 3; | ||
+ | -> DECLARE CONTINUE HANDLER FOR SQLSTATE ' | ||
+ | -> OPEN cur1; | ||
+ | -> BOUCLE: REPEAT | ||
+ | -> FETCH cur1 INTO id_courante; | ||
+ | -> IF idequipe=id_courante THEN | ||
+ | -> SET relegable=1; | ||
+ | -> LEAVE BOUCLE; | ||
+ | -> END IF; | ||
+ | -> UNTIL fini END REPEAT BOUCLE; | ||
+ | -> CLOSE cur1; | ||
+ | -> RETURN relegable; | ||
+ | -> END// | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> DELIMITER ; | ||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | A la fin de la saison, il conviendrait de saisir la commande suivante pour identifier les équipes relégables : | ||
+ | |||
+ | mysql> SELECT * FROM equipe WHERE EST_RELEGABLE(id_equipe)=1; | ||
+ | |||
+ | Ensuite il conviendrait de les supprimer : | ||
+ | |||
+ | mysql> DELETE FROM equipe WHERE EST_RELEGABLE(id_equipe)=1; | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Le code d'une fonction est stocké dans la table interne **INFORMATION_SCHEMA.ROUTINES**. | ||
+ | </ | ||
+ | |||
+ | Pour visualiser les fonctions stockées, utilisez la commande suivante : | ||
+ | |||
+ | < | ||
+ | mysql> SELECT * FROM information_schema.routines WHERE ROUTINE_TYPE=' | ||
+ | *************************** 1. row *************************** | ||
+ | | ||
+ | | ||
+ | ROUTINE_SCHEMA: | ||
+ | ROUTINE_NAME: | ||
+ | ROUTINE_TYPE: | ||
+ | | ||
+ | CHARACTER_MAXIMUM_LENGTH: | ||
+ | CHARACTER_OCTET_LENGTH: | ||
+ | | ||
+ | | ||
+ | CHARACTER_SET_NAME: | ||
+ | COLLATION_NAME: | ||
+ | DTD_IDENTIFIER: | ||
+ | ROUTINE_BODY: | ||
+ | ROUTINE_DEFINITION: | ||
+ | DECLARE relegable TINYINT default 0; | ||
+ | DECLARE id_courante INTEGER; | ||
+ | DECLARE fini TINYINT DEFAULT 0; | ||
+ | DECLARE cur1 CURSOR FOR SELECT id_equipe FROM equipe ORDER BY points ASC LIMIT 3; | ||
+ | DECLARE CONTINUE HANDLER FOR SQLSTATE ' | ||
+ | OPEN cur1; | ||
+ | BOUCLE: REPEAT | ||
+ | FETCH cur1 INTO id_courante; | ||
+ | IF idequipe=id_courante THEN | ||
+ | SET relegable=1; | ||
+ | LEAVE BOUCLE; | ||
+ | END IF; | ||
+ | UNTIL fini END REPEAT BOUCLE; | ||
+ | CLOSE cur1; | ||
+ | RETURN relegable; | ||
+ | END | ||
+ | | ||
+ | | ||
+ | | ||
+ | IS_DETERMINISTIC: | ||
+ | | ||
+ | SQL_PATH: NULL | ||
+ | | ||
+ | | ||
+ | LAST_ALTERED: | ||
+ | SQL_MODE: | ||
+ | | ||
+ | | ||
+ | CHARACTER_SET_CLIENT: | ||
+ | COLLATION_CONNECTION: | ||
+ | DATABASE_COLLATION: | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Vous ne pouvez pas utiliser les commandes suivantes dans des routines stockées : LOCK TABLES, UNLOCK TABLES, ALTER VIEW, LOAD DATA/TABLE, PREPARE, EXECUTE, DEALLOCATE PREPARE. | ||
+ | </ | ||
+ | |||
+ | ==== Déclencheurs ==== | ||
+ | |||
+ | Le support des déclencheurs (// | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Un déclencheur peut être appelé avec une **POSITION**. La valeur de la POSITION est **BEFORE** ou **AFTER** l' | ||
+ | </ | ||
+ | |||
+ | Créez un trigger pour convertir la ville en majuscules lors de son insertion: | ||
+ | |||
+ | < | ||
+ | DELIMITER // | ||
+ | CREATE TRIGGER TGR_BI_EQUIPE BEFORE INSERT ON equipe FOR EACH ROW | ||
+ | BEGIN | ||
+ | SET new.ville = UPPER(new.ville); | ||
+ | END// | ||
+ | DELIMITER ; | ||
+ | </ | ||
+ | |||
+ | Insérez une nouvel enregistrement: | ||
+ | |||
+ | < | ||
+ | mysql> INSERT INTO equipe (nom, stade, ville) VALUES (' | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> SELECT nom, stade, ville FROM equipe; | ||
+ | +------------------------+------------------+------------+ | ||
+ | | nom | stade | ville | | ||
+ | +------------------------+------------------+------------+ | ||
+ | | FC Mandriva | ||
+ | | Debian AC | Yankee Stadium | ||
+ | | Vista FC | Qwest Field | Redmond | ||
+ | | Racing Club Strasbourg | La Meinau | ||
+ | +------------------------+------------------+------------+ | ||
+ | 4 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Créez un trigger pour faire le total des buts: | ||
+ | |||
+ | < | ||
+ | DELIMITER // | ||
+ | CREATE TRIGGER TGR_BU_RENCONTRE BEFORE UPDATE ON rencontre FOR EACH ROW | ||
+ | BEGIN | ||
+ | IF old.score_domicile IS NULL and new.score_domicile IS NOT NULL THEN | ||
+ | UPDATE equipe SET buts = buts + new.score_domicile WHERE id_equipe=new.id_domicile; | ||
+ | END IF; | ||
+ | IF old.score_visiteurs IS NULL and new.score_visiteurs IS NOT NULL THEN | ||
+ | UPDATE equipe SET buts = buts + new.score_visiteurs WHERE id_equipe=new.id_visiteurs; | ||
+ | END IF; | ||
+ | END// | ||
+ | DELIMITER ; | ||
+ | </ | ||
+ | |||
+ | Appelez la procédure pour inscrire un résultat: | ||
+ | |||
+ | < | ||
+ | mysql> CALL SAISIR_RESULTAT(1, | ||
+ | Query OK, 1 row affected (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Appelez la procédure une deuxième fois pour inscrire un autre résultat: | ||
+ | |||
+ | < | ||
+ | mysql> CALL SAISIR_RESULTAT(2, | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Examinez les résultats obtenus : | ||
+ | |||
+ | < | ||
+ | mysql> SELECT nom, stade, points, buts FROM equipe; | ||
+ | +------------------------+------------------+--------+------+ | ||
+ | | nom | stade | points | buts | | ||
+ | +------------------------+------------------+--------+------+ | ||
+ | | FC Mandriva | ||
+ | | Debian AC | Yankee Stadium | ||
+ | | Vista FC | Qwest Field | 0 | 0 | | ||
+ | | Racing Club Strasbourg | La Meinau | ||
+ | +------------------------+------------------+--------+------+ | ||
+ | 4 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Les limites des triggers: | ||
+ | |||
+ | * Limitation à un seul trigger par table, par ACTION et par POSITION. | ||
+ | * Uniquement triggers FOR EACH ROW (déclencheurs niveau ligne). | ||
+ | * Pas de déclencheurs sur des événements système autres que des requêtes SQL, | ||
+ | * Les déclencheurs ne peuvent pas être mis sur les tables de la base mysql, | ||
+ | * Les déclencheurs ne sont pas déclenchés par les ACTIONS de clés étrangères. | ||
+ | </ | ||
+ | |||
+ | ====Vues ==== | ||
+ | |||
+ | Les vues, y compris les vues modifiables, | ||
+ | |||
+ | * Création ou modification de vues avec les commandes CREATE VIEW ou ALTER VIEW | ||
+ | * Destruction de vues avec DROP VIEW | ||
+ | * Affichage des méta-données de vues avec SHOW CREATE VIEW | ||
+ | |||
+ | Ajoutez d' | ||
+ | |||
+ | < | ||
+ | ALTER TABLE equipe | ||
+ | ADD entraineur varchar(100) default ' | ||
+ | ADD tel_entraineur varchar(20) default ' | ||
+ | </ | ||
+ | |||
+ | Mettez à jour la table: | ||
+ | |||
+ | < | ||
+ | mysql> UPDATE equipe SET entraineur=' | ||
+ | Query OK, 1 row affected (0.01 sec) | ||
+ | Rows matched: 1 Changed: 1 Warnings: 0 | ||
+ | |||
+ | mysql> UPDATE equipe SET entraineur=' | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | Rows matched: 1 Changed: 1 Warnings: 0 | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Créez une vue qui **ne montre pas** le numéro de téléphone: | ||
+ | |||
+ | < | ||
+ | mysql> CREATE VIEW V_EQUIPE AS SELECT id_equipe, nom, stade, ville, points, buts, entraineur FROM equipe; | ||
+ | Query OK, 0 rows affected (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Le code d'un view est stocké dans la table interne **INFORMATION_SCHEMA.VIEWS**. | ||
+ | </ | ||
+ | |||
+ | Donnez les droits sur cette vue à user1: | ||
+ | |||
+ | < | ||
+ | mysql> GRANT SELECT, INSERT, DELETE, UPDATE ON V_EQUIPE TO user1@localhost IDENTIFIED BY ' | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Déconnectez-vous et reconnectez-vous en tant qu' | ||
+ | |||
+ | < | ||
+ | mysql> exit | ||
+ | Bye | ||
+ | [root@centos6 ~]# mysql -u user1 -p | ||
+ | Enter password: | ||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 6 | ||
+ | Server version: 5.1.61 Source distribution | ||
+ | |||
+ | Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Changez de base de données: | ||
+ | |||
+ | < | ||
+ | mysql> use ligue1; | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Ensuite, visualisez la vue V_EQUIPE: | ||
+ | |||
+ | < | ||
+ | mysql> SELECT * FROM V_EQUIPE; | ||
+ | +-----------+------------------------+------------------+------------+--------+------+------------------+ | ||
+ | | id_equipe | nom | stade | ville | points | buts | entraineur | ||
+ | +-----------+------------------------+------------------+------------+--------+------+------------------+ | ||
+ | | 1 | FC Mandriva | ||
+ | | 2 | Debian AC | Yankee Stadium | ||
+ | | 3 | Vista FC | Qwest Field | Redmond | ||
+ | | 4 | Racing Club Strasbourg | La Meinau | ||
+ | +-----------+------------------------+------------------+------------+--------+------+------------------+ | ||
+ | 4 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round todo> | ||
+ | Déconnectez-vous et reconnectez-vous en tant que root. | ||
+ | </ | ||
+ | |||
+ | ====Planificateur d' | ||
+ | |||
+ | < | ||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +-----------------+-------+ | ||
+ | | Variable_name | ||
+ | +-----------------+-------+ | ||
+ | | event_scheduler | OFF | | ||
+ | +-----------------+-------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> SET GLOBAL event_scheduler = 1; | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +-----------------+-------+ | ||
+ | | Variable_name | ||
+ | +-----------------+-------+ | ||
+ | | event_scheduler | ON | | ||
+ | +-----------------+-------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> SHOW PROCESSLIST; | ||
+ | +----+-----------------+-----------+------+---------+------+------------------------+------------------+ | ||
+ | | Id | User | Host | db | Command | Time | State | Info | | ||
+ | +----+-----------------+-----------+------+---------+------+------------------------+------------------+ | ||
+ | | 12 | root | localhost | NULL | Query | ||
+ | | 13 | event_scheduler | localhost | NULL | Daemon | ||
+ | +----+-----------------+-----------+------+---------+------+------------------------+------------------+ | ||
+ | 2 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | =====Administration et Maintenance===== | ||
+ | |||
+ | ====Administration==== | ||
+ | |||
+ | === Mysqladmin=== | ||
+ | |||
+ | Mysqladmin est utile pour diverses tâches d' | ||
+ | |||
+ | # mysqladmin [option] admincommand | ||
+ | |||
+ | où | ||
+ | |||
+ | * **admincommand** définit la tâche effectuée par mysqladmin. | ||
+ | |||
+ | Nous présentons ici que les trois commandes principales. | ||
+ | |||
+ | **create** crée une nouvelle base de données : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysqladmin -u root -p create newdb | ||
+ | Enter password: fenestros | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | C:\Program Files\MySQL\MySQL Server 5.6\bin> | ||
+ | Enter password: ********* | ||
+ | |||
+ | C:\Program Files\MySQL\MySQL Server 5.6\bin> | ||
+ | </ | ||
+ | |||
+ | **drop** supprime une base de données: | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysqladmin -u root -p drop newdb | ||
+ | Enter password: fenestros | ||
+ | Dropping the database is potentially a very bad thing to do. | ||
+ | Any data stored in the database will be destroyed. | ||
+ | |||
+ | Do you really want to drop the ' | ||
+ | Database " | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | C:\Program Files\MySQL\MySQL Server 5.6\bin> | ||
+ | Enter password: ********* | ||
+ | Dropping the database is potentially a very bad thing to do. | ||
+ | Any data stored in the database will be destroyed. | ||
+ | |||
+ | Do you really want to drop the ' | ||
+ | Database " | ||
+ | |||
+ | C:\Program Files\MySQL\MySQL Server 5.6\bin> | ||
+ | </ | ||
+ | |||
+ | **password** modifier le mot de passe de l' | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysqladmin -u root -p password " | ||
+ | Enter password: fenestros | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | C:\Program Files\MySQL\MySQL Server 5.6\bin> | ||
+ | Enter password: ********* | ||
+ | Warning: Using a password on the command line interface can be insecure. | ||
+ | |||
+ | C:\Program Files\MySQL\MySQL Server 5.6\bin> | ||
+ | </ | ||
+ | |||
+ | Connectez-vous à MySQL en tant que root en utilisant le nouveau mot de passe : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysql -u root -p mysql | ||
+ | Enter password: | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 11 | ||
+ | Server version: 5.1.61 Source distribution | ||
+ | |||
+ | Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | C:\Program Files\MySQL\MySQL Server 5.6\bin> | ||
+ | Enter password: ********** | ||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 16 | ||
+ | Server version: 5.6.28-log MySQL Community Server (GPL) | ||
+ | |||
+ | Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que les mots de passe ne sont pas visibles. Ils le sont dans les exemples précédents uniquement pour rendre le cours plus clair. | ||
+ | </ | ||
+ | |||
+ | === Méta-données === | ||
+ | |||
+ | Avec %%MySQL%% on parle souvent de **Méta-données**. Ces données donnent non seulement des renseignements sur le contenu d'une table, mais aussi des précisions sur ses propriétés. Par exemple: | ||
+ | |||
+ | * Les bases de données gérées par %%MySQL%% | ||
+ | * Les tables contenus dans ces bases de données | ||
+ | * Les propriétés dont disposent les tables | ||
+ | |||
+ | Plusieurs commandes peuvent être utilisées pour visualiser les **Méta-données**: | ||
+ | |||
+ | ==La commande DESCRIBE== | ||
+ | |||
+ | Sélectionnez la base de données **ligue1**: | ||
+ | |||
+ | < | ||
+ | mysql> USE ligue1; | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Décrivez la table **equipe** de la base **ligue1**: | ||
+ | |||
+ | < | ||
+ | mysql> DESCRIBE equipe; | ||
+ | +----------------+--------------+------+-----+---------+----------------+ | ||
+ | | Field | Type | Null | Key | Default | Extra | | ||
+ | +----------------+--------------+------+-----+---------+----------------+ | ||
+ | | id_equipe | ||
+ | | nom | varchar(50) | ||
+ | | stade | varchar(50) | ||
+ | | ville | varchar(30) | ||
+ | | points | ||
+ | | buts | int(11) | ||
+ | | entraineur | ||
+ | | tel_entraineur | varchar(20) | ||
+ | +----------------+--------------+------+-----+---------+----------------+ | ||
+ | 8 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ==La commande EXPLAIN== | ||
+ | |||
+ | La commande EXPLAIN produit le même résultat que la commande DESCRIBE : | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN equipe; | ||
+ | +----------------+--------------+------+-----+---------+----------------+ | ||
+ | | Field | Type | Null | Key | Default | Extra | | ||
+ | +----------------+--------------+------+-----+---------+----------------+ | ||
+ | | id_equipe | ||
+ | | nom | varchar(50) | ||
+ | | stade | varchar(50) | ||
+ | | ville | varchar(30) | ||
+ | | points | ||
+ | | buts | int(11) | ||
+ | | entraineur | ||
+ | | tel_entraineur | varchar(20) | ||
+ | +----------------+--------------+------+-----+---------+----------------+ | ||
+ | 8 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Par contre la commande EXPLAIN peut aussi être utilisée pour contrôler le processus suivi par %%MySQL%% lors d'une commande donnée. Pour comprendre ceci, saisissez les deux commandes suivantes: | ||
+ | |||
+ | < | ||
+ | mysql> SELECT nom, stade, ville FROM equipe; | ||
+ | +------------------------+------------------+------------+ | ||
+ | | nom | stade | ville | | ||
+ | +------------------------+------------------+------------+ | ||
+ | | FC Mandriva | ||
+ | | Debian AC | Yankee Stadium | ||
+ | | Vista FC | Qwest Field | Redmond | ||
+ | | Racing Club Strasbourg | La Meinau | ||
+ | +------------------------+------------------+------------+ | ||
+ | 4 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> EXPLAIN SELECT nom, stade, ville FROM equipe; | ||
+ | +----+-------------+--------+------+---------------+------+---------+------+------+-------+ | ||
+ | | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | | ||
+ | +----+-------------+--------+------+---------------+------+---------+------+------+-------+ | ||
+ | | 1 | SIMPLE | ||
+ | +----+-------------+--------+------+---------------+------+---------+------+------+-------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ==La commande BENCHMARK== | ||
+ | |||
+ | Cette commande retourne toujours la valeur 0. Par contre son utilité est de contrôler le temps d' | ||
+ | |||
+ | mysql> BENCHMARK(nbfois, | ||
+ | |||
+ | Par exemple, la commande suivante, exécutée trois fois de suite: | ||
+ | |||
+ | < | ||
+ | mysql> select BENCHMARK(1000000000, | ||
+ | +-----------------------------------------------+ | ||
+ | | BENCHMARK(1000000000, | ||
+ | +-----------------------------------------------+ | ||
+ | | 0 | | ||
+ | +-----------------------------------------------+ | ||
+ | 1 row in set (8.18 sec) | ||
+ | |||
+ | mysql> select BENCHMARK(1000000000, | ||
+ | +-----------------------------------------------+ | ||
+ | | BENCHMARK(1000000000, | ||
+ | +-----------------------------------------------+ | ||
+ | | 0 | | ||
+ | +-----------------------------------------------+ | ||
+ | 1 row in set (8.14 sec) | ||
+ | |||
+ | mysql> select BENCHMARK(1000000000, | ||
+ | +-----------------------------------------------+ | ||
+ | | BENCHMARK(1000000000, | ||
+ | +-----------------------------------------------+ | ||
+ | | 0 | | ||
+ | +-----------------------------------------------+ | ||
+ | 1 row in set (8.14 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ==La Commande SHOW== | ||
+ | |||
+ | La commande SHOW permet d' | ||
+ | |||
+ | **SHOW DATABASES** | ||
+ | |||
+ | Cette commande prend la forme suivante : | ||
+ | |||
+ | SHOW DATABASES [LIKE ' | ||
+ | |||
+ | Par exemple: | ||
+ | |||
+ | < | ||
+ | mysql> SHOW databases; | ||
+ | +--------------------+ | ||
+ | | Database | ||
+ | +--------------------+ | ||
+ | | information_schema | | ||
+ | | CarnetAdresses | ||
+ | | ligue1 | ||
+ | | mysql | | ||
+ | | test | ||
+ | +--------------------+ | ||
+ | 5 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | **SHOW TABLES** | ||
+ | |||
+ | Cette commande prend la forme suivante : | ||
+ | |||
+ | SHOW TABLES [FROM nomdb] [LIKE ' | ||
+ | |||
+ | Par exemple: | ||
+ | |||
+ | < | ||
+ | mysql> SHOW tables ; | ||
+ | +------------------------+ | ||
+ | | Tables_in_ligue1 | ||
+ | +------------------------+ | ||
+ | | V_EQUIPE | ||
+ | | equipe | ||
+ | | rencontre | ||
+ | +------------------------+ | ||
+ | 3 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | **SHOW OPEN TABLES** | ||
+ | |||
+ | Cette commande prend la forme suivante : | ||
+ | |||
+ | SHOW OPEN TABLES [FROM nomdb] [LIKE ' | ||
+ | |||
+ | Par exemple: | ||
+ | |||
+ | < | ||
+ | mysql> SHOW OPEN TABLES; | ||
+ | +----------------+---------------------------+--------+-------------+ | ||
+ | | Database | ||
+ | +----------------+---------------------------+--------+-------------+ | ||
+ | | ligue1 | ||
+ | | mysql | event | ||
+ | | mysql | time_zone | ||
+ | | mysql | procs_priv | ||
+ | | mysql | time_zone_transition | ||
+ | | mysql | db | 0 | 0 | | ||
+ | | mysql | user | 0 | 0 | | ||
+ | | mysql | tables_priv | ||
+ | | CarnetAdresses | familles | ||
+ | | mysql | help_keyword | ||
+ | | mysql | help_category | ||
+ | | mysql | help_relation | ||
+ | | mysql | func | 0 | 0 | | ||
+ | | mysql | slow_log | ||
+ | | mysql | columns_priv | ||
+ | | ligue1 | ||
+ | | mysql | host | 0 | 0 | | ||
+ | | mysql | proc | 0 | 0 | | ||
+ | | mysql | servers | ||
+ | | mysql | help_topic | ||
+ | | mysql | time_zone_leap_second | ||
+ | | mysql | ndb_binlog_index | ||
+ | | mysql | time_zone_transition_type | 0 | 0 | | ||
+ | | mysql | time_zone_name | ||
+ | | mysql | plugin | ||
+ | | CarnetAdresses | Enfants | ||
+ | | mysql | general_log | ||
+ | +----------------+---------------------------+--------+-------------+ | ||
+ | 27 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | La valeur de la colonne **In_use** étant 0, ceci indique que la table est ouverte mais qu'il n'y a pas d' | ||
+ | </ | ||
+ | |||
+ | **SHOW COLUMNS** | ||
+ | |||
+ | Cette commande prend la forme suivante : | ||
+ | |||
+ | SHOW [FULL] COLUMNS FROM nomtable [LIKE ' | ||
+ | |||
+ | Par exemple: | ||
+ | |||
+ | < | ||
+ | mysql> SHOW COLUMNS FROM equipe; | ||
+ | +----------------+--------------+------+-----+---------+----------------+ | ||
+ | | Field | Type | Null | Key | Default | Extra | | ||
+ | +----------------+--------------+------+-----+---------+----------------+ | ||
+ | | id_equipe | ||
+ | | nom | varchar(50) | ||
+ | | stade | varchar(50) | ||
+ | | ville | varchar(30) | ||
+ | | points | ||
+ | | buts | int(11) | ||
+ | | entraineur | ||
+ | | tel_entraineur | varchar(20) | ||
+ | +----------------+--------------+------+-----+---------+----------------+ | ||
+ | 8 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ou | ||
+ | |||
+ | < | ||
+ | mysql> SHOW FULL COLUMNS FROM equipe; | ||
+ | +----------------+--------------+-------------------+------+-----+---------+----------------+---------------------------------+---------+ | ||
+ | | Field | Type | Collation | ||
+ | +----------------+--------------+-------------------+------+-----+---------+----------------+---------------------------------+---------+ | ||
+ | | id_equipe | ||
+ | | nom | varchar(50) | ||
+ | | stade | varchar(50) | ||
+ | | ville | varchar(30) | ||
+ | | points | ||
+ | | buts | int(11) | ||
+ | | entraineur | ||
+ | | tel_entraineur | varchar(20) | ||
+ | +----------------+--------------+-------------------+------+-----+---------+----------------+---------------------------------+---------+ | ||
+ | 8 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour plus d' | ||
+ | </ | ||
+ | |||
+ | **SHOW INDEX** | ||
+ | |||
+ | Cette commande prend la forme suivante : | ||
+ | |||
+ | SHOW INDEX FROM nomtable [FROM nomdb]; | ||
+ | |||
+ | Par exemple; | ||
+ | |||
+ | < | ||
+ | mysql> SHOW INDEX FROM equipe; | ||
+ | +--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | ||
+ | | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | | ||
+ | +--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | ||
+ | | equipe | 0 | PRIMARY | ||
+ | +--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour plus d' | ||
+ | </ | ||
+ | |||
+ | **SHOW TABLE STATUS** | ||
+ | |||
+ | Cette commande prend la forme suivante : | ||
+ | |||
+ | SHOW TABLE STATUS [FROM nomdb] [LIKE ' | ||
+ | |||
+ | Par exemple; | ||
+ | |||
+ | < | ||
+ | mysql> SHOW TABLE STATUS; | ||
+ | +-----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+ | ||
+ | | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | ||
+ | +-----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+ | ||
+ | | V_EQUIPE | ||
+ | | equipe | ||
+ | | rencontre | MyISAM | 10 | Dynamic | ||
+ | +-----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+ | ||
+ | 3 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour plus d' | ||
+ | </ | ||
+ | |||
+ | **SHOW STATUS** | ||
+ | |||
+ | Cette commande prend la forme suivante : | ||
+ | |||
+ | SHOW STATUS [LIKE ' | ||
+ | |||
+ | Par exemple: | ||
+ | |||
+ | < | ||
+ | mysql> SHOW STATUS; | ||
+ | +-----------------------------------+-----------+ | ||
+ | | Variable_name | ||
+ | +-----------------------------------+-----------+ | ||
+ | | Aborted_clients | ||
+ | | Aborted_connects | ||
+ | | Binlog_cache_disk_use | ||
+ | | Binlog_cache_use | ||
+ | | Bytes_received | ||
+ | | Bytes_sent | ||
+ | | Com_admin_commands | ||
+ | | Com_assign_to_keycache | ||
+ | | Com_alter_db | ||
+ | | Com_alter_db_upgrade | ||
+ | | Com_alter_event | ||
+ | | Com_alter_function | ||
+ | | Com_alter_procedure | ||
+ | | Com_alter_server | ||
+ | | Com_alter_table | ||
+ | | Com_alter_tablespace | ||
+ | | Com_analyze | ||
+ | | Com_backup_table | ||
+ | | Com_begin | ||
+ | | Com_binlog | ||
+ | | Com_call_procedure | ||
+ | | Com_change_db | ||
+ | | Com_change_master | ||
+ | | Com_check | ||
+ | | Com_checksum | ||
+ | | Com_commit | ||
+ | | Com_create_db | ||
+ | | Com_create_event | ||
+ | | Com_create_function | ||
+ | | Com_create_index | ||
+ | | Com_create_procedure | ||
+ | | Com_create_server | ||
+ | | Com_create_table | ||
+ | | Com_create_trigger | ||
+ | | Com_create_udf | ||
+ | | Com_create_user | ||
+ | | Com_create_view | ||
+ | | Com_dealloc_sql | ||
+ | | Com_delete | ||
+ | | Com_delete_multi | ||
+ | | Com_do | ||
+ | | Com_drop_db | ||
+ | | Com_drop_event | ||
+ | | Com_drop_function | ||
+ | | Com_drop_index | ||
+ | | Com_drop_procedure | ||
+ | | Com_drop_server | ||
+ | | Com_drop_table | ||
+ | | Com_drop_trigger | ||
+ | | Com_drop_user | ||
+ | | Com_drop_view | ||
+ | | Com_empty_query | ||
+ | | Com_execute_sql | ||
+ | | Com_flush | ||
+ | | Com_grant | ||
+ | | Com_ha_close | ||
+ | | Com_ha_open | ||
+ | | Com_ha_read | ||
+ | | Com_help | ||
+ | | Com_insert | ||
+ | | Com_insert_select | ||
+ | | Com_install_plugin | ||
+ | | Com_kill | ||
+ | | Com_load | ||
+ | | Com_load_master_data | ||
+ | | Com_load_master_table | ||
+ | | Com_lock_tables | ||
+ | | Com_optimize | ||
+ | | Com_preload_keys | ||
+ | | Com_prepare_sql | ||
+ | | Com_purge | ||
+ | | Com_purge_before_date | ||
+ | | Com_release_savepoint | ||
+ | | Com_rename_table | ||
+ | | Com_rename_user | ||
+ | | Com_repair | ||
+ | | Com_replace | ||
+ | | Com_replace_select | ||
+ | | Com_reset | ||
+ | | Com_restore_table | ||
+ | | Com_revoke | ||
+ | | Com_revoke_all | ||
+ | | Com_rollback | ||
+ | | Com_rollback_to_savepoint | ||
+ | | Com_savepoint | ||
+ | | Com_select | ||
+ | | Com_set_option | ||
+ | | Com_show_authors | ||
+ | | Com_show_binlog_events | ||
+ | | Com_show_binlogs | ||
+ | | Com_show_charsets | ||
+ | | Com_show_collations | ||
+ | | Com_show_column_types | ||
+ | | Com_show_contributors | ||
+ | | Com_show_create_db | ||
+ | | Com_show_create_event | ||
+ | | Com_show_create_func | ||
+ | | Com_show_create_proc | ||
+ | | Com_show_create_table | ||
+ | | Com_show_create_trigger | ||
+ | | Com_show_databases | ||
+ | | Com_show_engine_logs | ||
+ | | Com_show_engine_mutex | ||
+ | | Com_show_engine_status | ||
+ | | Com_show_events | ||
+ | | Com_show_errors | ||
+ | | Com_show_fields | ||
+ | | Com_show_function_status | ||
+ | | Com_show_grants | ||
+ | | Com_show_keys | ||
+ | | Com_show_master_status | ||
+ | | Com_show_new_master | ||
+ | | Com_show_open_tables | ||
+ | | Com_show_plugins | ||
+ | | Com_show_privileges | ||
+ | | Com_show_procedure_status | ||
+ | | Com_show_processlist | ||
+ | | Com_show_profile | ||
+ | | Com_show_profiles | ||
+ | | Com_show_slave_hosts | ||
+ | | Com_show_slave_status | ||
+ | | Com_show_status | ||
+ | | Com_show_storage_engines | ||
+ | | Com_show_table_status | ||
+ | | Com_show_tables | ||
+ | | Com_show_triggers | ||
+ | | Com_show_variables | ||
+ | | Com_show_warnings | ||
+ | | Com_slave_start | ||
+ | | Com_slave_stop | ||
+ | | Com_stmt_close | ||
+ | | Com_stmt_execute | ||
+ | | Com_stmt_fetch | ||
+ | | Com_stmt_prepare | ||
+ | | Com_stmt_reprepare | ||
+ | | Com_stmt_reset | ||
+ | | Com_stmt_send_long_data | ||
+ | | Com_truncate | ||
+ | | Com_uninstall_plugin | ||
+ | | Com_unlock_tables | ||
+ | | Com_update | ||
+ | | Com_update_multi | ||
+ | | Com_xa_commit | ||
+ | | Com_xa_end | ||
+ | | Com_xa_prepare | ||
+ | | Com_xa_recover | ||
+ | | Com_xa_rollback | ||
+ | | Com_xa_start | ||
+ | | Compression | ||
+ | | Connections | ||
+ | | Created_tmp_disk_tables | ||
+ | | Created_tmp_files | ||
+ | | Created_tmp_tables | ||
+ | | Delayed_errors | ||
+ | | Delayed_insert_threads | ||
+ | | Delayed_writes | ||
+ | | Flush_commands | ||
+ | | Handler_commit | ||
+ | | Handler_delete | ||
+ | | Handler_discover | ||
+ | | Handler_prepare | ||
+ | | Handler_read_first | ||
+ | | Handler_read_key | ||
+ | | Handler_read_next | ||
+ | | Handler_read_prev | ||
+ | | Handler_read_rnd | ||
+ | | Handler_read_rnd_next | ||
+ | | Handler_rollback | ||
+ | | Handler_savepoint | ||
+ | | Handler_savepoint_rollback | ||
+ | | Handler_update | ||
+ | | Handler_write | ||
+ | | Innodb_buffer_pool_pages_data | ||
+ | | Innodb_buffer_pool_pages_dirty | ||
+ | | Innodb_buffer_pool_pages_flushed | ||
+ | | Innodb_buffer_pool_pages_free | ||
+ | | Innodb_buffer_pool_pages_misc | ||
+ | | Innodb_buffer_pool_pages_total | ||
+ | | Innodb_buffer_pool_read_ahead_rnd | 0 | | ||
+ | | Innodb_buffer_pool_read_ahead_seq | 0 | | ||
+ | | Innodb_buffer_pool_read_requests | ||
+ | | Innodb_buffer_pool_reads | ||
+ | | Innodb_buffer_pool_wait_free | ||
+ | | Innodb_buffer_pool_write_requests | 1174 | | ||
+ | | Innodb_data_fsyncs | ||
+ | | Innodb_data_pending_fsyncs | ||
+ | | Innodb_data_pending_reads | ||
+ | | Innodb_data_pending_writes | ||
+ | | Innodb_data_read | ||
+ | | Innodb_data_reads | ||
+ | | Innodb_data_writes | ||
+ | | Innodb_data_written | ||
+ | | Innodb_dblwr_pages_written | ||
+ | | Innodb_dblwr_writes | ||
+ | | Innodb_log_waits | ||
+ | | Innodb_log_write_requests | ||
+ | | Innodb_log_writes | ||
+ | | Innodb_os_log_fsyncs | ||
+ | | Innodb_os_log_pending_fsyncs | ||
+ | | Innodb_os_log_pending_writes | ||
+ | | Innodb_os_log_written | ||
+ | | Innodb_page_size | ||
+ | | Innodb_pages_created | ||
+ | | Innodb_pages_read | ||
+ | | Innodb_pages_written | ||
+ | | Innodb_row_lock_current_waits | ||
+ | | Innodb_row_lock_time | ||
+ | | Innodb_row_lock_time_avg | ||
+ | | Innodb_row_lock_time_max | ||
+ | | Innodb_row_lock_waits | ||
+ | | Innodb_rows_deleted | ||
+ | | Innodb_rows_inserted | ||
+ | | Innodb_rows_read | ||
+ | | Innodb_rows_updated | ||
+ | | Key_blocks_not_flushed | ||
+ | | Key_blocks_unused | ||
+ | | Key_blocks_used | ||
+ | | Key_read_requests | ||
+ | | Key_reads | ||
+ | | Key_write_requests | ||
+ | | Key_writes | ||
+ | | Last_query_cost | ||
+ | | Max_used_connections | ||
+ | | Not_flushed_delayed_rows | ||
+ | | Open_files | ||
+ | | Open_streams | ||
+ | | Open_table_definitions | ||
+ | | Open_tables | ||
+ | | Opened_files | ||
+ | | Opened_table_definitions | ||
+ | | Opened_tables | ||
+ | | Prepared_stmt_count | ||
+ | | Qcache_free_blocks | ||
+ | | Qcache_free_memory | ||
+ | | Qcache_hits | ||
+ | | Qcache_inserts | ||
+ | | Qcache_lowmem_prunes | ||
+ | | Qcache_not_cached | ||
+ | | Qcache_queries_in_cache | ||
+ | | Qcache_total_blocks | ||
+ | | Queries | ||
+ | | Questions | ||
+ | | Rpl_status | ||
+ | | Select_full_join | ||
+ | | Select_full_range_join | ||
+ | | Select_range | ||
+ | | Select_range_check | ||
+ | | Select_scan | ||
+ | | Slave_open_temp_tables | ||
+ | | Slave_retried_transactions | ||
+ | | Slave_running | ||
+ | | Slow_launch_threads | ||
+ | | Slow_queries | ||
+ | | Sort_merge_passes | ||
+ | | Sort_range | ||
+ | | Sort_rows | ||
+ | | Sort_scan | ||
+ | | Ssl_accept_renegotiates | ||
+ | | Ssl_accepts | ||
+ | | Ssl_callback_cache_hits | ||
+ | | Ssl_cipher | ||
+ | | Ssl_cipher_list | ||
+ | | Ssl_client_connects | ||
+ | | Ssl_connect_renegotiates | ||
+ | | Ssl_ctx_verify_depth | ||
+ | | Ssl_ctx_verify_mode | ||
+ | | Ssl_default_timeout | ||
+ | | Ssl_finished_accepts | ||
+ | | Ssl_finished_connects | ||
+ | | Ssl_session_cache_hits | ||
+ | | Ssl_session_cache_misses | ||
+ | | Ssl_session_cache_mode | ||
+ | | Ssl_session_cache_overflows | ||
+ | | Ssl_session_cache_size | ||
+ | | Ssl_session_cache_timeouts | ||
+ | | Ssl_sessions_reused | ||
+ | | Ssl_used_session_cache_entries | ||
+ | | Ssl_verify_depth | ||
+ | | Ssl_verify_mode | ||
+ | | Ssl_version | ||
+ | | Table_locks_immediate | ||
+ | | Table_locks_waited | ||
+ | | Tc_log_max_pages_used | ||
+ | | Tc_log_page_size | ||
+ | | Tc_log_page_waits | ||
+ | | Threads_cached | ||
+ | | Threads_connected | ||
+ | | Threads_created | ||
+ | | Threads_running | ||
+ | | Uptime | ||
+ | | Uptime_since_flush_status | ||
+ | +-----------------------------------+-----------+ | ||
+ | 291 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour plus d' | ||
+ | </ | ||
+ | |||
+ | **SHOW VARIABLES** | ||
+ | |||
+ | Cette commande prend la forme suivante : | ||
+ | |||
+ | SHOW [GLOBAL|SESSION] VARIABLES [LIKE ' | ||
+ | |||
+ | Par exemple: | ||
+ | |||
+ | < | ||
+ | mysql> SHOW VARIABLES; | ||
+ | +-----------------------------------------+-------------------------------------------------------------------------------------------+ | ||
+ | | Variable_name | ||
+ | +-----------------------------------------+-------------------------------------------------------------------------------------------+ | ||
+ | | auto_increment_increment | ||
+ | | auto_increment_offset | ||
+ | | autocommit | ||
+ | | automatic_sp_privileges | ||
+ | | back_log | ||
+ | | basedir | ||
+ | | big_tables | ||
+ | | binlog_cache_size | ||
+ | | binlog_direct_non_transactional_updates | OFF | | ||
+ | | binlog_format | ||
+ | | bulk_insert_buffer_size | ||
+ | | character_set_client | ||
+ | | character_set_connection | ||
+ | | character_set_database | ||
+ | | character_set_filesystem | ||
+ | | character_set_results | ||
+ | | character_set_server | ||
+ | | character_set_system | ||
+ | | character_sets_dir | ||
+ | | collation_connection | ||
+ | | collation_database | ||
+ | | collation_server | ||
+ | | completion_type | ||
+ | | concurrent_insert | ||
+ | | connect_timeout | ||
+ | | datadir | ||
+ | | date_format | ||
+ | | datetime_format | ||
+ | | default_week_format | ||
+ | | delay_key_write | ||
+ | | delayed_insert_limit | ||
+ | | delayed_insert_timeout | ||
+ | | delayed_queue_size | ||
+ | | div_precision_increment | ||
+ | | engine_condition_pushdown | ||
+ | | error_count | ||
+ | | event_scheduler | ||
+ | | expire_logs_days | ||
+ | | flush | OFF | | ||
+ | | flush_time | ||
+ | | foreign_key_checks | ||
+ | | ft_boolean_syntax | ||
+ | | ft_max_word_len | ||
+ | | ft_min_word_len | ||
+ | | ft_query_expansion_limit | ||
+ | | ft_stopword_file | ||
+ | | general_log | ||
+ | | general_log_file | ||
+ | | group_concat_max_len | ||
+ | | have_community_features | ||
+ | | have_compress | ||
+ | | have_crypt | ||
+ | | have_csv | ||
+ | | have_dynamic_loading | ||
+ | | have_geometry | ||
+ | | have_innodb | ||
+ | | have_ndbcluster | ||
+ | | have_openssl | ||
+ | | have_partitioning | ||
+ | | have_query_cache | ||
+ | | have_rtree_keys | ||
+ | | have_ssl | ||
+ | | have_symlink | ||
+ | | hostname | ||
+ | | identity | ||
+ | | ignore_builtin_innodb | ||
+ | | init_connect | ||
+ | | init_file | ||
+ | | init_slave | ||
+ | | innodb_adaptive_hash_index | ||
+ | | innodb_additional_mem_pool_size | ||
+ | | innodb_autoextend_increment | ||
+ | | innodb_autoinc_lock_mode | ||
+ | | innodb_buffer_pool_size | ||
+ | | innodb_checksums | ||
+ | | innodb_commit_concurrency | ||
+ | | innodb_concurrency_tickets | ||
+ | | innodb_data_file_path | ||
+ | | innodb_data_home_dir | ||
+ | | innodb_doublewrite | ||
+ | | innodb_fast_shutdown | ||
+ | | innodb_file_io_threads | ||
+ | | innodb_file_per_table | ||
+ | | innodb_flush_log_at_trx_commit | ||
+ | | innodb_flush_method | ||
+ | | innodb_force_recovery | ||
+ | | innodb_lock_wait_timeout | ||
+ | | innodb_locks_unsafe_for_binlog | ||
+ | | innodb_log_buffer_size | ||
+ | | innodb_log_file_size | ||
+ | | innodb_log_files_in_group | ||
+ | | innodb_log_group_home_dir | ||
+ | | innodb_max_dirty_pages_pct | ||
+ | | innodb_max_purge_lag | ||
+ | | innodb_mirrored_log_groups | ||
+ | | innodb_open_files | ||
+ | | innodb_rollback_on_timeout | ||
+ | | innodb_stats_method | ||
+ | | innodb_stats_on_metadata | ||
+ | | innodb_support_xa | ||
+ | | innodb_sync_spin_loops | ||
+ | | innodb_table_locks | ||
+ | | innodb_thread_concurrency | ||
+ | | innodb_thread_sleep_delay | ||
+ | | innodb_use_legacy_cardinality_algorithm | ON | | ||
+ | | insert_id | ||
+ | | interactive_timeout | ||
+ | | join_buffer_size | ||
+ | | keep_files_on_create | ||
+ | | key_buffer_size | ||
+ | | key_cache_age_threshold | ||
+ | | key_cache_block_size | ||
+ | | key_cache_division_limit | ||
+ | | language | ||
+ | | large_files_support | ||
+ | | large_page_size | ||
+ | | large_pages | ||
+ | | last_insert_id | ||
+ | | lc_time_names | ||
+ | | license | ||
+ | | local_infile | ||
+ | | locked_in_memory | ||
+ | | log | OFF | | ||
+ | | log_bin | ||
+ | | log_bin_trust_function_creators | ||
+ | | log_bin_trust_routine_creators | ||
+ | | log_error | ||
+ | | log_output | ||
+ | | log_queries_not_using_indexes | ||
+ | | log_slave_updates | ||
+ | | log_slow_queries | ||
+ | | log_warnings | ||
+ | | long_query_time | ||
+ | | low_priority_updates | ||
+ | | lower_case_file_system | ||
+ | | lower_case_table_names | ||
+ | | max_allowed_packet | ||
+ | | max_binlog_cache_size | ||
+ | | max_binlog_size | ||
+ | | max_connect_errors | ||
+ | | max_connections | ||
+ | | max_delayed_threads | ||
+ | | max_error_count | ||
+ | | max_heap_table_size | ||
+ | | max_insert_delayed_threads | ||
+ | | max_join_size | ||
+ | | max_length_for_sort_data | ||
+ | | max_long_data_size | ||
+ | | max_prepared_stmt_count | ||
+ | | max_relay_log_size | ||
+ | | max_seeks_for_key | ||
+ | | max_sort_length | ||
+ | | max_sp_recursion_depth | ||
+ | | max_tmp_tables | ||
+ | | max_user_connections | ||
+ | | max_write_lock_count | ||
+ | | min_examined_row_limit | ||
+ | | multi_range_count | ||
+ | | myisam_data_pointer_size | ||
+ | | myisam_max_sort_file_size | ||
+ | | myisam_mmap_size | ||
+ | | myisam_recover_options | ||
+ | | myisam_repair_threads | ||
+ | | myisam_sort_buffer_size | ||
+ | | myisam_stats_method | ||
+ | | myisam_use_mmap | ||
+ | | net_buffer_length | ||
+ | | net_read_timeout | ||
+ | | net_retry_count | ||
+ | | net_write_timeout | ||
+ | | new | OFF | | ||
+ | | old | OFF | | ||
+ | | old_alter_table | ||
+ | | old_passwords | ||
+ | | open_files_limit | ||
+ | | optimizer_prune_level | ||
+ | | optimizer_search_depth | ||
+ | | optimizer_switch | ||
+ | | pid_file | ||
+ | | plugin_dir | ||
+ | | port | 3306 | | ||
+ | | preload_buffer_size | ||
+ | | profiling | ||
+ | | profiling_history_size | ||
+ | | protocol_version | ||
+ | | pseudo_thread_id | ||
+ | | query_alloc_block_size | ||
+ | | query_cache_limit | ||
+ | | query_cache_min_res_unit | ||
+ | | query_cache_size | ||
+ | | query_cache_type | ||
+ | | query_cache_wlock_invalidate | ||
+ | | query_prealloc_size | ||
+ | | rand_seed1 | ||
+ | | rand_seed2 | ||
+ | | range_alloc_block_size | ||
+ | | read_buffer_size | ||
+ | | read_only | ||
+ | | read_rnd_buffer_size | ||
+ | | relay_log | ||
+ | | relay_log_index | ||
+ | | relay_log_info_file | ||
+ | | relay_log_purge | ||
+ | | relay_log_space_limit | ||
+ | | report_host | ||
+ | | report_password | ||
+ | | report_port | ||
+ | | report_user | ||
+ | | rpl_recovery_rank | ||
+ | | secure_auth | ||
+ | | secure_file_priv | ||
+ | | server_id | ||
+ | | skip_external_locking | ||
+ | | skip_name_resolve | ||
+ | | skip_networking | ||
+ | | skip_show_database | ||
+ | | slave_compressed_protocol | ||
+ | | slave_exec_mode | ||
+ | | slave_load_tmpdir | ||
+ | | slave_net_timeout | ||
+ | | slave_skip_errors | ||
+ | | slave_transaction_retries | ||
+ | | slow_launch_time | ||
+ | | slow_query_log | ||
+ | | slow_query_log_file | ||
+ | | socket | ||
+ | | sort_buffer_size | ||
+ | | sql_auto_is_null | ||
+ | | sql_big_selects | ||
+ | | sql_big_tables | ||
+ | | sql_buffer_result | ||
+ | | sql_log_bin | ||
+ | | sql_log_off | ||
+ | | sql_log_update | ||
+ | | sql_low_priority_updates | ||
+ | | sql_max_join_size | ||
+ | | sql_mode | ||
+ | | sql_notes | ||
+ | | sql_quote_show_create | ||
+ | | sql_safe_updates | ||
+ | | sql_select_limit | ||
+ | | sql_slave_skip_counter | ||
+ | | sql_warnings | ||
+ | | ssl_ca | ||
+ | | ssl_capath | ||
+ | | ssl_cert | ||
+ | | ssl_cipher | ||
+ | | ssl_key | ||
+ | | storage_engine | ||
+ | | sync_binlog | ||
+ | | sync_frm | ||
+ | | system_time_zone | ||
+ | | table_definition_cache | ||
+ | | table_lock_wait_timeout | ||
+ | | table_open_cache | ||
+ | | table_type | ||
+ | | thread_cache_size | ||
+ | | thread_handling | ||
+ | | thread_stack | ||
+ | | time_format | ||
+ | | time_zone | ||
+ | | timed_mutexes | ||
+ | | timestamp | ||
+ | | tmp_table_size | ||
+ | | tmpdir | ||
+ | | transaction_alloc_block_size | ||
+ | | transaction_prealloc_size | ||
+ | | tx_isolation | ||
+ | | unique_checks | ||
+ | | updatable_views_with_limit | ||
+ | | version | ||
+ | | version_comment | ||
+ | | version_compile_machine | ||
+ | | version_compile_os | ||
+ | | wait_timeout | ||
+ | | warning_count | ||
+ | +-----------------------------------------+-------------------------------------------------------------------------------------------+ | ||
+ | 276 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour plus d' | ||
+ | </ | ||
+ | |||
+ | **SHOW PROCESSLIST** | ||
+ | |||
+ | Cette commande prend la forme suivante : | ||
+ | |||
+ | SHOW [FULL] PROCESSLIST; | ||
+ | |||
+ | Par exemple: | ||
+ | |||
+ | < | ||
+ | mysql> SHOW PROCESSLIST; | ||
+ | +----+------+-----------+--------+---------+------+-------+-------------------+ | ||
+ | | Id | User | Host | db | Command | Time | State | Info | | ||
+ | +----+------+-----------+--------+---------+------+-------+-------------------+ | ||
+ | | 11 | root | localhost | ligue1 | Query | ||
+ | +----+------+-----------+--------+---------+------+-------+-------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SHOW FULL PROCESSLIST; | ||
+ | +----+------+-----------+--------+---------+------+-------+-----------------------+ | ||
+ | | Id | User | Host | db | Command | Time | State | Info | | ||
+ | +----+------+-----------+--------+---------+------+-------+-----------------------+ | ||
+ | | 11 | root | localhost | ligue1 | Query | ||
+ | +----+------+-----------+--------+---------+------+-------+-----------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour plus d' | ||
+ | </ | ||
+ | |||
+ | **SHOW GRANTS** | ||
+ | |||
+ | Cette commande prend la forme suivante : | ||
+ | |||
+ | SHOW GRANTS FOR utilisateur; | ||
+ | |||
+ | Par exemple: | ||
+ | |||
+ | < | ||
+ | mysql> SHOW GRANTS; | ||
+ | +----------------------------------------------------------------------------------------------------------------------------------------+ | ||
+ | | Grants for root@localhost | ||
+ | +----------------------------------------------------------------------------------------------------------------------------------------+ | ||
+ | | GRANT ALL PRIVILEGES ON *.* TO ' | ||
+ | +----------------------------------------------------------------------------------------------------------------------------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour plus d' | ||
+ | </ | ||
+ | |||
+ | **SHOW CREATE TABLE** | ||
+ | |||
+ | Cette commande prend la forme suivante : | ||
+ | |||
+ | SHOW CREATE TABLE nomtable[\G]; | ||
+ | |||
+ | Par exemple: | ||
+ | |||
+ | < | ||
+ | mysql> SHOW CREATE TABLE equipe; | ||
+ | +--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ||
+ | | Table | Create Table | | ||
+ | +--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ||
+ | | equipe | CREATE TABLE `equipe` ( | ||
+ | `id_equipe` int(11) NOT NULL AUTO_INCREMENT, | ||
+ | `nom` varchar(50) NOT NULL, | ||
+ | `stade` varchar(50) NOT NULL, | ||
+ | `ville` varchar(30) NOT NULL, | ||
+ | `points` int(11) NOT NULL DEFAULT ' | ||
+ | `buts` int(11) NOT NULL DEFAULT ' | ||
+ | `entraineur` varchar(100) DEFAULT ' | ||
+ | `tel_entraineur` varchar(20) DEFAULT ' | ||
+ | PRIMARY KEY (`id_equipe`) | ||
+ | ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 | | ||
+ | +--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ou | ||
+ | |||
+ | < | ||
+ | mysql> SHOW CREATE TABLE equipe\G; | ||
+ | *************************** 1. row *************************** | ||
+ | | ||
+ | Create Table: CREATE TABLE `equipe` ( | ||
+ | `id_equipe` int(11) NOT NULL AUTO_INCREMENT, | ||
+ | `nom` varchar(50) NOT NULL, | ||
+ | `stade` varchar(50) NOT NULL, | ||
+ | `ville` varchar(30) NOT NULL, | ||
+ | `points` int(11) NOT NULL DEFAULT ' | ||
+ | `buts` int(11) NOT NULL DEFAULT ' | ||
+ | `entraineur` varchar(100) DEFAULT ' | ||
+ | `tel_entraineur` varchar(20) DEFAULT ' | ||
+ | PRIMARY KEY (`id_equipe`) | ||
+ | ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | ERROR: | ||
+ | No query specified | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez l' | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour plus d' | ||
+ | </ | ||
+ | |||
+ | ===La Commande SET=== | ||
+ | |||
+ | La commande SET permet de spécifier les valeurs des options du serveur ou des programmes clients. | ||
+ | |||
+ | Par example la saisie de la commande suivante démontre que la valeur de max_connections est de **100**: | ||
+ | |||
+ | < | ||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +-----------------+-------+ | ||
+ | | Variable_name | ||
+ | +-----------------+-------+ | ||
+ | | max_connections | 151 | | ||
+ | +-----------------+-------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Pour modifier cette valeur à **200**, saisissez la commande suivante: | ||
+ | |||
+ | < | ||
+ | mysql> SET GLOBAL max_connections = 200; | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +-----------------+-------+ | ||
+ | | Variable_name | ||
+ | +-----------------+-------+ | ||
+ | | max_connections | 200 | | ||
+ | +-----------------+-------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que dans ce cas il s'agit d'une variable globale. Dans le cas d'une variable de **SESSION**, | ||
+ | </ | ||
+ | |||
+ | ==La Commande KILL== | ||
+ | |||
+ | La commande **KILL** permet d' | ||
+ | |||
+ | mysql> KILL idThread; [Entrée] | ||
+ | |||
+ | Pour comprendre son utilisation, | ||
+ | |||
+ | < | ||
+ | mysql> GRANT USAGE ON * TO fenestros@localhost IDENTIFIED BY ' | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Accordez les privilèges de connexion à l' | ||
+ | |||
+ | < | ||
+ | mysql> GRANT USAGE ON * TO fenestros@localhost IDENTIFIED BY ' | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> SHOW GRANTS for fenestros@localhost; | ||
+ | +------------------------------------------------------------------------------------------------------------------+ | ||
+ | | Grants for fenestros@localhost | ||
+ | +------------------------------------------------------------------------------------------------------------------+ | ||
+ | | GRANT USAGE ON *.* TO ' | ||
+ | +------------------------------------------------------------------------------------------------------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Connectez-vous à votre serveur %%MySQL%% avec le compte de **fenestros** **sans vous déconnecter en tant que root** et saisissez une commande pour vérifiez que tout va bien: | ||
+ | |||
+ | < | ||
+ | [trainee@centos6 ~]$ mysql -u fenestros -p | ||
+ | Enter password: fenestros | ||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 12 | ||
+ | Server version: 5.1.61 Source distribution | ||
+ | |||
+ | Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> SHOW DATABASES; | ||
+ | +--------------------+ | ||
+ | | Database | ||
+ | +--------------------+ | ||
+ | | information_schema | | ||
+ | | test | | ||
+ | +--------------------+ | ||
+ | 2 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que le mote de passe ne sera **pas** visible. | ||
+ | </ | ||
+ | |||
+ | En tant que root, saisissez la commande suivante: | ||
+ | |||
+ | < | ||
+ | mysql> SHOW PROCESSLIST; | ||
+ | +----+-----------+-----------+--------+---------+------+-------+------------------+ | ||
+ | | Id | User | Host | db | Command | Time | State | Info | | ||
+ | +----+-----------+-----------+--------+---------+------+-------+------------------+ | ||
+ | | 11 | root | localhost | ligue1 | Query | ||
+ | | 12 | fenestros | localhost | NULL | Sleep | ||
+ | +----+-----------+-----------+--------+---------+------+-------+------------------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez bien la présence de l' | ||
+ | </ | ||
+ | |||
+ | Pour interrompre le thread de **fenestros**, | ||
+ | |||
+ | < | ||
+ | mysql> KILL 12; | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> SHOW PROCESSLIST; | ||
+ | +----+------+-----------+--------+---------+------+-------+------------------+ | ||
+ | | Id | User | Host | db | Command | Time | State | Info | | ||
+ | +----+------+-----------+--------+---------+------+-------+------------------+ | ||
+ | | 11 | root | localhost | ligue1 | Query | ||
+ | +----+------+-----------+--------+---------+------+-------+------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que le thread de l' | ||
+ | </ | ||
+ | |||
+ | Consultez maintenant la connexion de fenestros au serveur %%MySQL%% et lancez la commande suivante: | ||
+ | |||
+ | < | ||
+ | mysql> SHOW DATABASES; | ||
+ | ERROR 2006 (HY000): MySQL server has gone away | ||
+ | No connection. Trying to reconnect... | ||
+ | Connection id: 13 | ||
+ | Current database: *** NONE *** | ||
+ | |||
+ | +--------------------+ | ||
+ | | Database | ||
+ | +--------------------+ | ||
+ | | information_schema | | ||
+ | | test | | ||
+ | +--------------------+ | ||
+ | 2 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que le client se reconnecte au serveur! | ||
+ | </ | ||
+ | |||
+ | Contrôlez maintenant la PROCESSLIST à partir de la connexion de **root** : | ||
+ | |||
+ | < | ||
+ | mysql> SHOW PROCESSLIST; | ||
+ | +----+-----------+-----------+--------+---------+------+-------+------------------+ | ||
+ | | Id | User | Host | db | Command | Time | State | Info | | ||
+ | +----+-----------+-----------+--------+---------+------+-------+------------------+ | ||
+ | | 11 | root | localhost | ligue1 | Query | ||
+ | | 13 | fenestros | localhost | NULL | Sleep | ||
+ | +----+-----------+-----------+--------+---------+------+-------+------------------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Voici la même commande à partir de la connexion de **fenestros** : | ||
+ | |||
+ | < | ||
+ | mysql> SHOW PROCESSLIST; | ||
+ | +----+-----------+-----------+------+---------+------+-------+------------------+ | ||
+ | | Id | User | Host | db | Command | Time | State | Info | | ||
+ | +----+-----------+-----------+------+---------+------+-------+------------------+ | ||
+ | | 13 | fenestros | localhost | NULL | Query | ||
+ | +----+-----------+-----------+------+---------+------+-------+------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez qu'un autre thread pour la connexion de fenestros a été démarré. | ||
+ | </ | ||
+ | |||
+ | ==La Commande FLUSH== | ||
+ | |||
+ | La commande FLUSH permet de vider les caches du serveur %%MySQL%%. | ||
+ | |||
+ | **FLUSH HOSTS** | ||
+ | |||
+ | Cette commande ré-initialise le cache des adresse IP des clients: | ||
+ | |||
+ | mysql> FLUSH HOSTS; [Entrée] | ||
+ | |||
+ | **FLUSH LOGS** | ||
+ | |||
+ | Cette commande ferme les fichiers de logs et crée de nouveaux: | ||
+ | |||
+ | mysql> FLUSH LOGS; [Entrée] | ||
+ | |||
+ | **FLUSH PRIVILEGES** | ||
+ | |||
+ | Cette commande recharge la table de privileges: | ||
+ | |||
+ | mysql> FLUSH PRIVILEGES; [Entrée] | ||
+ | |||
+ | **FLUSH TABLES** | ||
+ | |||
+ | Cette commande vide les caches des tables et les ferme: | ||
+ | |||
+ | mysql> FLUSH TABLES; [Entrée] | ||
+ | |||
+ | En cas de tables multiples, il convient d' | ||
+ | |||
+ | mysql> FLUSH [TABLE|TABLES] nomtable [, | ||
+ | |||
+ | |||
+ | ===La base INFORMATION_SCHEMA === | ||
+ | |||
+ | Les commandes SHOW ne correspondent pas aux standards SQL2003. **%%MySQL%% 5.x** fournit une base spécifique appelée **INFORMATION_SCHEMA** qui contient les **Méta-données** : | ||
+ | |||
+ | < | ||
+ | mysql> USE information_schema | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | mysql> SHOW TABLES; | ||
+ | +---------------------------------------+ | ||
+ | | Tables_in_information_schema | ||
+ | +---------------------------------------+ | ||
+ | | CHARACTER_SETS | ||
+ | | COLLATIONS | ||
+ | | COLLATION_CHARACTER_SET_APPLICABILITY | | ||
+ | | COLUMNS | ||
+ | | COLUMN_PRIVILEGES | ||
+ | | ENGINES | ||
+ | | EVENTS | ||
+ | | FILES | | ||
+ | | GLOBAL_STATUS | ||
+ | | GLOBAL_VARIABLES | ||
+ | | KEY_COLUMN_USAGE | ||
+ | | PARTITIONS | ||
+ | | PLUGINS | ||
+ | | PROCESSLIST | ||
+ | | PROFILING | ||
+ | | REFERENTIAL_CONSTRAINTS | ||
+ | | ROUTINES | ||
+ | | SCHEMATA | ||
+ | | SCHEMA_PRIVILEGES | ||
+ | | SESSION_STATUS | ||
+ | | SESSION_VARIABLES | ||
+ | | STATISTICS | ||
+ | | TABLES | ||
+ | | TABLE_CONSTRAINTS | ||
+ | | TABLE_PRIVILEGES | ||
+ | | TRIGGERS | ||
+ | | USER_PRIVILEGES | ||
+ | | VIEWS | | ||
+ | +---------------------------------------+ | ||
+ | 28 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Chaque table de cette base fournit des informations spécifiques, | ||
+ | |||
+ | ^ TABLE ^ Contenu ^ | ||
+ | | CHARACTER_SETS | Informations sur jeux de caractères. | | ||
+ | | COLLATIONS | Informations sur interclassements. | | ||
+ | | COLLATION_CHARACTER_SET_APPLICABILITY | Correspondances interclassements / charsets. | | ||
+ | | COLUMNS | Informations sur leurs colonnes. | | ||
+ | | COLUMN_PRIVILEGES | Informations sur les privilèges sur les colonnes. | | ||
+ | | KEY_COLUMN_USAGE | clés primaires et étrangères. | | ||
+ | | ROUTINES | Informations sur les procédures et fonctions stockées. | | ||
+ | | SCHEMATA | Informations sur les bases (ou schémas). | | ||
+ | | SCHEMA_PRIVILEGES | Informations sur privilèges sur les bases. | | ||
+ | | STATISTICS | Informations sur les indexes. | | ||
+ | | TABLES | Informations sur les tables. | | ||
+ | | TABLE_CONSTRAINTS | Informations sur les contraintes des tables. | | ||
+ | | TABLE_PRIVILEGES | Informations sur les privilèges sur les tables. | | ||
+ | | TRIGGERS | Informations sur les déclencheurs. | | ||
+ | | USER_PRIVILEGES | Informations sur les privilèges globaux. | | ||
+ | | VIEWS | Informations sur les vues. | | ||
+ | |||
+ | ==== Maintenance ==== | ||
+ | |||
+ | ===Instructions SQL=== | ||
+ | |||
+ | ==CHECK TABLE== | ||
+ | |||
+ | Cette commande fonctionne avec les moteurs de type **%%MyISAM%%**, | ||
+ | |||
+ | ^ Option ^ Description ^ | ||
+ | | QUICK | Ne recherche pas d' | ||
+ | | FAST | Ne vérifie que les tables qui n'ont pas été fermées correctement | | ||
+ | | CHANGED | Ne vérifie que les tables ayant subi une modification depuis la dernière vérification | | ||
+ | | MEDIUM | Vérifie les enregistrements et génère une cléf d' | ||
+ | | EXTENDED | Vérifie les enregistrements et génère une cléf d' | ||
+ | |||
+ | |||
+ | Vérifiez les tables de votre base ligue1 ; | ||
+ | |||
+ | < | ||
+ | mysql> CHECK TABLE ligue1.equipe, | ||
+ | +------------------+-------+----------+----------+ | ||
+ | | Table | Op | Msg_type | Msg_text | | ||
+ | +------------------+-------+----------+----------+ | ||
+ | | ligue1.equipe | ||
+ | | ligue1.rencontre | check | status | ||
+ | +------------------+-------+----------+----------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Vérifiez les tables de votre base ligue1 avec l' | ||
+ | |||
+ | < | ||
+ | mysql> CHECK TABLE ligue1.equipe, | ||
+ | +------------------+-------+----------+-----------------------------+ | ||
+ | | Table | Op | Msg_type | Msg_text | ||
+ | +------------------+-------+----------+-----------------------------+ | ||
+ | | ligue1.equipe | ||
+ | | ligue1.rencontre | check | status | ||
+ | +------------------+-------+----------+-----------------------------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour plus d' | ||
+ | </ | ||
+ | |||
+ | ==REPAIR TABLE== | ||
+ | |||
+ | Dans certains cas, la commande CHECK TABLE relève des erreurs. Dans le cas précis d'une erreur du type **warning** due à la non-fermeture d'une table, il convient de fermer toutes les tables en utilisant la commande : | ||
+ | |||
+ | mysql> FLUSH TABLES; [Entrée] | ||
+ | |||
+ | Dans d' | ||
+ | |||
+ | ^ Option ^ Description ^ | ||
+ | | NO_WRITE_TO_BINLOG | N' | ||
+ | | QUICK | Ne répare que l' | ||
+ | | EXTENDED | Gére des index de chaînes longues | | ||
+ | | USE_FRM | Permet de recréer un fichier d' | ||
+ | |||
+ | Saisissez la commande suivante : | ||
+ | |||
+ | < | ||
+ | mysql> REPAIR TABLE ligue1.equipe, | ||
+ | +------------------+--------+----------+----------+ | ||
+ | | Table | Op | Msg_type | Msg_text | | ||
+ | +------------------+--------+----------+----------+ | ||
+ | | ligue1.equipe | ||
+ | | ligue1.rencontre | repair | status | ||
+ | +------------------+--------+----------+----------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Les actions de maintenance peuvent être automatisées par l' | ||
+ | |||
+ | * BACKUP : génère une sauvegarde au format nom_table-dateheure.BAK du fichier des données dans le cas où la réparation nécessite la modification d' | ||
+ | * FORCE : force la réparation même si des enregistrements doivent être supprimés, | ||
+ | * QUICK : les tables sans trous sont ignorés, | ||
+ | * DEFAULT : tente de restaurer la table. | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour plus d' | ||
+ | </ | ||
+ | |||
+ | ==OPTIMIZE TABLE== | ||
+ | |||
+ | La commande OPTIMIZE TABLE permet de défragmenter une table ou plusieurs tables. La commande OPTIMIZE TABLE ne fonctionne qu' | ||
+ | |||
+ | Saisissez la commande suivante : | ||
+ | |||
+ | < | ||
+ | mysql> OPTIMIZE TABLE ligue1.equipe, | ||
+ | +------------------+----------+----------+----------+ | ||
+ | | Table | Op | Msg_type | Msg_text | | ||
+ | +------------------+----------+----------+----------+ | ||
+ | | ligue1.equipe | ||
+ | | ligue1.rencontre | optimize | status | ||
+ | +------------------+----------+----------+----------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour plus d' | ||
+ | </ | ||
+ | |||
+ | ==ANALYZE TABLE== | ||
+ | |||
+ | La commande ANALYZE TABLE permet d' | ||
+ | |||
+ | Saisissez la commande suivante : | ||
+ | |||
+ | < | ||
+ | mysql> ANALYZE TABLE ligue1.equipe, | ||
+ | +------------------+---------+----------+-----------------------------+ | ||
+ | | Table | Op | Msg_type | Msg_text | ||
+ | +------------------+---------+----------+-----------------------------+ | ||
+ | | ligue1.equipe | ||
+ | | ligue1.rencontre | analyze | status | ||
+ | +------------------+---------+----------+-----------------------------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour plus d' | ||
+ | </ | ||
+ | |||
+ | ===myisamchk=== | ||
+ | |||
+ | Le programme **myisamchk** permet d' | ||
+ | |||
+ | Sortez de mysql et **arretez le serveur mysqld** : | ||
+ | |||
+ | < | ||
+ | mysql> exit | ||
+ | Bye | ||
+ | [root@centos6 ~]# service mysqld stop | ||
+ | Arrêt de MySQL : | ||
+ | [root@centos6 ~]# | ||
+ | </ | ||
+ | |||
+ | Saisissez ensuite la commande suivante pour vérifier tous les index de la base **ligue1** : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# myisamchk / | ||
+ | Checking MyISAM file: / | ||
+ | Data records: | ||
+ | - check file-size | ||
+ | - check record delete-chain | ||
+ | - check key delete-chain | ||
+ | - check index reference | ||
+ | - check data record references index: 1 | ||
+ | - check record links | ||
+ | | ||
+ | --------- | ||
+ | |||
+ | Checking MyISAM file: / | ||
+ | Data records: | ||
+ | - check file-size | ||
+ | - check record delete-chain | ||
+ | - check key delete-chain | ||
+ | - check index reference | ||
+ | - check data record references index: 1 | ||
+ | - check record links | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | C: | ||
+ | MYI" | ||
+ | Checking MyISAM file: C: | ||
+ | Data records: | ||
+ | - check file-size | ||
+ | - check record delete-chain | ||
+ | - check key delete-chain | ||
+ | - check index reference | ||
+ | - check data record references index: 1 | ||
+ | - check record links | ||
+ | |||
+ | --------- | ||
+ | |||
+ | Checking MyISAM file: C: | ||
+ | Data records: | ||
+ | - check file-size | ||
+ | - check record delete-chain | ||
+ | - check key delete-chain | ||
+ | - check index reference | ||
+ | - check data record references index: 1 | ||
+ | - check record links | ||
+ | |||
+ | C: | ||
+ | </ | ||
+ | |||
+ | La commande myisamchk peut prendre plusieurs options. Nous détaillons ici que les principales : | ||
+ | |||
+ | ^ Option ^ Description ^ | ||
+ | | -F ou - -fast | Ne vérifie que les tables fermées | | ||
+ | | -C ou - -check-only-changed | Ne vérifie que les tables ayant subi une modification depuis la dernière vérification | | ||
+ | | -i ou - -information | Permet de montrer les statistiques concernant la vérification | | ||
+ | | -r ou - -recover | Permet de réparer une table | | ||
+ | | -a ou - -analyze | Permet d' | ||
+ | | -d ou - -description | Permet de recevoir des informations sur une table | | ||
+ | | -S ou - -sort-index | Permet de trier les index pour optimiser des requêtes | | ||
+ | |||
+ | ===mysqlcheck=== | ||
+ | |||
+ | Le programme **mysqlcheck** permet d' | ||
+ | |||
+ | Démarrez le serveur **mysqld** et saisissez la commande suivante : | ||
+ | |||
+ | < | ||
+ | [root@redhat ~]# mysqlcheck -u root -p --host=127.0.0.1 ligue1 | ||
+ | Enter password: fenestros1 | ||
+ | ligue1.equipe | ||
+ | ligue1.rencontre | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | C:\Program Files\MySQL\MySQL Server 5.6\bin> | ||
+ | Enter password: ********** | ||
+ | ligue1.equipe | ||
+ | ligue1.rencontre | ||
+ | |||
+ | C:\Program Files\MySQL\MySQL Server 5.6\bin> | ||
+ | </ | ||
+ | |||
+ | La commande mysqlcheck peut prendre plusieurs options. Nous détaillons ici que les principales : | ||
+ | |||
+ | ^ Option ^ Description ^ | ||
+ | | -F ou - -fast | Ne vérifie que les tables mal fermées | | ||
+ | | -C ou - -check-only-changed | Ne vérifie que les tables ayant subi une modification depuis la dernière vérification | | ||
+ | | -r ou - -recover | Permet de réparer une table | | ||
+ | | -a ou - -analyze | Permet d' | ||
+ | | -c ou - -check | Permet de vérifier une table. Ce'est l' | ||
+ | | -o ou - -optimize | Permet d' | ||
+ | | -A ou - -all-databases | Permet de traiter toutes les bases de données | | ||
+ | | -B ou - -databases | Permet de spécifier les bases de données à vérifier | | ||
+ | |||
+ | ====Supervision==== | ||
+ | |||
+ | ===MySQLReport=== | ||
+ | |||
+ | **mysqlreport** est un script perl qui regroupe des valeurs des principales variables de statut dans un rapport court et lisible. Pour obtenir ce script, utilisez le lien ci-dessous : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# wget hackmysql.com/ | ||
+ | --2014-02-11 13: | ||
+ | Résolution de hackmysql.com... 64.13.235.8 | ||
+ | Connexion vers hackmysql.com|64.13.235.8|: | ||
+ | requête HTTP transmise, en attente de la réponse...200 OK | ||
+ | Longueur: 38873 (38K) [application/ | ||
+ | Sauvegarde en : «mysqlreport» | ||
+ | |||
+ | 100%[==============================================================================================================================> | ||
+ | |||
+ | 2014-02-11 13:46:48 (105 KB/s) - «mysqlreport» sauvegardé [38873/ | ||
+ | |||
+ | [root@centos6 ~]# ls | ||
+ | anaconda-ks.cfg | ||
+ | [root@centos6 ~]# chmod u+x mysqlreport | ||
+ | [root@centos6 ~]# | ||
+ | </ | ||
+ | |||
+ | Le script s' | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# ./ | ||
+ | Password for database user root: | ||
+ | Use of uninitialized value $is in multiplication (*) at ./ | ||
+ | Use of uninitialized value in formline at ./ | ||
+ | Use of uninitialized value in formline at ./ | ||
+ | MySQL 5.5.33-cll-lve | ||
+ | |||
+ | __ Key _________________________________________________________________ | ||
+ | Buffer used 2.00k of | ||
+ | Current | ||
+ | Write hit 0.00% | ||
+ | Read hit 100.00% | ||
+ | |||
+ | __ Questions ___________________________________________________________ | ||
+ | Total 38 0.0/s | ||
+ | DMS 23.57k | ||
+ | -Unknown | ||
+ | Com_ | ||
+ | COM_QUIT | ||
+ | Slow 10 s | ||
+ | DMS 23.57k | ||
+ | INSERT | ||
+ | SELECT | ||
+ | REPLACE | ||
+ | DELETE | ||
+ | UPDATE | ||
+ | Com_ | ||
+ | show_variab | ||
+ | show_tables | ||
+ | show_status | ||
+ | |||
+ | __ SELECT and Sort _____________________________________________________ | ||
+ | Scan | ||
+ | Range | ||
+ | Full join | ||
+ | Range check | ||
+ | Full rng join | ||
+ | Sort scan | ||
+ | Sort range 0 0/s | ||
+ | Sort mrg pass | ||
+ | |||
+ | __ Table Locks _________________________________________________________ | ||
+ | Waited | ||
+ | Immediate | ||
+ | |||
+ | __ Tables ______________________________________________________________ | ||
+ | Open 43 of 400 %Cache: | ||
+ | Opened | ||
+ | |||
+ | __ Connections _________________________________________________________ | ||
+ | Max used 2 of 151 %Max: 1.32 | ||
+ | Total 12 0.0/s | ||
+ | |||
+ | __ Created Temp ________________________________________________________ | ||
+ | Disk table | ||
+ | Table 56 | ||
+ | File 7 0.0/s | ||
+ | |||
+ | __ Threads _____________________________________________________________ | ||
+ | Running | ||
+ | Cached | ||
+ | Created | ||
+ | Slow 0 0/s | ||
+ | |||
+ | __ Aborted _____________________________________________________________ | ||
+ | Clients | ||
+ | Connects | ||
+ | |||
+ | __ Bytes _______________________________________________________________ | ||
+ | Sent | ||
+ | Received | ||
+ | |||
+ | __ InnoDB Buffer Pool __________________________________________________ | ||
+ | Usage 9.11M of 127.98M | ||
+ | Read hit 100.00% | ||
+ | Pages | ||
+ | Free 7.61k %Total: | ||
+ | Data 582 7.11 %Drty: | ||
+ | Misc 1 0.01 | ||
+ | Latched | ||
+ | Reads | ||
+ | From file | ||
+ | Ahead Rnd | ||
+ | Ahead Sql 0/s | ||
+ | Writes | ||
+ | Flushes | ||
+ | Wait Free | ||
+ | |||
+ | __ InnoDB Lock _________________________________________________________ | ||
+ | Waits | ||
+ | Current | ||
+ | Time acquiring | ||
+ | Total 0 ms | ||
+ | Average | ||
+ | Max 0 ms | ||
+ | |||
+ | __ InnoDB Data, Pages, Rows ____________________________________________ | ||
+ | Data | ||
+ | Reads | ||
+ | Writes | ||
+ | fsync 23.68k | ||
+ | Pending | ||
+ | Reads 0 | ||
+ | Writes | ||
+ | fsync 0 | ||
+ | |||
+ | Pages | ||
+ | Created | ||
+ | Read 0 0/s | ||
+ | Written | ||
+ | |||
+ | Rows | ||
+ | Deleted | ||
+ | Inserted | ||
+ | Read | ||
+ | Updated | ||
+ | </ | ||
+ | |||
+ | <WRAP center round todo> | ||
+ | Consultez **[[http:// | ||
+ | </ | ||
+ | |||
+ | =====Sauvegardes et Replication===== | ||
+ | |||
+ | ====Sauvegardes==== | ||
+ | |||
+ | ===mysqlhotcopy=== | ||
+ | |||
+ | **mysqlhotcopy** est un script perl qui **ne fonctionne que sous Linux**. Ce script permet de prendre une copie **à chaud** d'une ou plusieurs bases de données. | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# which mysqlhotcopy | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Pour exécuter le script en sauvegardant une base vers le répertoire /tmp, saisissez la commande suivante: | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysqlhotcopy -u root -p fenestros1 ligue1 /tmp | ||
+ | Locked 3 tables in 0 seconds. | ||
+ | Flushed tables (`ligue1`.`V_EQUIPE`, | ||
+ | Copying 12 files... | ||
+ | Copying indices for 0 files... | ||
+ | Unlocked tables. | ||
+ | mysqlhotcopy copied 3 tables (12 files) in 0 seconds (0 seconds overall). | ||
+ | </ | ||
+ | |||
+ | Consultez le répertoire /tmp: | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# ls -l /tmp | grep ligue | ||
+ | drwxr-x---. 2 mysql | ||
+ | </ | ||
+ | |||
+ | En effet **mysqlhotcopy** a créé un répertoire au nom de la base de données. A l' | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# ls -l / | ||
+ | total 64 | ||
+ | -rw-rw----. 1 mysql mysql 65 22 oct. 14:33 db.opt | ||
+ | -rw-rw----. 1 mysql mysql 8818 23 oct. 09:57 equipe.frm | ||
+ | -rw-rw----. 1 mysql mysql 296 25 oct. 14:05 equipe.MYD | ||
+ | -rw-rw----. 1 mysql mysql 2048 25 oct. 14:08 equipe.MYI | ||
+ | -rw-rw----. 1 mysql mysql 301 23 oct. 09:43 equipe.TRG | ||
+ | -rw-rw----. 1 mysql mysql 8800 22 oct. 14:38 rencontre.frm | ||
+ | -rw-rw----. 1 mysql mysql 120 25 oct. 14:05 rencontre.MYD | ||
+ | -rw-rw----. 1 mysql mysql 2048 25 oct. 14:08 rencontre.MYI | ||
+ | -rw-rw----. 1 mysql mysql 607 23 oct. 09:44 rencontre.TRG | ||
+ | -rw-rw----. 1 mysql mysql 38 23 oct. 09:43 TGR_BI_EQUIPE.TRN | ||
+ | -rw-rw----. 1 mysql mysql 41 23 oct. 09:44 TGR_BU_RENCONTRE.TRN | ||
+ | -rw-rw----. 1 mysql mysql 953 23 oct. 09:58 V_EQUIPE.frm | ||
+ | </ | ||
+ | |||
+ | ===mysqldump=== | ||
+ | |||
+ | %%MySQL%% vous permet de traiter des commandes SQL se trouvant dans un fichier. Pour cela lancez %%MySQL%% de la manière suivante : | ||
+ | |||
+ | # mysql [options] database < file.sql | ||
+ | |||
+ | Toutes les commandes SQL contenues dans file.sql seront alors appliquées à la base de données spécifiée. Le fichier ne doit pas nécessairement se terminer par .sql – ce qui compte, c'est le contenu. Il faut absolument que les commandes soient délimitées par des points-virgules. Si vous le souhaitez, vous pouvez configurer un autre séparateur de commandes à l'aide de la commande DELIMITER character. Cela s' | ||
+ | |||
+ | ==Sauvegarder avec mysqldump== | ||
+ | |||
+ | Mysqldump crée une sauvegarde d'une base de données. Le fichier de sauvegarde résultant contient des commandes SQL permettant de créer des tables et d' | ||
+ | |||
+ | mysqldump [option] dbname > backupfile.sql | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Les **routines** ne sont pas sauvegardées par défaut lors de l' | ||
+ | </ | ||
+ | |||
+ | ==Restauration avec mysqldump== | ||
+ | |||
+ | Dans la pratique, vous rencontrerez souvent les fichiers *.sql comportant une sauvegarde de bases de données créée avec **%%mysqldump%%**. Pour lire ces fichiers, vous devez normalement créé la nouvelle base de données avec mysqladmin. Les deux commandes suivantes illustrent la procédure : | ||
+ | |||
+ | < | ||
+ | # mysqladmin -u root -p create dbname [Entrée] | ||
+ | Password : ********** [Entrée] | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | # mysql -u root -p dbname < backupfile.sql [Entrée] | ||
+ | Password : ********** [Entrée] | ||
+ | </ | ||
+ | |||
+ | Les sauvegardes de base de données créée avec une version récente de mysqldump comporte des commandes SQL pour activer le jeu de caractères utilisé dans le fichier de sauvegarde. Ne vous préoccupez donc pas du jeu de caractères. Cette information manque dans les sauvegardes créées avec d' | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que les sauvegardes réalisées avec les versions récentes de %%phpMyadmin%% utilisent par défaut le jeu de caractères UTF-8. | ||
+ | </ | ||
+ | |||
+ | Pour qu'une ancienne sauvegarde puisse être correctement lue, vous devez utiliser l' | ||
+ | |||
+ | Par exemple: | ||
+ | |||
+ | mysql –u –root –p –default_character_set=latin1 dbname < backup.sql | ||
+ | |||
+ | |||
+ | ===LAB #5 - Sauvegardes === | ||
+ | |||
+ | Sauvegardez l' | ||
+ | |||
+ | ====Réplication ==== | ||
+ | |||
+ | ===Présentation=== | ||
+ | |||
+ | Le réplication a lieu en générale entre une machine maître et une machine esclave. Dans notre cas, nous allons créer ultérieurement un clone de la VM utilisée jusqu' | ||
+ | |||
+ | Quand la réplication est mise en place, deux threads sont démarrés sur l' | ||
+ | |||
+ | * IO_THREAD - copie les informations des journaux binaires du maître dans son relay log, | ||
+ | * SQL-THREAD - exécute les modifications sur la ou les bases de données de l' | ||
+ | |||
+ | Un troisième thread est ouvert sur le serveur maître par l' | ||
+ | |||
+ | Un esclave ne peut avoir qu'un seul maître mais un maître peut avoir plusieurs esclaves. | ||
+ | |||
+ | Dans une réplication Maître - esclave, ceci permet d' | ||
+ | |||
+ | Dans une réplication Maître-Maître il est possible d' | ||
+ | |||
+ | * actif-passif, | ||
+ | * un des maîtres est utilisé pour les écritures/ | ||
+ | * actif-actif, | ||
+ | * les deux maîtres sont utilisés pour les écritures/ | ||
+ | |||
+ | Il existe deux types de réplications : | ||
+ | |||
+ | * SBR - Statement Based Replication, | ||
+ | * les requêtes SQL sont ré-exécutées sur l' | ||
+ | * RBR - Row Based Replication, | ||
+ | * les modifications et les valeurs des enregistrements sont répliqués. Cette méthode est plus lente à cause de la quantité de données à répliquer. | ||
+ | |||
+ | A partir de la version 5.6 de MySQL, il est possible de choisir un mode **mixed**. Le serveur va choisir la méthode approprié pour chaque cas. | ||
+ | |||
+ | Il est possible de fixer la valeur de plusieurs variable pour choisir quelles bases de données vont être répliquées : | ||
+ | |||
+ | * binlog-do-db et binlog-ignore-db sur le maître, | ||
+ | * replicate-do-db et replicate-ignore-db sur l' | ||
+ | |||
+ | Dans le premier cas cela nécessite le re-démarrage du serveur maître. Il est donc préférable d' | ||
+ | |||
+ | |||
+ | ===LAB #6 - Mise en Place de la Réplication Maître/ | ||
+ | |||
+ | ==Création du compte de réplication== | ||
+ | |||
+ | Saisissez la commande suivante pour créer l' | ||
+ | |||
+ | < | ||
+ | GRANT REPLICATION SLAVE, REPLICATION CLIENT | ||
+ | ON *.* | ||
+ | TO ' | ||
+ | IDENTIFIED BY ' | ||
+ | </ | ||
+ | |||
+ | Vous obtiendrez un résultat similaire à celui-ci : | ||
+ | |||
+ | < | ||
+ | mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT | ||
+ | -> ON *.* | ||
+ | -> TO ' | ||
+ | -> | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Dans le cas de deux machines physiques, cette commande doit être saisie sur le maître **et** l' | ||
+ | </ | ||
+ | |||
+ | Vérifiez ensuite la création de votre utilisateur **replicant** : | ||
+ | |||
+ | < | ||
+ | mysql> USE mysql; | ||
+ | Database changed | ||
+ | mysql> SELECT user, password FROM user; | ||
+ | +-----------+-------------------------------------------+ | ||
+ | | user | password | ||
+ | +-----------+-------------------------------------------+ | ||
+ | | root | *F3E048E28ED63F281CF8A403F96F5D283C8700E6 | | ||
+ | | root | | | ||
+ | | root | | | ||
+ | | | ||
+ | | | ||
+ | | user1 | *34D3B87A652E7F0D1D371C3DBF28E291705468C4 | | ||
+ | | fenestros | *00269BA49BEC800F9CCF34C20C1FD83E0236B89A | | ||
+ | | replicant | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 | | ||
+ | +-----------+-------------------------------------------+ | ||
+ | 8 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ==Création d'un clone de la VM== | ||
+ | |||
+ | Eteignez votre VM et créez deux clônes, **maitre** et **esclave** dans %%VirtualBox%% et attachez les clônes créés. | ||
+ | |||
+ | ==Configurer le maître== | ||
+ | |||
+ | Configurez l' | ||
+ | |||
+ | Lancez la VM **maitre**. | ||
+ | |||
+ | Ajoutez ensuite deux lignes dans la section **mysqld** du fichier **/ | ||
+ | |||
+ | <file text my.cnf> | ||
+ | [mysqld] | ||
+ | datadir=/ | ||
+ | socket=/ | ||
+ | user=mysql | ||
+ | #AJOUTER LA LIGNE SUIVANTE | ||
+ | server-id = 1 | ||
+ | #AJOUTER LA LIGNE SUIVANTE | ||
+ | log-bin = mysql-bin | ||
+ | # Disabling symbolic-links is recommended to prevent assorted security risks | ||
+ | symbolic-links=0 | ||
+ | |||
+ | [mysqld_safe] | ||
+ | log-error=/ | ||
+ | pid-file=/ | ||
+ | </ | ||
+ | |||
+ | Redémarrez le service **mysqld** : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# service mysqld restart | ||
+ | Arrêt de mysqld : [ OK ] | ||
+ | Démarrage de mysqld : [ OK ] | ||
+ | </ | ||
+ | |||
+ | Afin de permettre une sauvegarde complète des bases de données sur le maître, vous devez vous assurer que seulement root y a accès. Ceci est possible grâce à la directive **max_connections**. | ||
+ | |||
+ | Contrôlez d' | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysql -u root -p mysql | ||
+ | Enter password: fenestros1 | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 2 | ||
+ | Server version: 5.1.61-log Source distribution | ||
+ | |||
+ | Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +-----------------+-------+ | ||
+ | | Variable_name | ||
+ | +-----------------+-------+ | ||
+ | | max_connections | 151 | | ||
+ | +-----------------+-------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Notez la valeur et ensuite définissez-la à 0 pour n' | ||
+ | |||
+ | mysql> SET GLOBAL max_connections = 1; | ||
+ | |||
+ | Sauvegardez ensuite la totalité des bases de données sur le maître: | ||
+ | |||
+ | [root@centos6 ~]# mysqldump --user=root --password=fenestros1 --extended-insert --all-databases --master-data --event | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que **--master-data** permet à mysqldump de récupérer les données du maître concernant la réplication. | ||
+ | </ | ||
+ | |||
+ | L' | ||
+ | |||
+ | < | ||
+ | ... | ||
+ | -- | ||
+ | -- Position to start replication or point-in-time recovery from | ||
+ | -- | ||
+ | |||
+ | CHANGE MASTER TO MASTER_LOG_FILE=' | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | Re-définissez à 151 connexions la valeur de **max-connexions** et ensuite contrôlez la valeur de **max_connections**: | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysql -u root -p mysqlEnter password: | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 3 | ||
+ | Server version: 5.1.61-log Source distribution | ||
+ | |||
+ | Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> SET GLOBAL max_connections = 151; | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +-----------------+-------+ | ||
+ | | Variable_name | ||
+ | +-----------------+-------+ | ||
+ | | max_connections | 151 | | ||
+ | +-----------------+-------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ==Configurer l' | ||
+ | |||
+ | Configurez l' | ||
+ | |||
+ | Lancez la VM **esclave**. | ||
+ | |||
+ | Ajoutez ensuite les lignes dans la section **mysqld** du fichier **/ | ||
+ | |||
+ | < | ||
+ | server-id = 2 | ||
+ | log-bin = / | ||
+ | log-bin-index = / | ||
+ | log-error = / | ||
+ | relay-log = / | ||
+ | relay-log-info-file = / | ||
+ | relay-log-index = / | ||
+ | </ | ||
+ | |||
+ | Vous obtiendrez : | ||
+ | |||
+ | <file text my.cnf> | ||
+ | [mysqld] | ||
+ | datadir=/ | ||
+ | socket=/ | ||
+ | user=mysql | ||
+ | server-id = 2 | ||
+ | log-bin = / | ||
+ | log-bin-index = / | ||
+ | log-error = / | ||
+ | relay-log = / | ||
+ | relay-log-info-file = / | ||
+ | relay-log-index = / | ||
+ | # Disabling symbolic-links is recommended to prevent assorted security risks | ||
+ | symbolic-links=0 | ||
+ | |||
+ | [mysqld_safe] | ||
+ | log-error=/ | ||
+ | pid-file=/ | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Dans le cas de deux machines physiques, sur l' | ||
+ | |||
+ | # mysql --user=root --password=fenestros < / | ||
+ | </ | ||
+ | |||
+ | Créez maintenant le répertoire **/ | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mkdir / | ||
+ | [root@centos6 ~]# chown mysql:mysql / | ||
+ | </ | ||
+ | |||
+ | Définir les paramètres de l' | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysql -u root -p mysql | ||
+ | Enter password: | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 2 | ||
+ | Server version: 5.1.61 Source distribution | ||
+ | |||
+ | Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> CHANGE MASTER TO MASTER_HOST =' | ||
+ | Query OK, 0 rows affected (0.03 sec) | ||
+ | |||
+ | mysql> CHANGE MASTER TO MASTER_PORT =3306; | ||
+ | Query OK, 0 rows affected (0.01 sec) | ||
+ | |||
+ | mysql> CHANGE MASTER TO MASTER_USER =' | ||
+ | Query OK, 0 rows affected (0.01 sec) | ||
+ | |||
+ | mysql> CHANGE MASTER TO MASTER_PASSWORD =' | ||
+ | Query OK, 0 rows affected (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | N' | ||
+ | </ | ||
+ | |||
+ | Redémarrez le service mysqld : | ||
+ | |||
+ | < | ||
+ | mysql> exit | ||
+ | Bye | ||
+ | [root@centos6 ~]# service mysqld restart | ||
+ | Arrêt de mysqld : [ OK ] | ||
+ | Démarrage de mysqld : [ OK ] | ||
+ | </ | ||
+ | |||
+ | Ensuite démarrez l' | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysql -u root -p mysql | ||
+ | Enter password: | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 4 | ||
+ | Server version: 5.1.61-log Source distribution | ||
+ | |||
+ | Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> START SLAVE; | ||
+ | Query OK, 0 rows affected, 1 warning (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ==Contrôler la réplication== | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Arrêtez le pare-feu **iptables** sur le maître et l' | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# service iptables stop | ||
+ | iptables : Suppression des règles du pare-feu : [ OK ] | ||
+ | iptables : Configuration des chaînes sur la politique ACCEP[ | ||
+ | iptables : Déchargement des modules : [ OK ] | ||
+ | </ | ||
+ | \\ | ||
+ | </ | ||
+ | |||
+ | Pour visualiser le statut de la réplication sur l' | ||
+ | |||
+ | < | ||
+ | mysql> SHOW SLAVE STATUS; | ||
+ | +----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+----------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+ | ||
+ | | Slave_IO_State | ||
+ | +----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+----------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+ | ||
+ | | Waiting for master to send event | 10.192.168.78 | replicant | ||
+ | +----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+----------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Pour visualiser le statut de la réplication sur le **maître**, | ||
+ | |||
+ | < | ||
+ | mysql> SHOW MASTER STATUS; | ||
+ | +------------------+----------+--------------+------------------+ | ||
+ | | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | | ||
+ | +------------------+----------+--------------+------------------+ | ||
+ | | mysql-bin.000003 | 106 | | | | ||
+ | +------------------+----------+--------------+------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Modifiez ensuite un enregistrement dans la base **ligue1** du Maître : | ||
+ | |||
+ | < | ||
+ | mysql> use ligue1; | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | mysql> show tables; | ||
+ | +------------------+ | ||
+ | | Tables_in_ligue1 | | ||
+ | +------------------+ | ||
+ | | V_EQUIPE | ||
+ | | equipe | ||
+ | | rencontre | ||
+ | +------------------+ | ||
+ | 3 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> select * from equipe; | ||
+ | +-----------+------------------------+------------------+------------+--------+------+------------------+----------------+ | ||
+ | | id_equipe | nom | stade | ville | points | buts | entraineur | ||
+ | +-----------+------------------------+------------------+------------+--------+------+------------------+----------------+ | ||
+ | | 1 | FC Mandriva | ||
+ | | 2 | Debian AC | Yankee Stadium | ||
+ | | 3 | Vista FC | Qwest Field | Redmond | ||
+ | | 4 | Racing Club Strasbourg | La Meinau | ||
+ | +-----------+------------------------+------------------+------------+--------+------+------------------+----------------+ | ||
+ | 4 rows in set (0.04 sec) | ||
+ | |||
+ | mysql> SELECT * FROM equipe WHERE id_equipe=1; | ||
+ | +-----------+-------------+------------------+-------+--------+------+---------------+----------------+ | ||
+ | | id_equipe | nom | stade | ville | points | buts | entraineur | ||
+ | +-----------+-------------+------------------+-------+--------+------+---------------+----------------+ | ||
+ | | 1 | FC Mandriva | Parc des Princes | Paris | 3 | 3 | Ricardo GOMES | 06-56-56-56-56 | | ||
+ | +-----------+-------------+------------------+-------+--------+------+---------------+----------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> UPDATE equipe SET stade = 'La réplication fonctionne!!' | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | Rows matched: 1 Changed: 1 Warnings: 0 | ||
+ | |||
+ | mysql> SELECT * FROM equipe WHERE id_equipe=1; | ||
+ | +-----------+-------------+------------------------------+-------+--------+------+---------------+----------------+ | ||
+ | | id_equipe | nom | stade | ville | points | buts | entraineur | ||
+ | +-----------+-------------+------------------------------+-------+--------+------+---------------+----------------+ | ||
+ | | 1 | FC Mandriva | La réplication fonctionne!! | Paris | 3 | 3 | Ricardo GOMES | 06-56-56-56-56 | | ||
+ | +-----------+-------------+------------------------------+-------+--------+------+---------------+----------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Connectez-vous maintenant à mysql sur la VM **esclave** et contrôlez la réplication : | ||
+ | |||
+ | < | ||
+ | mysql> USE ligue1; | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | mysql> SELECT * FROM equipe WHERE id_equipe=1; | ||
+ | +-----------+-------------+------------------------------+-------+--------+------+---------------+----------------+ | ||
+ | | id_equipe | nom | stade | ville | points | buts | entraineur | ||
+ | +-----------+-------------+------------------------------+-------+--------+------+---------------+----------------+ | ||
+ | | 1 | FC Mandriva | La réplication fonctionne!! | Paris | 3 | 3 | Ricardo GOMES | 06-56-56-56-56 | | ||
+ | +-----------+-------------+------------------------------+-------+--------+------+---------------+----------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | =====Journalisation et Sécurité===== | ||
+ | |||
+ | ====Fichiers Logs==== | ||
+ | |||
+ | Les fichiers journaux du serveur %%MySQL%% se trouvent dans le répertoire **/ | ||
+ | |||
+ | * Le journal des erreurs (//Error log//), | ||
+ | * Le journal binaire (//Binary Log//), | ||
+ | * Le journal des requêtes lentes (//Slow Query Log//), | ||
+ | * Le journal général (//General Query log//). | ||
+ | |||
+ | ===Le Journal des Erreurs=== | ||
+ | |||
+ | Sous Red Hat et CentOS, par défaut, seul le journal des erreurs est activé par la directive suivante dans le fichier **/ | ||
+ | |||
+ | < | ||
+ | ... | ||
+ | log-error=/ | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | Sous Windows(tm), | ||
+ | |||
+ | < | ||
+ | ... | ||
+ | # Error Logging. | ||
+ | log-error=" | ||
+ | </ | ||
+ | |||
+ | ===Le Journal Binaire=== | ||
+ | |||
+ | Le journal binaire, aussi appelé **binlog**, est chargé de stocker sous format binaire toutes les requêtes qui modifient les objets de la base de données. Il est activé par l' | ||
+ | |||
+ | Le premier binlog créé est nommé **nom-fichier.000001**. Le passage au binlog suivant, dénommé **nom-fichier.000002** a lieu dans trois cas spécifiques : | ||
+ | |||
+ | * le serveur est redémarré, | ||
+ | * la taille maximale définie par l' | ||
+ | * la commande **FLUSH LOGS** est exécutée. | ||
+ | |||
+ | Pour purger les anciens binlogs il convient de : | ||
+ | |||
+ | * soit fixer la valeur de l' | ||
+ | * soit utiliser la commande **PURGE BINARY LOGS BEFORE** suivi par une date, | ||
+ | * soit utiliser la commande **PURGE BINARY LOGS TO** suivi par un numéro de journal, | ||
+ | * soit supprimer tous les fichiers et repartir d'un fichier .000001 avec la commande **RESET MASTER**. | ||
+ | |||
+ | ===Le Journal des Requêtes Lentes=== | ||
+ | |||
+ | Le journal des requêtes lentes permet d' | ||
+ | |||
+ | * FILE : les informations sont stockées dans un fichier, | ||
+ | * TABLE : les informations sont stockées dans la table, | ||
+ | * FILE,TABLE : les informations sont stockées dans un fichier **et** dans la table, | ||
+ | * NONE : pas de journalisation. | ||
+ | |||
+ | Par exemple sous Red Hat et CentOS : | ||
+ | |||
+ | < | ||
+ | [mysqld] | ||
+ | slow_query_log | ||
+ | slow_query_log_file = / | ||
+ | long-query-time = 2 | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | et sous Windows(tm) : | ||
+ | |||
+ | < | ||
+ | ... | ||
+ | slow-query-log=1 | ||
+ | slow_query_log_file=" | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | L' | ||
+ | |||
+ | < | ||
+ | mysql> SHOW GLOBAL VARIABLES LIKE ' | ||
+ | +---------------------+-------------------------+ | ||
+ | | Variable_name | ||
+ | +---------------------+-------------------------+ | ||
+ | | slow_query_log | ||
+ | | slow_query_log_file | / | ||
+ | +---------------------+-------------------------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> SHOW GLOBAL VARIABLES LIKE ' | ||
+ | +---------------------+-----------------+ | ||
+ | | Variable_name | ||
+ | +---------------------+-----------------+ | ||
+ | | slow_query_log | ||
+ | | slow_query_log_file | SERVER-slow.log | | ||
+ | +---------------------+-----------------+ | ||
+ | 2 rows in set (0.02 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Il est aussi possible de désactiver et d' | ||
+ | |||
+ | < | ||
+ | mysql> SET GLOBAL slow_query_log = ' | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> SHOW GLOBAL VARIABLES LIKE ' | ||
+ | +---------------------+-------------------------+ | ||
+ | | Variable_name | ||
+ | +---------------------+-------------------------+ | ||
+ | | slow_query_log | ||
+ | | slow_query_log_file | / | ||
+ | +---------------------+-------------------------+ | ||
+ | 2 rows in set (0.01 sec) | ||
+ | |||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> SET GLOBAL slow_query_log = ' | ||
+ | Query OK, 0 rows affected (0.01 sec) | ||
+ | |||
+ | mysql> SHOW GLOBAL VARIABLES LIKE ' | ||
+ | +---------------------+-----------------+ | ||
+ | | Variable_name | ||
+ | +---------------------+-----------------+ | ||
+ | | slow_query_log | ||
+ | | slow_query_log_file | SERVER-slow.log | | ||
+ | +---------------------+-----------------+ | ||
+ | 2 rows in set (0.01 sec) | ||
+ | mysql> | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | La valeur par défaut de **long-query-time** est **10** secondes !!. La valeur recommandée est 1 ou 2 secondes. | ||
+ | </ | ||
+ | |||
+ | ===Le Journal Général=== | ||
+ | |||
+ | Le journal général permet de consigner les requêtes valides et les informations de connexion/ | ||
+ | |||
+ | * FILE : les informations sont stockées dans un fichier, | ||
+ | * TABLE : les informations sont stockées dans la table, | ||
+ | * FILE,TABLE : les informations sont stockées dans un fichier **et** dans la table, | ||
+ | * NONE : pas de journalisation. | ||
+ | |||
+ | ==Red Hat et CentOS== | ||
+ | |||
+ | Activez le journal générale : | ||
+ | |||
+ | < | ||
+ | mysql> SET GLOBAL general_log = ' | ||
+ | Query OK, 0 rows affected (0.03 sec) | ||
+ | |||
+ | mysql> SHOW GLOBAL VARIABLES LIKE ' | ||
+ | +------------------+---------------------------+ | ||
+ | | Variable_name | ||
+ | +------------------+---------------------------+ | ||
+ | | general_log | ||
+ | | general_log_file | / | ||
+ | +------------------+---------------------------+ | ||
+ | 2 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> exit | ||
+ | Bye | ||
+ | |||
+ | [root@centos6 log]# mysql | ||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 4 | ||
+ | Server version: 5.5.33-cll-lve MySQL Community Server (GPL) by Atomicorp | ||
+ | |||
+ | Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> SHOW DATABASES; | ||
+ | +--------------------+ | ||
+ | | Database | ||
+ | +--------------------+ | ||
+ | | information_schema | | ||
+ | | mysql | | ||
+ | | performance_schema | | ||
+ | | test | | ||
+ | +--------------------+ | ||
+ | 4 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> exit | ||
+ | Bye | ||
+ | |||
+ | [root@centos6 log]# cat / | ||
+ | / | ||
+ | Tcp port: 3306 Unix socket: / | ||
+ | Time Id Command | ||
+ | 140123 15: | ||
+ | 140123 15: | ||
+ | 140123 15: | ||
+ | 4 Query select @@version_comment limit 1 | ||
+ | 140123 15: | ||
+ | 140123 15: | ||
+ | </ | ||
+ | |||
+ | En ajoutant la directive **log_output = TABLE** au fichier **/ | ||
+ | |||
+ | < | ||
+ | mysql> exit | ||
+ | Bye | ||
+ | |||
+ | [root@centos6 log]# mysql | ||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 4 | ||
+ | Server version: 5.5.33-cll-lve MySQL Community Server (GPL) by Atomicorp | ||
+ | |||
+ | Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> SHOW GLOBAL VARIABLES LIKE ' | ||
+ | +------------------+---------------------------+ | ||
+ | | Variable_name | ||
+ | +------------------+---------------------------+ | ||
+ | | general_log | ||
+ | | general_log_file | / | ||
+ | +------------------+---------------------------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> SET GLOBAL general_log = ' | ||
+ | Query OK, 0 rows affected (0.01 sec) | ||
+ | |||
+ | mysql> SHOW GLOBAL VARIABLES LIKE ' | ||
+ | +------------------+---------------------------+ | ||
+ | | Variable_name | ||
+ | +------------------+---------------------------+ | ||
+ | | general_log | ||
+ | | general_log_file | / | ||
+ | +------------------+---------------------------+ | ||
+ | 2 rows in set (0.02 sec) | ||
+ | |||
+ | mysql> SHOW DATABASES; | ||
+ | +--------------------+ | ||
+ | | Database | ||
+ | +--------------------+ | ||
+ | | information_schema | | ||
+ | | mysql | | ||
+ | | performance_schema | | ||
+ | | test | | ||
+ | +--------------------+ | ||
+ | 4 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> SELECT * FROM mysql.general_log; | ||
+ | +---------------------+---------------------------+-----------+-----------+--------------+-------------------------------------------+ | ||
+ | | event_time | ||
+ | +---------------------+---------------------------+-----------+-----------+--------------+-------------------------------------------+ | ||
+ | | 2014-01-23 16:03:11 | root[root] @ localhost [] | 4 | 0 | Query | SHOW GLOBAL VARIABLES LIKE ' | ||
+ | | 2014-01-23 16:03:19 | root[root] @ localhost [] | 4 | 0 | Query | SHOW DATABASES | ||
+ | | 2014-01-23 16:03:26 | root[root] @ localhost [] | 4 | 0 | Query | SELECT * FROM mysql.general_log | ||
+ | +---------------------+---------------------------+-----------+-----------+--------------+-------------------------------------------+ | ||
+ | 3 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> exit | ||
+ | Bye | ||
+ | |||
+ | [root@centos6 log]# cat / | ||
+ | / | ||
+ | Tcp port: 3306 Unix socket: / | ||
+ | Time Id Command | ||
+ | 140123 15: | ||
+ | 140123 15: | ||
+ | 140123 15: | ||
+ | 4 Query select @@version_comment limit 1 | ||
+ | 140123 15: | ||
+ | 140123 15: | ||
+ | / | ||
+ | Tcp port: 3306 Unix socket: / | ||
+ | Time Id Command | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que la valeur de la directive **general_log** était **OFF** après le redémarrage du serveur. | ||
+ | </ | ||
+ | |||
+ | ==Windows== | ||
+ | |||
+ | Activez le journal générale : | ||
+ | |||
+ | < | ||
+ | mysql> SET GLOBAL general_log = ' | ||
+ | Query OK, 0 rows affected (0.06 sec) | ||
+ | |||
+ | mysql> SHOW GLOBAL VARIABLES LIKE ' | ||
+ | +------------------+------------+ | ||
+ | | Variable_name | ||
+ | +------------------+------------+ | ||
+ | | general_log | ||
+ | | general_log_file | SERVER.log | | ||
+ | +------------------+------------+ | ||
+ | 2 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | exit | ||
+ | </ | ||
+ | |||
+ | Connectez-vous de nouveau à MySQL : | ||
+ | |||
+ | < | ||
+ | mysql> SHOW DATABASES; | ||
+ | +--------------------+ | ||
+ | | Database | ||
+ | +--------------------+ | ||
+ | | information_schema | | ||
+ | | ligue1 | ||
+ | | mysql | | ||
+ | | nombres | ||
+ | | performance_schema | | ||
+ | | test | | ||
+ | +--------------------+ | ||
+ | 6 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Dans une fenêtre de CMD, lancez la commande suivante : | ||
+ | |||
+ | < | ||
+ | C: | ||
+ | C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqld.exe, | ||
+ | TCP Port: 3306, Named Pipe: MySQL | ||
+ | Time Id Command | ||
+ | 160224 16: | ||
+ | 160224 16: | ||
+ | 160224 16: | ||
+ | 7 Query | ||
+ | 160224 16: | ||
+ | 160224 16: | ||
+ | |||
+ | C: | ||
+ | </ | ||
+ | |||
+ | En modifiant la directive **log_output=FILE** à **log_output = TABLE** dans le fichier **C: | ||
+ | |||
+ | < | ||
+ | Enter password: ********** | ||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 1 | ||
+ | Server version: 5.6.28-log MySQL Community Server (GPL) | ||
+ | |||
+ | Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> SHOW GLOBAL VARIABLES LIKE ' | ||
+ | +------------------+------------+ | ||
+ | | Variable_name | ||
+ | +------------------+------------+ | ||
+ | | general_log | ||
+ | | general_log_file | SERVER.log | | ||
+ | +------------------+------------+ | ||
+ | 2 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> SET GLOBAL general_log = ' | ||
+ | Query OK, 0 rows affected (0.02 sec) | ||
+ | |||
+ | mysql> SHOW DATABASES; | ||
+ | +--------------------+ | ||
+ | | Database | ||
+ | +--------------------+ | ||
+ | | information_schema | | ||
+ | | ligue1 | ||
+ | | mysql | | ||
+ | | nombres | ||
+ | | performance_schema | | ||
+ | | test | | ||
+ | +--------------------+ | ||
+ | 6 rows in set (0.03 sec) | ||
+ | |||
+ | mysql> SELECT * FROM mysql.general_log; | ||
+ | +---------------------+------------------------------+-----------+-----------+--------------+---------------------------------+ | ||
+ | | event_time | ||
+ | +---------------------+------------------------------+-----------+-----------+--------------+---------------------------------+ | ||
+ | | 2016-02-25 09:21:04 | root[root] @ localhost [::1] | 1 | 1 | Query | SHOW DATABASES | ||
+ | | 2016-02-25 09:21:14 | root[root] @ localhost [::1] | 1 | 1 | Query | SELECT * FROM mysql.general_log | | ||
+ | +---------------------+------------------------------+-----------+-----------+--------------+---------------------------------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que la valeur de la directive **general_log** était **OFF** après le redémarrage du serveur. | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====Sécurité==== | ||
+ | |||
+ | Le système de sécurité sous %%MySQL%% se repose sur des **privilèges** qui utilisent trois données: | ||
+ | |||
+ | * Le nom de l' | ||
+ | * Le mot de passe de l' | ||
+ | * Le nom de l' | ||
+ | |||
+ | Il est important de noter qu'il n'y a pas de corréspondance entre les noms d' | ||
+ | |||
+ | Les privilèges sont stockées dans cinq tables de la base **mysql**: | ||
+ | |||
+ | * **user**, | ||
+ | * La table **user** stocke les privilèges globaux des utilisateurs, | ||
+ | * **db**, | ||
+ | * La table **db** stocke quels utilisateurs peuvent se connecter à partir de quels hôtes sur quelles bases de données, | ||
+ | * **host**, | ||
+ | * Cette table est un complément de la table précédente. Dans le cas où le champ **host** est laissé en blanc dans la table db, %%MySQL%% cherchera ces informations dans la table **host**, | ||
+ | * **tables_priv**, | ||
+ | * Cette table stocke des privilèges spécifiques aux tables, | ||
+ | * **columns_priv**, | ||
+ | * Cette table stocke des privilèges spécifiques aux colonnes. | ||
+ | |||
+ | ===Privilèges d' | ||
+ | |||
+ | ^ Droit ^ Description ^ | ||
+ | | CREATE TEMPORARY TABLES | Créer des tables temporaires | | ||
+ | | CREATE USER | Créer, modifier, supprimer des utilisateurs avec les commandes CREATE, DROP et RENAME | | ||
+ | | FILE | Lire et écrire dans des fichiers sur le serveur avec les commandes SELECT ... INTO OUTFILE, LOAD DATA | | ||
+ | | GRANT OPTION | Transmettre ses privilèges à un autre utilisateur | | ||
+ | | LOCK TABLES | Verrouiller des tables | | ||
+ | | PROCESS | Voir les threads | | ||
+ | | PROXY | Activer le mode proxy | | ||
+ | | RELOAD | Réinitialiser des tables, journaux, statistiques avec les commandes FLUSH et RESET | | ||
+ | | REPLICATION CLIENT | Superviser la réplication avec les commandes SHOW MASTER STATUS, SHOW SLAVE STATUS | | ||
+ | | REPLICATION SLAVE | Récupérer les évenements du journal binaire du Maître | | ||
+ | | SHOW SCHEMAS/ | ||
+ | | SHUTDOWN | Arrêter le serveur avec la commande mysqladmin shutdown | | ||
+ | | SUPER | Exécuter les commandes CHANGE MASTER TO, KILL, SET GLOBAL etc | | ||
+ | |||
+ | ===Privilèges au Niveau des Schémas=== | ||
+ | |||
+ | ^ Droit ^ Description ^ | ||
+ | | ALTER | Modifier le schéma et les tables avec les commandes ALTER SCHEMA/ | ||
+ | | CREATE | Créer des schémas et des tables avec les commandes CREATE SCHEMA/ | ||
+ | | CREATE TEMPORARY TABLE | Créer des tables temporaires | | ||
+ | | CREATE VIEW | Créer des vues | | ||
+ | | DELETE | Effacer des enregistrements | | ||
+ | | DROP | Supprimer des schémas et des tables avec les commandes DROP SCHEMA/ | ||
+ | | EVENT | Créer des évènements dans l' | ||
+ | | GRANT OPTION | Transmettre ses privilèges à un autre utilisateur | | ||
+ | | INDEX | Créer et supprimer des index avec les commandes CREATE/DROP INDEX | | ||
+ | | INSERT | Insérer des enregistrements dans une table | | ||
+ | | LOCK TABLES | Verrouiller des tables | | ||
+ | | SELECT | Afficher des enregistrements d'une table ainsi que la structure de la table avec les commandes SELECT, DESCRIBE, SHOW CREATE TABLE | | ||
+ | | SHOW VIEW | Voir le code SQL d'une vue avec la commande SHOW CREATE VIEW | | ||
+ | | UPDATE | Modifier des enregistrements d'une table | | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Les privilèges liés aux schémas ne prennent effet que lors de la prochaine connexion à ce premier. | ||
+ | </ | ||
+ | |||
+ | ===Privilèges au Niveau des Tables=== | ||
+ | |||
+ | ^ Droit ^ Description ^ | ||
+ | | ALTER | Modifier les tables | | ||
+ | | CREATE | Créer des tables | | ||
+ | | DELETE | Effacer des enregistrements | | ||
+ | | DROP | Supprimer des tables | | ||
+ | | GRANT OPTION | Transmettre ses privilèges à un autre utilisateur | | ||
+ | | INDEX | Créer et supprimer des index | | ||
+ | | INSERT | Insérer des enregistrements dans une table | | ||
+ | | SELECT | Afficher des enregistrements d'une table ainsi que la structure de la table avec les commandes SELECT, DESCRIBE, SHOW CREATE TABLE | | ||
+ | | TRIGGER | Créer/ | ||
+ | | UPDATE | Modifier des enregistrements d'une table | | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Les privilèges liés aux tables prennent effet immédiatement. | ||
+ | </ | ||
+ | |||
+ | ===Privilèges au Niveau des Colonnes=== | ||
+ | |||
+ | ^ Droit ^ Description ^ | ||
+ | | INSERT | Insérer des enregistrements dans une table | | ||
+ | | SELECT | Afficher des enregistrements d'une table ainsi que la structure de la table avec les commandes SELECT, DESCRIBE, SHOW CREATE TABLE | | ||
+ | | UPDATE | Modifier des enregistrements d'une table | | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Les privilèges liés aux colonnes prennent effet immédiatement. | ||
+ | </ | ||
+ | |||
+ | ===Privilèges pour les Routines Stockées=== | ||
+ | |||
+ | ^ Droit ^ Description ^ | ||
+ | | CREATE ROUTINE | Créer des procédures et fonctions stockées | | ||
+ | | ALTER ROUTINE | Modifier des procédures et fonctions stockées | | ||
+ | | EXECUTE | Exécuter des procédures et fonctions stockées | | ||
+ | | GRANT OPTION | Transmettre ses privilèges à un autre utilisateur | | ||
+ | |||
+ | Lors de la création d'une routine stockées ou une vue, le créateur peut choisir si la routine ou la vue sera exécuter par la suite avec : | ||
+ | |||
+ | * INVOKER : les droits de l' | ||
+ | * DEFINIR : les droits du créateur. | ||
+ | |||
+ | Cette possibilité est donner par l' | ||
+ | |||
+ | < | ||
+ | mysql> CREATE SQL SECURITY INVOKER VIEW V_EQUIPE AS SELECT id_equipe, nom, stade, ville, points, buts, entraineur FROM equipe; | ||
+ | </ | ||
+ | |||
+ | ===Limitations des Ressources=== | ||
+ | |||
+ | ^ Droit ^ Description ^ | ||
+ | | MAX_QUERIES_PER_HOUR | Limiter le nombre de requêtes par heure | | ||
+ | | MAX_UPDATES_PER_HOUR | Limiter le nombre de UPDATE par heure | | ||
+ | | MAX_CONNECTIONS_PER_HOUR | Limiter le nombre de connexions par heure | | ||
+ | | MAX_USER_CONNECTIONS | Limiter le nombre de connexions simultanées | | ||
+ | |||
+ | ===L' | ||
+ | |||
+ | Lors de l' | ||
+ | |||
+ | * **root** | ||
+ | * l' | ||
+ | * **anonyme** | ||
+ | * l' | ||
+ | |||
+ | Pour des raisons de sécurité, l' | ||
+ | |||
+ | Procédez donc comme suit pour supprimez l' | ||
+ | |||
+ | < | ||
+ | mysql> USE mysql; | ||
+ | Database changed | ||
+ | mysql> DELETE FROM user WHERE user =''; | ||
+ | Query OK, 2 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Vérifiez que l' | ||
+ | |||
+ | < | ||
+ | mysql> SELECT user, host, password FROM user; | ||
+ | +-----------+-----------+-------------------------------------------+ | ||
+ | | user | host | password | ||
+ | +-----------+-----------+-------------------------------------------+ | ||
+ | | root | localhost | *F3E048E28ED63F281CF8A403F96F5D283C8700E6 | | ||
+ | | root | centos | ||
+ | | root | 127.0.0.1 | | | ||
+ | | user1 | localhost | *34D3B87A652E7F0D1D371C3DBF28E291705468C4 | | ||
+ | | fenestros | localhost | *00269BA49BEC800F9CCF34C20C1FD83E0236B89A | | ||
+ | | replicant | % | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 | | ||
+ | +-----------+-----------+-------------------------------------------+ | ||
+ | 6 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Pour supprimer **l' | ||
+ | |||
+ | < | ||
+ | mysql> DELETE FROM db WHERE db LIKE ' | ||
+ | Query OK, 2 rows affected (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Saisissez enfin la commande suivante pour mettre à jour les privilèges: | ||
+ | |||
+ | < | ||
+ | mysql> FLUSH PRIVILEGES; | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ===La table user=== | ||
+ | |||
+ | Visualisez la table user: | ||
+ | |||
+ | < | ||
+ | mysql> DESCRIBE user; | ||
+ | +------------------------+-----------------------------------+------+-----+---------+-------+ | ||
+ | | Field | Type | Null | Key | Default | Extra | | ||
+ | +------------------------+-----------------------------------+------+-----+---------+-------+ | ||
+ | | Host | char(60) | ||
+ | | User | char(16) | ||
+ | | Password | ||
+ | | Select_priv | ||
+ | | Insert_priv | ||
+ | | Update_priv | ||
+ | | Delete_priv | ||
+ | | Create_priv | ||
+ | | Drop_priv | ||
+ | | Reload_priv | ||
+ | | Shutdown_priv | ||
+ | | Process_priv | ||
+ | | File_priv | ||
+ | | Grant_priv | ||
+ | | References_priv | ||
+ | | Index_priv | ||
+ | | Alter_priv | ||
+ | | Show_db_priv | ||
+ | | Super_priv | ||
+ | | Create_tmp_table_priv | ||
+ | | Lock_tables_priv | ||
+ | | Execute_priv | ||
+ | | Repl_slave_priv | ||
+ | | Repl_client_priv | ||
+ | | Create_view_priv | ||
+ | | Show_view_priv | ||
+ | | Create_routine_priv | ||
+ | | Alter_routine_priv | ||
+ | | Create_user_priv | ||
+ | | Event_priv | ||
+ | | Trigger_priv | ||
+ | | Create_tablespace_priv | enum(' | ||
+ | | ssl_type | ||
+ | | ssl_cipher | ||
+ | | x509_issuer | ||
+ | | x509_subject | ||
+ | | max_questions | ||
+ | | max_updates | ||
+ | | max_connections | ||
+ | | max_user_connections | ||
+ | | plugin | ||
+ | | authentication_string | ||
+ | +------------------------+-----------------------------------+------+-----+---------+-------+ | ||
+ | 42 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Notez la longueur des champs **User** et **Host** : | ||
+ | |||
+ | ^ Champs ^ Longueur ^ | ||
+ | | User | 16 | | ||
+ | | Host | 60 | | ||
+ | |||
+ | ===Mots de Passe=== | ||
+ | |||
+ | Les mots de passe sous MySQL sont hachés avant d' | ||
+ | |||
+ | < | ||
+ | mysql> SELECT password(' | ||
+ | +-------------------------------------------+ | ||
+ | | password(' | ||
+ | +-------------------------------------------+ | ||
+ | | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | ||
+ | +-------------------------------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SELECT old_password(' | ||
+ | +----------------------+ | ||
+ | | old_password(' | ||
+ | +----------------------+ | ||
+ | | 67457e226a1a15bd | ||
+ | +----------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | MySQL utilise maintenant des Plug-ins d' | ||
+ | |||
+ | < | ||
+ | mysql> SHOW PLUGINS; | ||
+ | +--------------------------+----------+--------------------+---------+---------+ | ||
+ | | Name | Status | ||
+ | +--------------------------+----------+--------------------+---------+---------+ | ||
+ | | binlog | ||
+ | | mysql_native_password | ||
+ | | mysql_old_password | ||
+ | | MyISAM | ||
+ | | CSV | ACTIVE | ||
+ | | MRG_MYISAM | ||
+ | | MEMORY | ||
+ | | ARCHIVE | ||
+ | | InnoDB | ||
+ | | INNODB_TRX | ||
+ | | INNODB_LOCKS | ||
+ | | INNODB_LOCK_WAITS | ||
+ | | INNODB_CMP | ||
+ | | INNODB_CMP_RESET | ||
+ | | INNODB_CMPMEM | ||
+ | | INNODB_CMPMEM_RESET | ||
+ | | INNODB_BUFFER_PAGE | ||
+ | | INNODB_BUFFER_PAGE_LRU | ||
+ | | INNODB_BUFFER_POOL_STATS | ACTIVE | ||
+ | | PERFORMANCE_SCHEMA | ||
+ | | FEDERATED | ||
+ | | BLACKHOLE | ||
+ | | partition | ||
+ | +--------------------------+----------+--------------------+---------+---------+ | ||
+ | 23 rows in set (0.02 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Le plug-in **mysql_old_password** implémente l' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===LAB #7 - Perte du Mot de Passe de l' | ||
+ | |||
+ | Dans le cas de la perte du mot de passe de l' | ||
+ | |||
+ | Arrêtez le serveur MySQL puis relancez le serveur MySQL manuellement : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# / | ||
+ | [1] 3223 | ||
+ | [root@centos6 ~]# 140126 13:13:41 [Note] libgovernor.so not found | ||
+ | 140126 13:13:41 [Warning] Although a path was specified for the --log-slow-queries option, log tables are used. To enable logging to files use the --log-output=file option. | ||
+ | 140126 13:13:41 [Note] Plugin ' | ||
+ | 140126 13:13:41 InnoDB: The InnoDB memory heap is disabled | ||
+ | 140126 13:13:41 InnoDB: Mutexes and rw_locks use GCC atomic builtins | ||
+ | 140126 13:13:41 InnoDB: Compressed tables use zlib 1.2.3 | ||
+ | 140126 13:13:41 InnoDB: Using Linux native AIO | ||
+ | 140126 13:13:41 InnoDB: Initializing buffer pool, size = 128.0M | ||
+ | 140126 13:13:41 InnoDB: Completed initialization of buffer pool | ||
+ | 140126 13:13:41 InnoDB: highest supported file format is Barracuda. | ||
+ | 140126 13: | ||
+ | 140126 13:13:42 InnoDB: 5.5.33 started; log sequence number 1597308 | ||
+ | / | ||
+ | 140126 13:13:42 [ERROR] Could not use / | ||
+ | 140126 13:13:42 [Note] / | ||
+ | Version: ' | ||
+ | </ | ||
+ | |||
+ | Appuyez sur la touche < | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysql --socket=/ | ||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 1 | ||
+ | Server version: 5.5.33-cll-lve MySQL Community Server (GPL) by Atomicorp | ||
+ | |||
+ | Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Definissez de nouveau le mot de passe de l' | ||
+ | |||
+ | < | ||
+ | mysql> FLUSH PRIVILEGES; | ||
+ | Query OK, 0 rows affected (0.01 sec) | ||
+ | |||
+ | mysql> SET PASSWORD FOR ' | ||
+ | Query OK, 0 rows affected (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Sortez de MySQL et testez la connextion avec le nouveau mot de passe : | ||
+ | |||
+ | < | ||
+ | exit | ||
+ | Bye | ||
+ | [root@centos6 ~]# mysql -u root -p --socket=/ | ||
+ | Enter password: | ||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 2 | ||
+ | Server version: 5.5.33-cll-lve MySQL Community Server (GPL) by Atomicorp | ||
+ | |||
+ | Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round todo> | ||
+ | Expliquez le concept du socket / | ||
+ | </ | ||
+ | |||
+ | Tuez maintenant le processus de mysqld et relancez le serveur normalement : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# ps aux | grep mysqld | ||
+ | mysql | ||
+ | root 3293 3.0 0.0 | ||
+ | [root@centos6 ~]# kill -9 3223 | ||
+ | [root@centos6 ~]# service mysqld start | ||
+ | Démarrage de mysqld : | ||
+ | [1]+ Processus arrêté | ||
+ | </ | ||
+ | |||
+ | Veuillez noter que toutes les requêtes saisies sont journalisées dans votre fichier historique de MySQL. Par défaut ce fichier est **~/ | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# cat .mysql_history | ||
+ | SHOW VARIABLES LIKE ' | ||
+ | SHOW databases; | ||
+ | use mysql; | ||
+ | SHOW tables; | ||
+ | SHOW TABLE STATUS LIKE ' | ||
+ | SHOW TABLE STATUS LIKE ' | ||
+ | SHOW TABLE STATUS LIKE ' | ||
+ | USE mysql; | ||
+ | SHOW TABLE STATUS LIKE ' | ||
+ | use information_shema | ||
+ | show databases; | ||
+ | use information_schema | ||
+ | show tables; | ||
+ | SHOW MASTER STATUS\G | ||
+ | SHOW VARIABLES LIKE ' | ||
+ | SHOW GLOBAL VARIABLES LIKE ' | ||
+ | SET GLOBAL slow-query-log = ' | ||
+ | SHOW GLOBAL VARIABLES LIKE ' | ||
+ | SET GLOBAL slow_query_log = ' | ||
+ | SHOW GLOBAL VARIABLES LIKE ' | ||
+ | SET GLOBAL general_log = ' | ||
+ | SHOW GLOBAL VARIABLES LIKE ' | ||
+ | SHOW DATABASES; | ||
+ | USE mysql; | ||
+ | SELECT * FROM general_log; | ||
+ | SHOW DATABASES; | ||
+ | SELECT * FROM general_log; | ||
+ | SELECT * FROM mysql.general_log; | ||
+ | SHOW GLOBAL VARIABLES LIKE ' | ||
+ | SET GLOBAL general_log = ' | ||
+ | SHOW GLOBAL VARIABLES LIKE ' | ||
+ | SHOW DATABASES; | ||
+ | SELECT * FROM mysql.general_log; | ||
+ | use mysql; | ||
+ | describe user; | ||
+ | FLUSH PRIVILEGES; | ||
+ | SET PASSWORD FOR ' | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Il convient donc de protéger ce fichier ! Il est pratique courante de créer un lien symbolique vers /dev/null : | ||
+ | |||
+ | # ls -s /dev/null $HOME/ | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===La connexion=== | ||
+ | |||
+ | Lors de la connexion d'un utilisateur, | ||
+ | |||
+ | La table suivante: | ||
+ | |||
+ | < | ||
+ | +-----------+-----------+-------------------------------------------+ | ||
+ | | user | host | password | ||
+ | +-----------+-----------+-------------------------------------------+ | ||
+ | | root | localhost | *F3E048E28ED63F281CF8A403F96F5D283C8700E6 | | ||
+ | | root | centos | ||
+ | | root | 127.0.0.1 | | | ||
+ | | user1 | localhost | *34D3B87A652E7F0D1D371C3DBF28E291705468C4 | | ||
+ | | fenestros | localhost | *00269BA49BEC800F9CCF34C20C1FD83E0236B89A | | ||
+ | | replicant | % | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 | | ||
+ | +-----------+-----------+-------------------------------------------+ | ||
+ | </ | ||
+ | |||
+ | est vue par %%MySQL%% ainsi: | ||
+ | |||
+ | < | ||
+ | +-----------+-----------+-------------------------------------------+ | ||
+ | | user | host | password | ||
+ | +-----------+-----------+-------------------------------------------+ | ||
+ | | root | 127.0.0.1 | | | ||
+ | | root | localhost | *F3E048E28ED63F281CF8A403F96F5D283C8700E6 | | ||
+ | | user1 | localhost | *34D3B87A652E7F0D1D371C3DBF28E291705468C4 | | ||
+ | | fenestros | localhost | *00269BA49BEC800F9CCF34C20C1FD83E0236B89A | | ||
+ | | root | centos | ||
+ | | replicant | % | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 | | ||
+ | +-----------+-----------+-------------------------------------------+ | ||
+ | </ | ||
+ | |||
+ | Le symbole **%** indique tous les hôtes. | ||
+ | |||
+ | Prenons le cas d'une connexion de root à partir du localhost. Dans ce cas, %%MySQL%% commence par rechercher l' | ||
+ | |||
+ | < | ||
+ | ... | ||
+ | | root | localhost | *F3E048E28ED63F281CF8A403F96F5D283C8700E6 | | ||
+ | | user1 | localhost | *34D3B87A652E7F0D1D371C3DBF28E291705468C4 | | ||
+ | | fenestros | localhost | *00269BA49BEC800F9CCF34C20C1FD83E0236B89A | | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | %%MySQL%% recherche ensuite le nom de l' | ||
+ | |||
+ | < | ||
+ | ... | ||
+ | | root | localhost | *F3E048E28ED63F281CF8A403F96F5D283C8700E6 | | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | %%MySQL%% compare ensuite le mot de passe saisi par root avec le mot de passe crypté dans la table. Dans le cas où les deux mots de passe sont équivalents, | ||
+ | |||
+ | ===La commande GRANT=== | ||
+ | |||
+ | La commande **GRANT** permet de: | ||
+ | |||
+ | * créer un utilisateur, | ||
+ | * accorder des privilèges à cet utilisateur. | ||
+ | |||
+ | La commande prend la forme suivante: | ||
+ | |||
+ | mysql> GRANT privileges [columns] ON objet TO utilisateur [IDENTIFIED BY ' | ||
+ | |||
+ | où: | ||
+ | |||
+ | * **privilèges** est une liste de privilèges séparés par des virgules, | ||
+ | * les privilèges sont **all, all privileges, alter, create, create temporary tables, delete, drop, execute, file, index, insert, lock tables, process, references, reload, select, show databases, shutdown, super, update, usage, create user, create view, show view, create routine, alter routine**, | ||
+ | * dans le cas où le privilège est **usage**, l' | ||
+ | * **[columns]** est optionnel. Cette directive permet de spécifier que les privilèges portent sur une ou plusieurs colonnes, séparées par des virgules, de la table spécifiée par **objet**, | ||
+ | * **objet** est une base ou une table | ||
+ | * **WITH GRANT OPTION** donne le droit à l' | ||
+ | |||
+ | Saisissez la commande suivante pour créer un nouvel utilisateur: | ||
+ | |||
+ | mysql> GRANT usage ON *.* TO user2@localhost IDENTIFIED BY ' | ||
+ | |||
+ | <WRAP center round important> | ||
+ | La **portée des droits** ***.*** implique tous les objets. La portée des droits peut également être de type **schema.***, | ||
+ | </ | ||
+ | |||
+ | Vous pouvez aussi utiliser ***** qui implique tous les objets de la base courante dans le cas où la commande **USE** a été utilisée. | ||
+ | |||
+ | Vérifiez que l' | ||
+ | |||
+ | < | ||
+ | mysql> SELECT host, user, password FROM user; | ||
+ | +-----------+-----------+-------------------------------------------+ | ||
+ | | host | user | password | ||
+ | +-----------+-----------+-------------------------------------------+ | ||
+ | | localhost | root | *F3E048E28ED63F281CF8A403F96F5D283C8700E6 | | ||
+ | | centos | ||
+ | | 127.0.0.1 | root | | | ||
+ | | localhost | user2 | *1F48A8CB9F3BAAE4504A9A4549B0AA290BD4E27B | | ||
+ | | localhost | user1 | *34D3B87A652E7F0D1D371C3DBF28E291705468C4 | | ||
+ | | localhost | fenestros | *00269BA49BEC800F9CCF34C20C1FD83E0236B89A | | ||
+ | | % | replicant | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 | | ||
+ | +-----------+-----------+-------------------------------------------+ | ||
+ | 7 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Connectez-vous maintenant à %%MySQL%% avec le compte d' | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysql -u user2 -p | ||
+ | Enter password: | ||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 4 | ||
+ | Server version: 5.1.61-log Source distribution | ||
+ | |||
+ | Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> SHOW databases; | ||
+ | +--------------------+ | ||
+ | | Database | ||
+ | +--------------------+ | ||
+ | | information_schema | | ||
+ | +--------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> USE lique1; | ||
+ | ERROR 1044 (42000): Access denied for user ' | ||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Notez que l' | ||
+ | |||
+ | ===La commande REVOKE=== | ||
+ | |||
+ | La commande REVOKE est utilisée pour retirer les privilèges. La commande REVOKE ne permet **pas** de supprimer l' | ||
+ | |||
+ | La commande REVOKE prend la forme suivante: | ||
+ | |||
+ | mysql> REVOKE privileges [columns] ON objet FROM utilisateur; | ||
+ | |||
+ | Par exemple pour retirer les privilèges de l' | ||
+ | |||
+ | mysql> REVOKE all ON *.* FROM user2@localhost; | ||
+ | |||
+ | Notez l' | ||
+ | |||
+ | ==Modifier le mot de passe d'un utilisateur== | ||
+ | |||
+ | Pour modifier le mot de passe d'un utilisateur, | ||
+ | |||
+ | En utilisant **SET PASSWORD** : | ||
+ | |||
+ | mysql> SET PASSWORD FOR utilisateur@host=PASSWORD(' | ||
+ | |||
+ | Notez l' | ||
+ | |||
+ | En utilisant **GRANT** : | ||
+ | |||
+ | mysql> GRANT usage ON *.* TO utilisateur@host IDENTIFIED BY ' | ||
+ | |||
+ | En utilisant **UPDATE USER** : | ||
+ | |||
+ | mysql> UPDATE user SET PASSWORD=PASSWORD(' | ||
+ | |||
+ | |||
+ | <WRAP center round important> | ||
+ | N' | ||
+ | </ | ||
+ | |||
+ | <WRAP center round todo> | ||
+ | Utilisez **SET PASSWORD** et **UPDATE USER** à tour de rôle pour modifier le mot de passe de l' | ||
+ | </ | ||
+ | |||
+ | ===Sécuriser l' | ||
+ | |||
+ | Pour vérifier si votre instance de %%MySQL%% peut fonctionner avec **openssl**, | ||
+ | |||
+ | < | ||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +---------------+-------+ | ||
+ | | Variable_name | Value | | ||
+ | +---------------+-------+ | ||
+ | | have_openssl | ||
+ | +---------------+-------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | </ | ||
+ | |||
+ | votre instance de %%MySQL%% peut accepter des connexions sécurisées. | ||
+ | |||
+ | Si la variable **have_openssl** indique **DISABLED**, | ||
+ | |||
+ | < | ||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +---------------+----------+ | ||
+ | | Variable_name | Value | | ||
+ | +---------------+----------+ | ||
+ | | have_openssl | ||
+ | +---------------+----------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ==Openssl== | ||
+ | |||
+ | Lors de l' | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# ls -lR /etc/pki | ||
+ | /etc/pki: | ||
+ | total 24 | ||
+ | drwxr-xr-x. 6 root root 4096 23 août 06:55 CA | ||
+ | drwxr-xr-x. 2 root root 4096 25 juin 11:30 java | ||
+ | drwxr-xr-x. 2 root root 4096 19 oct. 14:32 nssdb | ||
+ | drwxr-xr-x. 2 root root 4096 19 oct. 14:28 rpm-gpg | ||
+ | drwx------. 2 root root 4096 22 juin 16:27 rsyslog | ||
+ | drwxr-xr-x. 5 root root 4096 19 oct. 14:31 tls | ||
+ | |||
+ | / | ||
+ | total 16 | ||
+ | drwxr-xr-x. 2 root root 4096 23 août 06:55 certs | ||
+ | drwxr-xr-x. 2 root root 4096 23 août 06:55 crl | ||
+ | drwxr-xr-x. 2 root root 4096 23 août 06:55 newcerts | ||
+ | drwx------. 2 root root 4096 23 août 06:55 private | ||
+ | |||
+ | / | ||
+ | total 0 | ||
+ | |||
+ | / | ||
+ | total 0 | ||
+ | |||
+ | / | ||
+ | total 0 | ||
+ | |||
+ | / | ||
+ | total 0 | ||
+ | |||
+ | / | ||
+ | total 128 | ||
+ | -rw-r--r--. 1 root root 130601 | ||
+ | |||
+ | / | ||
+ | total 128 | ||
+ | -rw-r--r--. 1 root root 65536 12 janv. 2010 cert8.db | ||
+ | -rw-r--r--. 1 root root 9216 12 janv. 2010 cert9.db | ||
+ | -rw-r--r--. 1 root root 16384 12 janv. 2010 key3.db | ||
+ | -rw-r--r--. 1 root root 11264 12 janv. 2010 key4.db | ||
+ | -rw-r--r--. 1 root root 451 25 juin 09:43 pkcs11.txt | ||
+ | -rw-r--r--. 1 root root 451 29 févr. | ||
+ | -rw-r--r--. 1 root root 16384 12 janv. 2010 secmod.db | ||
+ | |||
+ | / | ||
+ | total 16 | ||
+ | -rw-r--r--. 1 root root 1706 26 juin 11:29 RPM-GPG-KEY-CentOS-6 | ||
+ | -rw-r--r--. 1 root root 1730 26 juin 11:29 RPM-GPG-KEY-CentOS-Debug-6 | ||
+ | -rw-r--r--. 1 root root 1730 26 juin 11:29 RPM-GPG-KEY-CentOS-Security-6 | ||
+ | -rw-r--r--. 1 root root 1734 26 juin 11:29 RPM-GPG-KEY-CentOS-Testing-6 | ||
+ | |||
+ | / | ||
+ | total 0 | ||
+ | |||
+ | / | ||
+ | total 24 | ||
+ | lrwxrwxrwx. 1 root root 19 25 juin 11:30 cert.pem -> certs/ | ||
+ | drwxr-xr-x. 2 root root 4096 19 oct. 14:31 certs | ||
+ | drwxr-xr-x. 2 root root 4096 19 oct. 14:31 misc | ||
+ | -rw-r--r--. 1 root root 10906 15 août 18:25 openssl.cnf | ||
+ | drwxr-xr-x. 2 root root 4096 23 août 06:54 private | ||
+ | |||
+ | / | ||
+ | total 1204 | ||
+ | -rw-r--r--. 1 root root 571450 | ||
+ | -rw-r--r--. 1 root root 651083 | ||
+ | -rwxr-xr-x. 1 root root 610 23 août 06:55 make-dummy-cert | ||
+ | -rw-r--r--. 1 root root 2242 23 août 06:55 Makefile | ||
+ | |||
+ | / | ||
+ | total 24 | ||
+ | -rwxr-xr-x. 1 root root 5178 23 août 06:54 CA | ||
+ | -rwxr-xr-x. 1 root root 119 23 août 06:54 c_hash | ||
+ | -rwxr-xr-x. 1 root root 152 23 août 06:54 c_info | ||
+ | -rwxr-xr-x. 1 root root 112 23 août 06:54 c_issuer | ||
+ | -rwxr-xr-x. 1 root root 110 23 août 06:54 c_name | ||
+ | |||
+ | / | ||
+ | total 0 | ||
+ | </ | ||
+ | |||
+ | ==Activer SSL== | ||
+ | |||
+ | Pour configurer mysql pour SSL, il convient d' | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# service mysqld stop | ||
+ | Arrêt de mysqld : [ OK ] | ||
+ | </ | ||
+ | |||
+ | Dans cet exemple, vous allez créer vos propres clefs et certificats. Commencez par créer une cléf : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mkdir / | ||
+ | [root@centos6 ~]# cd / | ||
+ | [root@centos6 mysql]# openssl genrsa 2048 > ca-key.pem | ||
+ | Generating RSA private key, 2048 bit long modulus | ||
+ | ..................................+++ | ||
+ | ................+++ | ||
+ | e is 65537 (0x10001) | ||
+ | </ | ||
+ | |||
+ | Créez ensuite le fichier ca-cert.pem : | ||
+ | |||
+ | < | ||
+ | [root@centos6 mysql]# openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem | ||
+ | You are about to be asked to enter information that will be incorporated | ||
+ | into your certificate request. | ||
+ | What you are about to enter is what is called a Distinguished Name or a DN. | ||
+ | There are quite a few fields but you can leave some blank | ||
+ | For some fields there will be a default value, | ||
+ | If you enter ' | ||
+ | ----- | ||
+ | Country Name (2 letter code) [XX]:FR | ||
+ | State or Province Name (full name) []:VAR | ||
+ | Locality Name (eg, city) [Default City]: | ||
+ | Organization Name (eg, company) [Default Company Ltd]:Linux E-Learning | ||
+ | Organizational Unit Name (eg, section) []:Training | ||
+ | Common Name (eg, your name or your server' | ||
+ | Email Address []: | ||
+ | </ | ||
+ | |||
+ | Créer ensuite le certificat du serveur : | ||
+ | |||
+ | < | ||
+ | [root@centos6 mysql]# openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem | ||
+ | Generating a 2048 bit RSA private key | ||
+ | ......+++ | ||
+ | ........................................+++ | ||
+ | writing new private key to ' | ||
+ | ----- | ||
+ | You are about to be asked to enter information that will be incorporated | ||
+ | into your certificate request. | ||
+ | What you are about to enter is what is called a Distinguished Name or a DN. | ||
+ | There are quite a few fields but you can leave some blank | ||
+ | For some fields there will be a default value, | ||
+ | If you enter ' | ||
+ | ----- | ||
+ | Country Name (2 letter code) [XX]:FR | ||
+ | State or Province Name (full name) []:VAR | ||
+ | Locality Name (eg, city) [Default City]: | ||
+ | Organization Name (eg, company) [Default Company Ltd]:Linux E-Learning | ||
+ | Organizational Unit Name (eg, section) []:Training | ||
+ | Common Name (eg, your name or your server' | ||
+ | Email Address []: | ||
+ | |||
+ | Please enter the following ' | ||
+ | to be sent with your certificate request | ||
+ | A challenge password []: | ||
+ | An optional company name []: | ||
+ | |||
+ | [root@centos6 mysql]# openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem | ||
+ | Signature ok | ||
+ | subject=/ | ||
+ | Getting CA Private Key | ||
+ | </ | ||
+ | |||
+ | Créer maintenant le certificat du client: | ||
+ | |||
+ | < | ||
+ | [root@centos6 mysql]# openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem | ||
+ | Generating a 2048 bit RSA private key | ||
+ | ..............................+++ | ||
+ | ...+++ | ||
+ | writing new private key to ' | ||
+ | ----- | ||
+ | You are about to be asked to enter information that will be incorporated | ||
+ | into your certificate request. | ||
+ | What you are about to enter is what is called a Distinguished Name or a DN. | ||
+ | There are quite a few fields but you can leave some blank | ||
+ | For some fields there will be a default value, | ||
+ | If you enter ' | ||
+ | ----- | ||
+ | Country Name (2 letter code) [XX]:FR | ||
+ | State or Province Name (full name) []:VAR | ||
+ | Locality Name (eg, city) [Default City]: | ||
+ | Organization Name (eg, company) [Default Company Ltd]:Linux E-Learning | ||
+ | Organizational Unit Name (eg, section) []:TRaining | ||
+ | Common Name (eg, your name or your server' | ||
+ | Email Address []: | ||
+ | |||
+ | Please enter the following ' | ||
+ | to be sent with your certificate request | ||
+ | A challenge password []: | ||
+ | An optional company name []: | ||
+ | |||
+ | [root@centos6 mysql]# openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem | ||
+ | Signature ok | ||
+ | subject=/ | ||
+ | Getting CA Private Key | ||
+ | </ | ||
+ | |||
+ | Modifiez votre fichier my.cnf : | ||
+ | |||
+ | <file text my.cnf> | ||
+ | [mysqld] | ||
+ | datadir=/ | ||
+ | socket=/ | ||
+ | user=mysql | ||
+ | server-id = 1 | ||
+ | log-bin = mysql-bin | ||
+ | log=/ | ||
+ | # Disabling symbolic-links is recommended to prevent assorted security risks | ||
+ | symbolic-links=0 | ||
+ | |||
+ | ssl-ca=/ | ||
+ | ssl-cert=/ | ||
+ | ssl-key=/ | ||
+ | |||
+ | [client] | ||
+ | ssl-ca=/ | ||
+ | ssl-cert=/ | ||
+ | ssl-key=/ | ||
+ | |||
+ | [mysqld_safe] | ||
+ | log-error=/ | ||
+ | pid-file=/ | ||
+ | </ | ||
+ | |||
+ | Démarrez votre serveur mysql : | ||
+ | |||
+ | < | ||
+ | [root@centos6 mysql]# service mysqld start | ||
+ | Démarrage de MySQL : | ||
+ | </ | ||
+ | |||
+ | Vérifiez que %%MySQL%% fonctionne en mode SSL : | ||
+ | |||
+ | < | ||
+ | mysql> show status like ' | ||
+ | +---------------+--------------------+ | ||
+ | | Variable_name | Value | | ||
+ | +---------------+--------------------+ | ||
+ | | Ssl_cipher | ||
+ | +---------------+--------------------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Supprimez votre utilisateur user2: | ||
+ | |||
+ | < | ||
+ | mysql> USE mysql; | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | mysql> DELETE FROM user WHERE User=' | ||
+ | Query OK, 1 row affected (0.02 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Contrôlez que l' | ||
+ | |||
+ | < | ||
+ | mysql> SELECT host, user, password FROM user; | ||
+ | +----------------------+-----------+-------------------------------------------+ | ||
+ | | host | user | password | ||
+ | +----------------------+-----------+-------------------------------------------+ | ||
+ | | localhost | ||
+ | | centos.fenestros.loc | root | | | ||
+ | | 127.0.0.1 | ||
+ | | ::1 | root | | | ||
+ | | localhost | ||
+ | | localhost | ||
+ | | % | replicant | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 | | ||
+ | +----------------------+-----------+-------------------------------------------+ | ||
+ | 8 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Créez maintenant votre utilisateur **user2** afin que celui-ci se connecte en utilisant SSL: | ||
+ | |||
+ | < | ||
+ | mysql> GRANT usage on *.* TO ' | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Contrôlez que l' | ||
+ | |||
+ | < | ||
+ | mysql> SELECT host, user, password FROM user; | ||
+ | +----------------------+-----------+-------------------------------------------+ | ||
+ | | host | user | password | ||
+ | +----------------------+-----------+-------------------------------------------+ | ||
+ | | localhost | ||
+ | | centos.fenestros.loc | root | | | ||
+ | | 127.0.0.1 | ||
+ | | ::1 | root | | | ||
+ | | % | user2 | ||
+ | | localhost | ||
+ | | localhost | ||
+ | | % | replicant | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 | | ||
+ | +----------------------+-----------+-------------------------------------------+ | ||
+ | 8 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Donnez à user2 un mot de passe: | ||
+ | |||
+ | < | ||
+ | mysql> SET PASSWORD FOR ' | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Contrôlez que le mot de passe a été ajouté: | ||
+ | |||
+ | < | ||
+ | mysql> SELECT host, user, password FROM user; | ||
+ | +----------------------+-----------+-------------------------------------------+ | ||
+ | | host | user | password | ||
+ | +----------------------+-----------+-------------------------------------------+ | ||
+ | | localhost | ||
+ | | centos.fenestros.loc | root | | | ||
+ | | 127.0.0.1 | ||
+ | | ::1 | root | | | ||
+ | | % | user2 | *9296FFD029BFAE29EDDC1E57E53F4A8E555895B8 | | ||
+ | | localhost | ||
+ | | localhost | ||
+ | | % | replicant | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 | | ||
+ | +----------------------+-----------+-------------------------------------------+ | ||
+ | 8 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Saisissez enfin la commande suivante pour mettre à jour les privilèges: | ||
+ | |||
+ | < | ||
+ | mysql> FLUSH PRIVILEGES; | ||
+ | Query OK, 0 rows affected (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Connectez-vous maintenant en utilisant le compte d' | ||
+ | |||
+ | < | ||
+ | [root@redhat ~]# mysql -u user2 -p | ||
+ | Enter password: | ||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 3 | ||
+ | Server version: 5.0.45-log Source distribution | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | =====Optimisation===== | ||
+ | |||
+ | ====Matériel==== | ||
+ | |||
+ | ===Processeur=== | ||
+ | |||
+ | La vitesse d'un processeur est la caractéristique la plus importante. Il n'est pas possible de paralléliser une requête sur plusieurs processeurs. Pour cette raison, une requête occupe un processeur à la fois. Prenons le cas d'un serveur esclave dans le contexte d'une replication. Toutes les requêtes de replication passeront par un seul processeur, rendant les autres processeurs éventuels inutiles. | ||
+ | |||
+ | ===Mémoire=== | ||
+ | |||
+ | La mémoire est un facteur critique pour le serveur MySQL. La donnée la plus importante est la quantité de données consultées. Prenons le cas d'une base de données de 20Go où seules les données de la dernière semaine sont consultées. Si ces données ne représentent que 1Go, un serveur muni de 2Go suffira largement. | ||
+ | |||
+ | ===Disque Dur=== | ||
+ | |||
+ | Les performances d'un disque dur se mesurent avec deux paramètres, | ||
+ | |||
+ | ====Système d' | ||
+ | |||
+ | MySQL est disponible pour Windows(tm), | ||
+ | |||
+ | ====Cache de Requêtes==== | ||
+ | |||
+ | Le cache des requêtes est utilisé par MySQL lors des requêtes de type SELECT. Le cache est utile dans le cas où la majorité des requêtes sont de type lecture. Lors d'un SELECT, MySQL vérifie si la requête est déjà dans le cache. Cette vérification est faite pour **toutes** les requêtes, mêmes celles qui sont **impropres**. Il ne faut donc **pas** activer le cache quand : | ||
+ | |||
+ | * les écritures sont nombreuses, | ||
+ | * les lectures ne sont pas répétées, | ||
+ | * le requêtes sont en grande partie **impropre**. | ||
+ | |||
+ | L' | ||
+ | |||
+ | < | ||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +------------------+-------+ | ||
+ | | Variable_name | ||
+ | +------------------+-------+ | ||
+ | | query_cache_type | ON | | ||
+ | +------------------+-------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Cette option peut prendre trois valeurs : | ||
+ | |||
+ | * **ON** : le serveur essaie de mettre en cache toutes les requêtes SELECT sauf celles comportant la phrase SQL_NO_CACHE, | ||
+ | * **OFF** : aucune requête n'est mise en cache, | ||
+ | * **DEMAND** : le serveur essaie de mettre en cache toutes les requêtes SELECT comportant la phrase SQL_CACHE. | ||
+ | |||
+ | ===Exclusions=== | ||
+ | |||
+ | Seules les requêtes dites déterministes peuvent être mises en cache. Par exemple, une requête de type SELECT * FROM table donnera toujours le même résultat tant que la table n'est pas modifiée. Cette requête peut être mise dans le cache. Par contre la requête SELECT CURRENT_TIMESTAMP() est non-déterministe. Par conséquent, | ||
+ | |||
+ | ===Requêtes=== | ||
+ | |||
+ | MySQL recherche dans le cache chaque fois qu'il y a une requête SELECT. MySQL est sensible à la case. Pour cette raison, MySQL considère que les trois requêtes suivantes sont différentes : | ||
+ | |||
+ | * SELECT prenom,nom FROM familles, | ||
+ | * select prenom,nom FROM familles, | ||
+ | * SELECT nom,prenom FROM familles. | ||
+ | |||
+ | ===Invalidations=== | ||
+ | |||
+ | Le serveur MySQL met à jour automatiquement le contenu du cache. Lors d'une modification d'une table au niveau de sa structure ou bien au niveau de ses données, le serveur MySQL cherche l' | ||
+ | |||
+ | ===Effacements=== | ||
+ | |||
+ | Dans le cas où le cache n'est pas suffisant pour stocker une requête, MySQL procède a un effacement de l' | ||
+ | |||
+ | ===Fragmentation=== | ||
+ | |||
+ | MySQL divise le cache en blocs mémoire d'une taille égale. Quand une requête est mise en cache, le serveur MySQL ne connaît pas à l' | ||
+ | |||
+ | ===Paramètres=== | ||
+ | |||
+ | Les options associées avec le cache sont : | ||
+ | |||
+ | ^ Option ^ Descripton ^ | ||
+ | | query_cache_size | La taille de la mémoire dédiée au cache. La mémoire est affectée par multiples de 1 024 octets. Dans la pratique il ne faut pas dépasser les 256 Mo. | | ||
+ | | query_cache_limit | La taille maximale d'une requête qui peut être mise en cache | | ||
+ | | query_cache_type| Indique le type de cache | | ||
+ | | query_cache_min_res_unit | La taille des blocs de mémoire du cache | | ||
+ | | query_cache_wlock_invalidate | Quand cette option est **OFF**, le serveur peut renvoyer le contenu du cache même si la table est verrouillée par un autre utilisateur | | ||
+ | |||
+ | ===Verification du Cache=== | ||
+ | |||
+ | Pour consulter la configuration du cache, utilisez la requête suivante : | ||
+ | |||
+ | < | ||
+ | mysql> SHOW GLOBAL STATUS LIKE ' | ||
+ | +-------------------------+-------+ | ||
+ | | Variable_name | ||
+ | +-------------------------+-------+ | ||
+ | | Qcache_free_blocks | ||
+ | | Qcache_free_memory | ||
+ | | Qcache_hits | ||
+ | | Qcache_inserts | ||
+ | | Qcache_lowmem_prunes | ||
+ | | Qcache_not_cached | ||
+ | | Qcache_queries_in_cache | 0 | | ||
+ | | Qcache_total_blocks | ||
+ | +-------------------------+-------+ | ||
+ | 8 rows in set (0.01 sec) | ||
+ | </ | ||
+ | |||
+ | Cette configuration s' | ||
+ | |||
+ | ^ Option ^ Descripton ^ | ||
+ | | Qcache_free_memory | ||
+ | | Qcache_lowmem_prunes | Le nombre d' | ||
+ | | Qcache_hits | ||
+ | |||
+ | Les valeurs ci-dessus doivent être comparées avec le nombre total de requêtes de type SELECT : | ||
+ | |||
+ | < | ||
+ | mysql> SHOW GLOBAL STATUS LIKE ' | ||
+ | +---------------+-------+ | ||
+ | | Variable_name | Value | | ||
+ | +---------------+-------+ | ||
+ | | Com_select | ||
+ | +---------------+-------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | </ | ||
+ | |||
+ | L' | ||
+ | |||
+ | < | ||
+ | 100 * Qcache_hits / Com_select | ||
+ | </ | ||
+ | |||
+ | Le taux d' | ||
+ | |||
+ | < | ||
+ | 100 * Qcache_inserts / Com_select | ||
+ | </ | ||
+ | |||
+ | La fragmentation peut être evaluée par le formule : | ||
+ | |||
+ | < | ||
+ | Qcache_free_blocks / Qcache_total_blocks | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour défragmenter le cache, il convient d' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====Optimisation du Schéma==== | ||
+ | |||
+ | L' | ||
+ | |||
+ | * Plus le type de données est petit et compact, plus il sera léger et performant, | ||
+ | * Évitez des colonnes NULL car cela demande plus de travail au serveur que des colonnes NOT NULL, | ||
+ | * Utilisez des champs adéquats aux besoins réels de la donnée à stocker, | ||
+ | * Ne surdimensionnez pas les champs de texte car MySQL utilise la taille maximale pour effectuer des tris. Privilégiez donc des champs VARCHAR par rapport CHAR car ce dernier a une longueur fixe. | ||
+ | |||
+ | ===PROCEDURE ANALYSE=== | ||
+ | |||
+ | Afin de vous aider, MySQL fournit une commande capable d' | ||
+ | |||
+ | < | ||
+ | mysql> SHOW DATABASES; | ||
+ | +--------------------+ | ||
+ | | Database | ||
+ | +--------------------+ | ||
+ | | information_schema | | ||
+ | | CarnetAdresses | ||
+ | | ligue1 | ||
+ | | mysql | | ||
+ | | performance_schema | | ||
+ | | test | | ||
+ | +--------------------+ | ||
+ | 6 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> USE ligue1; | ||
+ | Database changed | ||
+ | mysql> SHOW TABLES; | ||
+ | +------------------+ | ||
+ | | Tables_in_ligue1 | | ||
+ | +------------------+ | ||
+ | | equipe | ||
+ | | rencontre | ||
+ | +------------------+ | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> SHOW CREATE TABLE equipe\G | ||
+ | *************************** 1. row *************************** | ||
+ | | ||
+ | Create Table: CREATE TABLE `equipe` ( | ||
+ | `id_equipe` int(11) NOT NULL AUTO_INCREMENT, | ||
+ | `nom` varchar(50) NOT NULL, | ||
+ | `stade` varchar(50) NOT NULL, | ||
+ | `ville` varchar(30) NOT NULL, | ||
+ | `points` int(11) NOT NULL DEFAULT ' | ||
+ | `buts` int(11) NOT NULL DEFAULT ' | ||
+ | PRIMARY KEY (`id_equipe`) | ||
+ | ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SELECT * FROM equipe PROCEDURE ANALYSE()\G | ||
+ | *************************** 1. row *************************** | ||
+ | | ||
+ | Min_value: 1 | ||
+ | Max_value: 3 | ||
+ | | ||
+ | | ||
+ | | ||
+ | Nulls: 0 | ||
+ | Avg_value_or_avg_length: | ||
+ | Std: 0.8165 | ||
+ | Optimal_fieldtype: | ||
+ | *************************** 2. row *************************** | ||
+ | | ||
+ | Min_value: Debian AC | ||
+ | Max_value: Vista FC | ||
+ | | ||
+ | | ||
+ | | ||
+ | Nulls: 0 | ||
+ | Avg_value_or_avg_length: | ||
+ | Std: NULL | ||
+ | Optimal_fieldtype: | ||
+ | *************************** 3. row *************************** | ||
+ | | ||
+ | Min_value: Parc des Princes | ||
+ | Max_value: Yankee Stadium | ||
+ | | ||
+ | | ||
+ | | ||
+ | Nulls: 0 | ||
+ | Avg_value_or_avg_length: | ||
+ | Std: NULL | ||
+ | Optimal_fieldtype: | ||
+ | *************************** 4. row *************************** | ||
+ | | ||
+ | Min_value: New York | ||
+ | Max_value: Redmond | ||
+ | | ||
+ | | ||
+ | | ||
+ | Nulls: 0 | ||
+ | Avg_value_or_avg_length: | ||
+ | Std: NULL | ||
+ | Optimal_fieldtype: | ||
+ | *************************** 5. row *************************** | ||
+ | | ||
+ | Min_value: 0 | ||
+ | Max_value: 0 | ||
+ | | ||
+ | | ||
+ | | ||
+ | Nulls: 0 | ||
+ | Avg_value_or_avg_length: | ||
+ | Std: 0.0000 | ||
+ | Optimal_fieldtype: | ||
+ | *************************** 6. row *************************** | ||
+ | | ||
+ | Min_value: 0 | ||
+ | Max_value: 0 | ||
+ | | ||
+ | | ||
+ | | ||
+ | Nulls: 0 | ||
+ | Avg_value_or_avg_length: | ||
+ | Std: 0.0000 | ||
+ | Optimal_fieldtype: | ||
+ | 6 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ====Normalisation==== | ||
+ | |||
+ | La normalisation d'une base de données consiste en la structuration des objets de façon à obtenir un modèle de données performant et sur. | ||
+ | |||
+ | Les trois règles les plus importantes sont : | ||
+ | |||
+ | * Eviter des colonnes qui se répètent, | ||
+ | * Eviter l’incohérence des données, | ||
+ | * Tous les champs doivent dépendre uniquement de la clef primaire. | ||
+ | |||
+ | ===LAB #8 - Normalisation=== | ||
+ | |||
+ | Créez la base de données **connaissances** : | ||
+ | |||
+ | < | ||
+ | mysql> CREATE DATABASE connaissances; | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | mysql> USE connaissances; | ||
+ | Database changed | ||
+ | </ | ||
+ | |||
+ | Utilisez la requête suivante pour créer la table **employe** : | ||
+ | |||
+ | < | ||
+ | CREATE TABLE employe ( | ||
+ | id int(11) NOT NULL, | ||
+ | nom varchar(30) NOT NULL DEFAULT '', | ||
+ | ville varchar(30) NOT NULL DEFAULT '', | ||
+ | savoir1 varchar(30) NOT NULL DEFAULT '', | ||
+ | niv1 tinyint(4) NOT NULL, | ||
+ | savoir2 varchar(30) NOT NULL DEFAULT '', | ||
+ | niv2 tinyint(4) NOT NULL, | ||
+ | PRIMARY KEY (id) | ||
+ | ) ENGINE=InnoDB; | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> CREATE TABLE employe ( | ||
+ | -> id int(11) NOT NULL, | ||
+ | -> nom varchar(30) NOT NULL DEFAULT '', | ||
+ | -> ville varchar(30) NOT NULL DEFAULT '', | ||
+ | -> savoir1 varchar(30) NOT NULL DEFAULT '', | ||
+ | -> niv1 tinyint(4) NOT NULL, | ||
+ | -> savoir2 varchar(30) NOT NULL DEFAULT '', | ||
+ | -> niv2 tinyint(4) NOT NULL, | ||
+ | -> PRIMARY KEY (id) | ||
+ | -> ) ENGINE=InnoDB; | ||
+ | Query OK, 0 rows affected (0.06 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Utilisez la requête suivante pour injecter des données : | ||
+ | |||
+ | < | ||
+ | INSERT INTO employe (id , nom , ville , savoir1 , niv1 , savoir2 , niv2) VALUES (' | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> INSERT INTO employe (id , nom , ville , savoir1 , niv1 , savoir2 , niv2) VALUES (' | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | Query OK, 1 row affected (0.01 sec) | ||
+ | |||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | </ | ||
+ | |||
+ | Vous devez obtenir le résultat suivant : | ||
+ | |||
+ | < | ||
+ | mysql> SELECT * FROM employe; | ||
+ | +----+---------+---------+---------+------+---------+------+ | ||
+ | | id | nom | ville | savoir1 | niv1 | savoir2 | niv2 | | ||
+ | +----+---------+---------+---------+------+---------+------+ | ||
+ | | 1 | Alex | Londres | Linux | ||
+ | | 2 | Mathieu | Paris | Apache | ||
+ | | 3 | Thomas | ||
+ | +----+---------+---------+---------+------+---------+------+ | ||
+ | 3 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round todo> | ||
+ | Normalisez la table connaissances.employe. | ||
+ | </ | ||
+ | |||
+ | ====Indexes==== | ||
+ | |||
+ | Un index est une structure de données liée à une table dont le rôle est de permettre le serveur de trouver une référence au plus vite. | ||
+ | |||
+ | Un index peut être créé à la création de la table avec la clause KEY ou INDEX ou bien après sa création avec une des commandes suivantes : | ||
+ | |||
+ | CREATE INDEX nom_index ON table (colonne); | ||
+ | |||
+ | ALTER TABLE table ADD INDEX (colonne); | ||
+ | |||
+ | Ces deux commandes on des différences : | ||
+ | |||
+ | * Avec CREATE INDEX le nom de l' | ||
+ | * Avec ALTER TABLE si le nom de l' | ||
+ | * Avec ALTER TABLE il est possible de créer plusieurs index en même temps en séparant les clauses ADD INDEX par des virgules. | ||
+ | |||
+ | Pour supprimer un index on utilise une des deux commandes suivantes : | ||
+ | |||
+ | DROP INDEX nom_index | ||
+ | |||
+ | ALTER TABLE nom_index | ||
+ | |||
+ | ===Types d' | ||
+ | |||
+ | ==Index Uniques== | ||
+ | |||
+ | Un index unique comporte une contrainte. Toutes les valeurs non NULL doivent être unique. Par contre il est possible d' | ||
+ | |||
+ | < | ||
+ | mysql> use indexes; | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | |||
+ | mysql> INSERT INTO t (id) VALUES (1); | ||
+ | Query OK, 1 row affected (0.01 sec) | ||
+ | |||
+ | mysql> INSERT INTO t (id) VALUES (1); | ||
+ | ERROR 1062 (23000): Duplicate entry ' | ||
+ | |||
+ | mysql> INSERT INTO t (id) VALUES (NULL); | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> INSERT INTO t (id) VALUES (NULL); | ||
+ | Query OK, 1 row affected (0.02 sec) | ||
+ | |||
+ | mysql> SELECT * FROM t; | ||
+ | +------+ | ||
+ | | id | | ||
+ | +------+ | ||
+ | | NULL | | ||
+ | | NULL | | ||
+ | | 1 | | ||
+ | +------+ | ||
+ | 3 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ==Clef Primaires== | ||
+ | |||
+ | Une Clef Primaire ressemble à un index unique mais possède trois différences : | ||
+ | |||
+ | * Il ne peut y avoir qu'une clef unique par table, | ||
+ | * Une clef unique ne peut pas contenir des valeurs NULL, | ||
+ | * Le nom d'une clef unique est toujours PRIMARY. | ||
+ | |||
+ | < | ||
+ | mysql> CREATE TABLE t1 (id INT); | ||
+ | Query OK, 0 rows affected (0.03 sec) | ||
+ | |||
+ | mysql> CREATE INDEX `PRIMARY` ON t1; | ||
+ | ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' | ||
+ | |||
+ | mysql> ALTER TABLE t1 ADD PRIMARY KEY (ID); | ||
+ | Query OK, 0 rows affected (0.06 sec) | ||
+ | Records: 0 Duplicates: 0 Warnings: 0 | ||
+ | </ | ||
+ | |||
+ | ==Index sur Plusieurs Colonnes== | ||
+ | |||
+ | < | ||
+ | mysql> CREATE TABLE t2 (id INT, col1 VARCHAR(30), | ||
+ | Query OK, 0 rows affected (0.33 sec) | ||
+ | |||
+ | mysql> CREATE INDEX index_col12 ON t2 (col1, | ||
+ | Query OK, 0 rows affected (0.11 sec) | ||
+ | Records: 0 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | MySQL est capable d' | ||
+ | </ | ||
+ | |||
+ | ==Index sur un Préfixe de Colonne== | ||
+ | |||
+ | < | ||
+ | mysql> CREATE TABLE t3 (col TEXT); | ||
+ | Query OK, 0 rows affected (0.94 sec) | ||
+ | |||
+ | mysql> CREATE INDEX index_prefixe ON t3 (col); | ||
+ | ERROR 1170 (42000): BLOB/TEXT column ' | ||
+ | |||
+ | mysql> CREATE INDEX index_prefixe ON t3 (col(50)); | ||
+ | Query OK, 0 rows affected (0.10 sec) | ||
+ | Records: 0 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour les index stockant du texte, il est possible de ne créer l' | ||
+ | </ | ||
+ | |||
+ | ==Clefs Etrangères== | ||
+ | |||
+ | Une clef étrangère indique à MySQL de rejeter tout ajout ou modification dans la table enfant si la valeur de la clef n'a pas de correspondance dans la table parent. | ||
+ | |||
+ | < | ||
+ | mysql> CREATE TABLE t4 ( | ||
+ | -> id INT(11) NOT NULL AUTO_INCREMENT, | ||
+ | -> nom VARCHAR(20) NOT NULL DEFAULT'', | ||
+ | -> PRIMARY KEY (id), | ||
+ | -> KEY index_nom (nom) | ||
+ | -> ) ENGINE = InnoDB; | ||
+ | Query OK, 0 rows affected (0.32 sec) | ||
+ | |||
+ | mysql> CREATE TABLE t5 ( id INT(11) NOT NULL AUTO_INCREMENT, | ||
+ | Query OK, 0 rows affected (0.31 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | La clause CONSTRAINT est optionnelle. Le nom de la contrainte doit être unique dans toute la base. Le nom de l' | ||
+ | </ | ||
+ | |||
+ | Lors d'une suppression ou d'une mise à jour, le comportement est dicté par l' | ||
+ | |||
+ | * **RESTRICT** ou **NO ACTION** - C'est l' | ||
+ | * **CASCADE** - Quand une ligne est mise à jour ou supprimée de la table parente, la ou les lignes corrspondantes dans la table enfant sont mises à jour ou supprimées, | ||
+ | * **SET NULL** - Quand une ligne est mise à jour ou supprimée de la table parente, la ou les lignes corrspondantes dans la table enfant sont mises à NULL. | ||
+ | |||
+ | ==Index Cluster avec InnoDB== | ||
+ | |||
+ | Le moteur InnoDB stocke les données **avec** la clef primaire. Par conséquent toute requête qui utilise la clef primaire est très efficace. Par contre toute requête qui utilise une clef secondaire est moins efficace car MySQL recherche d' | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Dans le cas où une clef primaire n' | ||
+ | </ | ||
+ | |||
+ | ==Index Couvrant== | ||
+ | |||
+ | Dans le cas où toutes les données nécessaires à la résolution d'une requête se trouvent dans un index, on parle d'un index **couvrant**. Dans ce cas, l' | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Un index peut être créé avec un de deux algorithmes principaux : B-Tree ou Hash. Un index couvrant est forcément de type B-Tree. | ||
+ | </ | ||
+ | |||
+ | ==Index FULLTEXT== | ||
+ | |||
+ | Dans le cas où il est nécessaire de rechercher une chaîne de caractères dans un champs, on doit utiliser un index FULLTEXT : | ||
+ | |||
+ | < | ||
+ | mysql> CREATE TABLE t6( | ||
+ | -> col1 VARCHAR(50), | ||
+ | -> col2 VARCHAR(50), | ||
+ | -> col3 VARCHAR(50), | ||
+ | -> FULLTEXT index_col1_col2 (col1,col2) | ||
+ | -> ); | ||
+ | ERROR 1214 (HY000): The used table type doesn' | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Le moteur InnoDB supporte les index FULLTEXT à partir de la version 5.6 de MySQL. | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> CREATE TABLE t6( col1 VARCHAR(50), | ||
+ | Query OK, 0 rows affected (0.04 sec) | ||
+ | |||
+ | mysql> CREATE FULLTEXT INDEX index_col2 ON t6 (col2); | ||
+ | Query OK, 0 rows affected (0.07 sec) | ||
+ | Records: 0 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | mysql> ALTER TABLE t6 ADD FULLTEXT index_col3 (col3); | ||
+ | Query OK, 0 rows affected (0.02 sec) | ||
+ | Records: 0 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Téléchargez la base de donnée exemple sakila : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# wget http:// | ||
+ | --2014-02-01 11: | ||
+ | Résolution de downloads.mysql.com... 137.254.60.14 | ||
+ | Connexion vers downloads.mysql.com|137.254.60.14|: | ||
+ | requête HTTP transmise, en attente de la réponse...200 OK | ||
+ | Longueur: 722633 (706K) [application/ | ||
+ | Sauvegarde en : «sakila-db.tar.gz» | ||
+ | |||
+ | 100%[======================================> | ||
+ | |||
+ | 2014-02-01 11:46:30 (50,6 KB/s) - «sakila-db.tar.gz» sauvegardé [722633/ | ||
+ | </ | ||
+ | |||
+ | Installez sakila : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# tar xvf sakila-db.tar.gz | ||
+ | sakila-db/ | ||
+ | sakila-db/ | ||
+ | sakila-db/ | ||
+ | sakila-db/ | ||
+ | [root@centos6 ~]# mysql -uroot -p < sakila-db/ | ||
+ | Enter password: | ||
+ | [root@centos6 ~]# mysql -uroot -p < sakila-db/ | ||
+ | Enter password: | ||
+ | </ | ||
+ | |||
+ | **Mode Langage Naturel** | ||
+ | |||
+ | L' | ||
+ | |||
+ | < | ||
+ | mysql> USE sakila; | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | mysql> SELECT film_id, | ||
+ | -> LEFT(description, | ||
+ | -> MATCH(title, | ||
+ | -> AGAINST(' | ||
+ | -> FROM film_text | ||
+ | -> WHERE MATCH(title, | ||
+ | -> AGAINST(' | ||
+ | -> LIMIT 5; | ||
+ | +---------+--------------------------------+-------------------+ | ||
+ | | film_id | LEFT(description, | ||
+ | +---------+--------------------------------+-------------------+ | ||
+ | | 113 | A Thrilling Yarn of a Database | 6.662790775299072 | | ||
+ | | 962 | A Fanciful Story of a Database | 6.662790775299072 | | ||
+ | | 27 | A Amazing Reflection of a Data | 6.662790775299072 | | ||
+ | | 363 | A Fast-Paced Display of a Car | 4.527374267578125 | | ||
+ | | 372 | A Taut Display of a Cat And a | 4.527374267578125 | | ||
+ | +---------+--------------------------------+-------------------+ | ||
+ | 5 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Par défaut une requête FULLTEXT est une recherches en langage naturel. Ceci implique que chaque mot de la clause AGAINST est recherché dans l' | ||
+ | </ | ||
+ | |||
+ | **Mode Booléen** | ||
+ | |||
+ | En utilisant le mode booléen, il vous est possible d' | ||
+ | |||
+ | ^ Modificateur ^ Description ^ | ||
+ | | + | Le résultat doit contenir ce mot | | ||
+ | | - | Le résultat ne doit pas contenir ce mot | | ||
+ | | ~ | La pertinence de ce mot est plus faible que les autres mots | | ||
+ | | | La pertinence de ce mot est plus haute que les autres mots | | ||
+ | | * | Placé à la fin d'une chaine, ce modificateur est un joker | | ||
+ | |||
+ | Par exemple : | ||
+ | |||
+ | < | ||
+ | mysql> SELECT film_id, | ||
+ | film_id: 23 | ||
+ | title: ANACONDA CONFESSIONS | ||
+ | description: | ||
+ | *************************** 2. row *************************** | ||
+ | film_id: 315 | ||
+ | title: FINDING ANACONDA | ||
+ | description: | ||
+ | 2 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que seulement deux résultats sont retournés. En effet, il n'y a que deux enregistrements dans la base qui contiennent le mot Anaconda. Notez que les mots faisant partie de au moins 50% des enregistrements **ne** sont **pas** automatiquement ignorés. | ||
+ | </ | ||
+ | |||
+ | **Mode Expansion de Requête** | ||
+ | |||
+ | Dans ce mode, la recherche est lancée deux fois. La première fois avec les mots de la clause AGAINST, la deuxième avec les mots ainsi que les résultats les plus pertinents. | ||
+ | |||
+ | < | ||
+ | mysql> SELECT film_id, | ||
+ | +---------+------------------------+----------------------------------------------------------------------------------------------------------------------+ | ||
+ | | film_id | title | description | ||
+ | +---------+------------------------+----------------------------------------------------------------------------------------------------------------------+ | ||
+ | | 428 | HOMICIDE PEACH | A Astounding Documentary of a Hunter And a Boy who must Confront a Boy in A MySQL Convention | ||
+ | | 577 | MILE MULAN | A Lacklusture Epistle of a Cat And a Husband who must Confront a Boy in A MySQL Convention | ||
+ | | 812 | SMOKING BARBARELLA | ||
+ | | 936 | VANISHING ROCKY | A Brilliant Reflection of a Man And a Woman who must Conquer a Pioneer in A MySQL Convention | ||
+ | | 494 | KARATE MOON | A Astounding Yarn of a Womanizer And a Dog who must Reach a Waitress in A MySQL Convention | ||
+ | | 608 | MURDER ANTITRUST | ||
+ | | 341 | FROST HEAD | A Amazing Reflection of a Lumberjack And a Cat who must Discover a Husband in A MySQL Convention | ||
+ | | 773 | SEABISCUIT PUNK | A Insightful Saga of a Man And a Forensic Psychologist who must Discover a Mad Cow in A MySQL Convention | ||
+ | | 242 | DOOM DANCING | ||
+ | | 819 | SONG HEDWIG | ||
+ | | 15 | ALIEN CENTER | ||
+ | | 137 | CHARADE DUFFEL | ||
+ | | 844 | STEERS ARMAGEDDON | ||
+ | | 119 | CAPER MOTIONS | ||
+ | | 907 | TRANSLATION SUMMER | ||
+ | | 899 | TOWERS HURRICANE | ||
+ | | 918 | TWISTED PIRATES | ||
+ | | 933 | VAMPIRE WHALE | A Epic Story of a Lumberjack And a Monkey who must Confront a Pioneer in A MySQL Convention | ||
+ | | 716 | REAP UNFAITHFUL | ||
+ | | 727 | RESURRECTION SILVERADO | A Epic Yarn of a Robot And a Explorer who must Challenge a Girl in A MySQL Convention | ||
+ | | 809 | SLIPPER FIDELITY | ||
+ | | 567 | MEET CHOCOLATE | ||
+ | | 129 | CAUSE DATE | A Taut Tale of a Explorer And a Pastry Chef who must Conquer a Hunter in A MySQL Convention | ||
+ | | 261 | DUFFEL APOCALYPSE | ||
+ | | 213 | DATE SPEED | A Touching Saga of a Composer And a Moose who must Discover a Dentist in A MySQL Convention | ||
+ | | 11 | ALAMO VIDEOTAPE | ||
+ | | 201 | CYCLONE FAMILY | ||
+ | | 352 | GATHERING CALENDAR | ||
+ | | 398 | HANOVER GALAXY | ||
+ | | 426 | HOME PITY | A Touching Panorama of a Man And a Secret Agent who must Challenge a Teacher in A MySQL Convention | ||
+ | | 72 | BILL OTHERS | ||
+ | | 845 | STEPMOM DREAM | A Touching Epistle of a Crocodile And a Teacher who must Build a Forensic Psychologist in A MySQL Convention | ||
+ | | 870 | SWARM GOLD | A Insightful Panorama of a Crocodile And a Boat who must Conquer a Sumo Wrestler in A MySQL Convention | ||
+ | | 466 | INTOLERABLE INTENTIONS | A Awe-Inspiring Story of a Monkey And a Pastry Chef who must Succumb a Womanizer in A MySQL Convention | ||
+ | | 974 | WILD APOLLO | ||
+ | | 980 | WIZARD COLDBLOODED | ||
+ | | 551 | MAIDEN HOME | A Lacklusture Saga of a Moose And a Teacher who must Kill a Forensic Psychologist in A MySQL Convention | ||
+ | | 987 | WORDS HUNTER | ||
+ | | 183 | CONVERSATION DOWNHILL | ||
+ | | 804 | SLEEPING SUSPECTS | ||
+ | | 576 | MIGHTY LUCK | A Astounding Epistle of a Mad Scientist And a Pioneer who must Escape a Database Administrator in A MySQL Convention | | ||
+ | | 733 | RIVER OUTLAW | ||
+ | | 303 | FANTASY TROOPERS | ||
+ | | 937 | VARSITY TRIP | A Action-Packed Character Study of a Astronaut And a Explorer who must Reach a Monkey in A MySQL Convention | ||
+ | | 782 | SHAKESPEARE SADDLE | ||
+ | | 114 | CAMELOT VACATION | ||
+ | | 971 | WHALE BIKINI | ||
+ | | 822 | SOUP WISDOM | ||
+ | | 107 | BUNCH MINDS | A Emotional Story of a Feminist And a Feminist who must Escape a Pastry Chef in A MySQL Convention | ||
+ | | 750 | RUN PACIFIC | ||
+ | +---------+------------------------+----------------------------------------------------------------------------------------------------------------------+ | ||
+ | 50 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> SELECT film_id, | ||
+ | ... | ||
+ | | 113 | CALIFORNIA BIRDS | A Thrilling Yarn of a Database Administrator And a Robot who must Battle a Database Administrator in Ancient India | | ||
+ | | 617 | NATURAL STOCK | A Fast-Paced Story of a Sumo Wrestler And a Girl who must Defeat a Car in A Baloon Factory | ||
+ | | 424 | HOLOCAUST HIGHBALL | ||
+ | | 589 | MODERN DORADO | ||
+ | | 432 | HOPE TOOTSIE | ||
+ | | 145 | CHISUM BEHAVIOR | ||
+ | | 41 | ARSENIC INDEPENDENCE | ||
+ | | 751 | RUNAWAY TENENBAUMS | ||
+ | | 962 | WASTELAND DIVINE | ||
+ | | 177 | CONNECTICUT TRAMP | A Unbelieveable Drama of a Crocodile And a Mad Cow who must Reach a Dentist in A Shark Tank | | ||
+ | | 627 | NORTH TEQUILA | ||
+ | | 702 | PULP BEVERLY | ||
+ | | 511 | LAWRENCE LOVE | A Fanciful Yarn of a Database Administrator And a Mad Cow who must Pursue a Womanizer in Berlin | ||
+ | | 376 | GRAPES FURY | A Boring Yarn of a Mad Cow And a Sumo Wrestler who must Meet a Robot in Australia | ||
+ | | 430 | HOOK CHARIOTS | ||
+ | | 267 | EAGLES PANKY | A Thoughtful Story of a Car And a Boy who must Find a A Shark in The Sahara Desert | ||
+ | | 968 | WEREWOLF LOLA | A Fanciful Story of a Man And a Sumo Wrestler who must Outrace a Student in A Monastery | ||
+ | | 692 | POTLUCK MIXED | A Beautiful Story of a Dog And a Technical Writer who must Outgun a Student in A Baloon | ||
+ | | 192 | CROSSING DIVORCE | ||
+ | | 752 | RUNNER MADIGAN | ||
+ | | 448 | IDAHO LOVE | A Fast-Paced Drama of a Student And a Crocodile who must Meet a Database Administrator in The Outback | ||
+ | | 996 | YOUNG LANGUAGE | ||
+ | +---------+-----------------------------+------------------------------------------------------------------------------------------------------------------------------------+ | ||
+ | 999 rows in set (0.02 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | **Configuration** | ||
+ | |||
+ | Une recherche FULLTEXT peut être configurée en modifiant les trois variables suivants : | ||
+ | |||
+ | < | ||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +-----------------+-------+ | ||
+ | | Variable_name | ||
+ | +-----------------+-------+ | ||
+ | | ft_min_word_len | 4 | | ||
+ | +-----------------+-------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | +-----------------+-------+ | ||
+ | | Variable_name | ||
+ | +-----------------+-------+ | ||
+ | | ft_max_word_len | 84 | | ||
+ | +-----------------+-------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SHOW VARIABLES LIKE ' | ||
+ | Empty set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | La dernière variable peut contenir une liste de mots qui ne seront pas indexés. Notez que chaque fois que vous modifiez une des ces variables, il est nécessaire de reconstruire l' | ||
+ | </ | ||
+ | |||
+ | **Limitations** | ||
+ | |||
+ | Veuillez garder en tête les points suivants : | ||
+ | |||
+ | * Pour effectuer une recherche FULLTEXT, il **faut** utiliser MATCH AGAINST, | ||
+ | * Dès que vous utilisez MATCH AGAINST, le serveur utilisera une recherche FULLTEXT même si l' | ||
+ | * Les résultats en mode langage naturel sont triés par la pertinence. Ceci n'est **pas** le cas pour les deux autres modes, | ||
+ | * Un index FULLTEXT ne peut **pas** être utilisé comme index couvrant. | ||
+ | |||
+ | ====La Commande EXPLAIN==== | ||
+ | |||
+ | La commande EXPLAIN est utilisée pour voir le plan d' | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN SELECT film_id, | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: film_text | ||
+ | type: fulltext | ||
+ | possible_keys: | ||
+ | key: idx_title_description | ||
+ | key_len: 0 | ||
+ | ref: | ||
+ | rows: 1 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | La sortie de la commande démontre 10 colonnes dont les plus importantes sont **type**, **possible_keys**, | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour l' | ||
+ | </ | ||
+ | |||
+ | ===La Colonne type=== | ||
+ | |||
+ | Cette colonne montre comment l' | ||
+ | |||
+ | ==ALL== | ||
+ | |||
+ | Un parcours complet de la table est nécessaire car il n'y a pas d' | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN SELECT * FROM film_text WHERE title LIKE ' | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: film_text | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 1000 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> SELECT * FROM film_text WHERE title LIKE ' | ||
+ | *************************** 1. row *************************** | ||
+ | film_id: 886 | ||
+ | title: THEORY MERMAID | ||
+ | description: | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ==index== | ||
+ | |||
+ | Un parcours complet d'un index est necéssaire : | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN SELECT category_id FROM category\G | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: category | ||
+ | type: index | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 1 | ||
+ | ref: NULL | ||
+ | rows: 16 | ||
+ | Extra: Using index | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> SELECT category_id FROM category\G | ||
+ | *************************** 1. row *************************** | ||
+ | category_id: | ||
+ | *************************** 2. row *************************** | ||
+ | category_id: | ||
+ | *************************** 3. row *************************** | ||
+ | category_id: | ||
+ | *************************** 4. row *************************** | ||
+ | category_id: | ||
+ | *************************** 5. row *************************** | ||
+ | category_id: | ||
+ | *************************** 6. row *************************** | ||
+ | category_id: | ||
+ | *************************** 7. row *************************** | ||
+ | category_id: | ||
+ | *************************** 8. row *************************** | ||
+ | category_id: | ||
+ | *************************** 9. row *************************** | ||
+ | category_id: | ||
+ | *************************** 10. row *************************** | ||
+ | category_id: | ||
+ | *************************** 11. row *************************** | ||
+ | category_id: | ||
+ | *************************** 12. row *************************** | ||
+ | category_id: | ||
+ | *************************** 13. row *************************** | ||
+ | category_id: | ||
+ | *************************** 14. row *************************** | ||
+ | category_id: | ||
+ | *************************** 15. row *************************** | ||
+ | category_id: | ||
+ | *************************** 16. row *************************** | ||
+ | category_id: | ||
+ | 16 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ==range== | ||
+ | |||
+ | Un parcours d'une partie d'un index est nécessaire : | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN SELECT * FROM category WHERE category_id > 50\G | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: category | ||
+ | type: range | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 1 | ||
+ | ref: NULL | ||
+ | rows: 1 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> SELECT * FROM category WHERE category_id > 50\G | ||
+ | Empty set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ==index_merge== | ||
+ | |||
+ | Plusieurs index sont utilisés simultanément : | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN SELECT * FROM rental WHERE rental_id > 10 OR inventory_id < 100\G | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: rental | ||
+ | type: index_merge | ||
+ | possible_keys: | ||
+ | key: idx_fk_inventory_id, | ||
+ | key_len: 3,4 | ||
+ | ref: NULL | ||
+ | rows: 8557 | ||
+ | Extra: Using sort_union(idx_fk_inventory_id, | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> SELECT * FROM rental WHERE rental_id > 10 OR inventory_id < 100\G | ||
+ | ... | ||
+ | *************************** 13776. row *************************** | ||
+ | | ||
+ | | ||
+ | inventory_id: | ||
+ | | ||
+ | | ||
+ | staff_id: 1 | ||
+ | | ||
+ | *************************** 13777. row *************************** | ||
+ | | ||
+ | | ||
+ | inventory_id: | ||
+ | | ||
+ | | ||
+ | staff_id: 1 | ||
+ | | ||
+ | *************************** 13778. row *************************** | ||
+ | | ||
+ | | ||
+ | inventory_id: | ||
+ | | ||
+ | | ||
+ | staff_id: 1 | ||
+ | | ||
+ | *************************** 13779. row *************************** | ||
+ | | ||
+ | | ||
+ | inventory_id: | ||
+ | | ||
+ | | ||
+ | staff_id: 2 | ||
+ | | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | ==ref== | ||
+ | |||
+ | Un index non unique est examiné. Plusieurs lignes peuvent être retournées : | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN SELECT rental_date FROM rental INNER JOIN customer USING (customer_id) WHERE customer_id=1\G | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: customer | ||
+ | type: const | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 2 | ||
+ | ref: const | ||
+ | rows: 1 | ||
+ | Extra: Using index | ||
+ | *************************** 2. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: rental | ||
+ | type: ref | ||
+ | possible_keys: | ||
+ | key: idx_fk_customer_id | ||
+ | key_len: 2 | ||
+ | ref: const | ||
+ | rows: 32 | ||
+ | Extra: | ||
+ | 2 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> SELECT rental_date FROM rental INNER JOIN customer USING (customer_id) WHERE customer_id=1\G | ||
+ | *************************** 1. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 2. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 3. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 4. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 5. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 6. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 7. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 8. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 9. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 10. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 11. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 12. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 13. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 14. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 15. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 16. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 17. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 18. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 19. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 20. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 21. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 22. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 23. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 24. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 25. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 26. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 27. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 28. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 29. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 30. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 31. row *************************** | ||
+ | rental_date: | ||
+ | *************************** 32. row *************************** | ||
+ | rental_date: | ||
+ | 32 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Il existe une variante de ref, appelé ref_or_null. Dans ce cas, il y a une deuxième passe pour retrouver les valeurs NULL. | ||
+ | </ | ||
+ | |||
+ | ==eq_ref== | ||
+ | |||
+ | Un index unique ou une clé primaire est examiné : | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN SELECT email FROM customer INNER JOIN rental USING (customer_id) WHERE rental_date > ' | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: rental | ||
+ | type: range | ||
+ | possible_keys: | ||
+ | key: rental_date | ||
+ | key_len: 8 | ||
+ | ref: NULL | ||
+ | rows: 1 | ||
+ | Extra: Using where; Using index | ||
+ | *************************** 2. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: customer | ||
+ | type: eq_ref | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 2 | ||
+ | ref: sakila.rental.customer_id | ||
+ | rows: 1 | ||
+ | Extra: | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Ce type est le meilleur t(ype d' | ||
+ | </ | ||
+ | |||
+ | ==Cas Spécifiques== | ||
+ | |||
+ | **const** | ||
+ | |||
+ | Une seule ligne a besoin d' | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN SELECT * FROM category WHERE category_id=1\G | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: category | ||
+ | type: const | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 1 | ||
+ | ref: const | ||
+ | rows: 1 | ||
+ | Extra: | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SELECT * FROM category WHERE category_id=1\G | ||
+ | *************************** 1. row *************************** | ||
+ | category_id: | ||
+ | name: Action | ||
+ | last_update: | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | **System** | ||
+ | |||
+ | Identique au type précédent dans le cas où la table est une table à une seule ligne. | ||
+ | |||
+ | **NULL** | ||
+ | |||
+ | Aucun parcours de table ou d' | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN SELECT COUNT(*) FROM film_text\G | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: NULL | ||
+ | type: NULL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: NULL | ||
+ | Extra: Select tables optimized away | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SELECT COUNT(*) FROM film_text\G | ||
+ | *************************** 1. row *************************** | ||
+ | COUNT(*): 1000 | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ===Les Colonnes possible_keys, | ||
+ | |||
+ | La colonne **possible_keys** contient l' | ||
+ | |||
+ | Une valeur NULL dans la colonne **possible_keys** indique qu'il n' | ||
+ | |||
+ | La colonne **key_len** indique la taille en octets de l' | ||
+ | |||
+ | Téléchargez la base de données exemple **world** : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# wget http:// | ||
+ | </ | ||
+ | |||
+ | Installez la base de données exemple **world** : | ||
+ | |||
+ | < | ||
+ | [root@centos6 ~]# mysql -uroot -p | ||
+ | Enter password: | ||
+ | Welcome to the MySQL monitor. | ||
+ | Your MySQL connection id is 8 | ||
+ | Server version: 5.5.33-cll-lve MySQL Community Server (GPL) by Atomicorp | ||
+ | |||
+ | Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. | ||
+ | |||
+ | Oracle is a registered trademark of Oracle Corporation and/or its | ||
+ | affiliates. Other names may be trademarks of their respective | ||
+ | owners. | ||
+ | |||
+ | Type ' | ||
+ | |||
+ | mysql> CREATE DATABASE world; | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> exit | ||
+ | Bye | ||
+ | [root@centos6 ~]# gunzip world.sql.gz | ||
+ | [root@centos6 ~]# mysql -uroot -p world < world.sql | ||
+ | Enter password: | ||
+ | [root@centos6 ~]# | ||
+ | </ | ||
+ | |||
+ | Voyons un exemple maintenant avec cette base de données : | ||
+ | |||
+ | < | ||
+ | mysql> USE world; | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | mysql> ALTER TABLE City ADD INDEX idx_name_district(Name, | ||
+ | Query OK, 4079 rows affected (0.11 sec) | ||
+ | Records: 4079 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | mysql> EXPLAIN SELECT * FROM City WHERE Name LIKE ' | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: City | ||
+ | type: range | ||
+ | possible_keys: | ||
+ | key: idx_name_district | ||
+ | key_len: 35 | ||
+ | ref: NULL | ||
+ | rows: 141 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que la taille de l' | ||
+ | </ | ||
+ | |||
+ | ===La Colonne rows=== | ||
+ | |||
+ | La colonne **rows** contient une estimation du nombre de lignes que le moteur doit parcourir avant de pouvoir retourner un résultat de la requête : | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN SELECT * FROM City CROSS JOIN Country\G | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: Country | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 239 | ||
+ | Extra: | ||
+ | *************************** 2. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: City | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 4079 | ||
+ | Extra: Using join buffer | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Dans l' | ||
+ | </ | ||
+ | |||
+ | Pour prouver qu'il s'agit bien d'une estimation, saisissez la requête suivante : | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN SELECT * FROM City WHERE Name LIKE ' | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: City | ||
+ | type: range | ||
+ | possible_keys: | ||
+ | key: idx_name_district | ||
+ | key_len: 35 | ||
+ | ref: NULL | ||
+ | rows: 141 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.05 sec) | ||
+ | |||
+ | mysql> SELECT COUNT(*) FROM City WHERE Name LIKE ' | ||
+ | *************************** 1. row *************************** | ||
+ | COUNT(*): 110 | ||
+ | 1 row in set (0.02 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Si vous vous rendez compte que les estimations sont largement erronées vous pouvez utilisez la commande ANALYZE TABLE pour mettre à jour les statistiques sur la table. D'une manière générale, plus élevée est la valeur de **ref**, plus lente sera la requête. | ||
+ | </ | ||
+ | |||
+ | ===La Colonne extra=== | ||
+ | |||
+ | La colonne extra donne des informations supplémentaires concernant la requête : | ||
+ | |||
+ | * **Using where** - visible quand le serveur n'a pas pu résoudre une clause WHERE en utilisant un index, | ||
+ | * **Using index** - le serveur va utiliser un index couvrant, | ||
+ | * **Using temporary** - le serveur va utiliser une table temporaire pour effectuer un tri, | ||
+ | * **Using filesort** - le serveur doit trier les résultats de la requête. | ||
+ | |||
+ | ====La Commande EXPLAIN EXTENDED==== | ||
+ | |||
+ | La commande **EXPLAIN EXTENDED** est disponible dans MySQL depuis la version 5.1. EXPLAIN EXTENDED donne une approximation, | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN EXTENDED SELECT ID FROM City WHERE ID < 50\G | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: City | ||
+ | type: range | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 4 | ||
+ | ref: NULL | ||
+ | rows: 50 | ||
+ | | ||
+ | Extra: Using where; Using index | ||
+ | 1 row in set, 1 warning (0.00 sec) | ||
+ | |||
+ | mysql> SELECT COUNT(ID) FROM City WHERE ID < 50\G | ||
+ | *************************** 1. row *************************** | ||
+ | COUNT(ID): 49 | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Par contre cette valeur n'est qu'une estimation : | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN EXTENDED SELECT Name FROM City WHERE CountryCode LIKE ' | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: City | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 4079 | ||
+ | | ||
+ | Extra: Using where | ||
+ | 1 row in set, 1 warning (0.00 sec) | ||
+ | |||
+ | mysql> SELECT Name FROM City WHERE CountryCode LIKE ' | ||
+ | *************************** 1. row *************************** | ||
+ | Name: Besançon | ||
+ | 1 row in set (0.07 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Malgré le peu de fiabilité dans le résultat de la colonne **filtered**, | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN EXTENDED SELECT COUNT(*) FROM Country\G | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: NULL | ||
+ | type: NULL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: NULL | ||
+ | | ||
+ | Extra: Select tables optimized away | ||
+ | 1 row in set, 1 warning (0.00 sec) | ||
+ | |||
+ | mysql> SHOW WARNINGS\G | ||
+ | *************************** 1. row *************************** | ||
+ | Level: Note | ||
+ | Code: 1003 | ||
+ | Message: select count(0) AS `COUNT(*)` from `world`.`Country` | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ====Optimisation des Requêtes==== | ||
+ | |||
+ | ===Isolation des Colonnes=== | ||
+ | |||
+ | L' | ||
+ | |||
+ | < | ||
+ | mysql> USE sakila; | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | mysql> EXPLAIN SELECT * FROM rental WHERE TO_DAYS(CURRENT_DATE()) - TO_DAYS(rental_date) < 10\G | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: rental | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 15629 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> EXPLAIN SELECT * FROM rental WHERE rental_date > CURRENT_DATE() + INTERVAL 10 DAY\G | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: rental | ||
+ | type: range | ||
+ | possible_keys: | ||
+ | key: rental_date | ||
+ | key_len: 8 | ||
+ | ref: NULL | ||
+ | rows: 1 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | La réécriture de la requête sans encapsuler une colonne dans une fonction produit une requête plus performante ( range > ALL ). | ||
+ | </ | ||
+ | |||
+ | ===Jointures=== | ||
+ | |||
+ | Quand MySQL effectue des jointures il le fait une à une et successivement. Par exemple, dans le cas de 4 tables, table1, table2, table3, table4, la table1 est jointe à la table2 produisant une table table12. La table12 est ensite jointe à la table3 produisant la table123. La table123 est ensute joite à la table4 pour produire la table1234. | ||
+ | |||
+ | Dans le cas d'un INNER JOIN, MySQL peut décider de ne pas respecter cet ordre : | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN SELECT email FROM customer INNER JOIN rental ON customer.customer_id = rental.customer_id WHERE rental_date > ' | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: rental | ||
+ | type: range | ||
+ | possible_keys: | ||
+ | key: rental_date | ||
+ | key_len: 8 | ||
+ | ref: NULL | ||
+ | rows: 1 | ||
+ | Extra: Using where; Using index | ||
+ | *************************** 2. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: customer | ||
+ | type: eq_ref | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 2 | ||
+ | ref: sakila.rental.customer_id | ||
+ | rows: 1 | ||
+ | Extra: | ||
+ | 2 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | L' | ||
+ | </ | ||
+ | |||
+ | Pourquoi l' | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN SELECT email FROM customer STRAIGHT_JOIN rental ON customer.customer_id = rental.customer_id WHERE rental_date > ' | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: customer | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 577 | ||
+ | Extra: | ||
+ | *************************** 2. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: rental | ||
+ | type: range | ||
+ | possible_keys: | ||
+ | key: rental_date | ||
+ | key_len: 8 | ||
+ | ref: NULL | ||
+ | rows: 1 | ||
+ | Extra: Using where; Using index; Using join buffer | ||
+ | 2 rows in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Dans le cas ci-dessus, l' | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Pour les jointure externes, LEFT JOIN et RIGHT JOIN, l' | ||
+ | </ | ||
+ | |||
+ | ===Indexes=== | ||
+ | |||
+ | ==USE INDEX== | ||
+ | |||
+ | Il est possible d' | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN SELECT email FROM customer INNER JOIN rental USE INDEX (idx_fk_customer_id) ON customer.customer_id = rental.customer_id WHERE rental_date > ' | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: customer | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 577 | ||
+ | Extra: | ||
+ | *************************** 2. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: rental | ||
+ | type: ref | ||
+ | possible_keys: | ||
+ | key: idx_fk_customer_id | ||
+ | key_len: 2 | ||
+ | ref: sakila.customer.customer_id | ||
+ | rows: 13 | ||
+ | Extra: Using where | ||
+ | 2 rows in set (0.00 sec) | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Dans le cas d' | ||
+ | </ | ||
+ | |||
+ | ==FORCE INDEX== | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN SELECT email FROM customer INNER JOIN rental FORCE INDEX (idx_fk_customer_id) ON customer.customer_id = rental.customer_id WHERE rental_date > ' | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: customer | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 577 | ||
+ | Extra: | ||
+ | *************************** 2. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: rental | ||
+ | type: ref | ||
+ | possible_keys: | ||
+ | key: idx_fk_customer_id | ||
+ | key_len: 2 | ||
+ | ref: sakila.customer.customer_id | ||
+ | rows: 13 | ||
+ | Extra: Using where | ||
+ | 2 rows in set (0.01 sec) | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Dans le cas d' | ||
+ | </ | ||
+ | |||
+ | ==IGNORE INDEX== | ||
+ | |||
+ | mysql> EXPLAIN SELECT email FROM customer INNER JOIN rental IGNORE INDEX (idx_fk_customer_id, | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: rental | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 15629 | ||
+ | Extra: Using where | ||
+ | *************************** 2. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: customer | ||
+ | type: eq_ref | ||
+ | possible_keys: | ||
+ | key: PRIMARY | ||
+ | key_len: 2 | ||
+ | ref: sakila.rental.customer_id | ||
+ | rows: 1 | ||
+ | Extra: | ||
+ | 2 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Dans le cas d' | ||
+ | </ | ||
+ | |||
+ | ===CLAUSES LENTES=== | ||
+ | |||
+ | Les clauses d’agrégation telles SUM(), MAX() et MIN() provoquent en générale des requêtes lentes car il faut lire l' | ||
+ | |||
+ | < | ||
+ | mysql> SHOW TABLE STATUS WHERE Name = ' | ||
+ | *************************** 1. row *************************** | ||
+ | Name: film_text | ||
+ | | ||
+ | Version: 10 | ||
+ | | ||
+ | Rows: 1000 | ||
+ | | ||
+ | Data_length: | ||
+ | Max_data_length: | ||
+ | | ||
+ | Data_free: 0 | ||
+ | | ||
+ | Create_time: | ||
+ | Update_time: | ||
+ | | ||
+ | Collation: utf8_general_ci | ||
+ | | ||
+ | | ||
+ | Comment: | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> EXPLAIN SELECT COUNT(*) FROM film_text\G | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: NULL | ||
+ | type: NULL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: NULL | ||
+ | Extra: Select tables optimized away | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Dans le cas ci-dessus la valeur de la colonne **type** est **NULL** indiquant qu' | ||
+ | </ | ||
+ | |||
+ | ===Sous-requêtes=== | ||
+ | |||
+ | MySQL exécute parfois très lentement des sous-requêtes. Privilégiez donc les jointures plutôt que des sous-requêtes : | ||
+ | |||
+ | < | ||
+ | mysql> USE world; | ||
+ | Reading table information for completion of table and column names | ||
+ | You can turn off this feature to get a quicker startup with -A | ||
+ | |||
+ | Database changed | ||
+ | mysql> SELECT Language FROM CountryLanguage WHERE CountryCode = (SELECT Code FROM Country WHERE Name=' | ||
+ | +------------+ | ||
+ | | Language | ||
+ | +------------+ | ||
+ | | Arabic | ||
+ | | French | ||
+ | | Italian | ||
+ | | Portuguese | | ||
+ | | Spanish | ||
+ | | Turkish | ||
+ | +------------+ | ||
+ | 6 rows in set (0.03 sec) | ||
+ | |||
+ | mysql> SELECT Language FROM CountryLanguage INNER JOIN Country ON Code=CountryCode WHERE Name=' | ||
+ | +------------+ | ||
+ | | Language | ||
+ | +------------+ | ||
+ | | Arabic | ||
+ | | French | ||
+ | | Italian | ||
+ | | Portuguese | | ||
+ | | Spanish | ||
+ | | Turkish | ||
+ | +------------+ | ||
+ | 6 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ===Moteurs=== | ||
+ | |||
+ | ==MyISAM== | ||
+ | |||
+ | Le paramètre le plus important pour le moteur MyISAM est le key_buffer_size : | ||
+ | |||
+ | < | ||
+ | mysql> SHOW GLOBAL VARIABLES LIKE ' | ||
+ | +-----------------+---------+ | ||
+ | | Variable_name | ||
+ | +-----------------+---------+ | ||
+ | | key_buffer_size | 8388608 | | ||
+ | +-----------------+---------+ | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> SHOW GLOBAL STATUS LIKE ' | ||
+ | +------------------------+-------+ | ||
+ | | Variable_name | ||
+ | +------------------------+-------+ | ||
+ | | Key_blocks_not_flushed | 0 | | ||
+ | | Key_blocks_unused | ||
+ | | Key_blocks_used | ||
+ | | Key_read_requests | ||
+ | | Key_reads | ||
+ | | Key_write_requests | ||
+ | | Key_writes | ||
+ | +------------------------+-------+ | ||
+ | 7 rows in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | La variable **Key_reads** indique le nombre de requêtes de lectures qui n'ont pas pu être satisfaites par le cache. La variable **Key_read_requests** indique le nombre de lectures totale. La formule (1 - Key_reads / Key_read_requests ) * 100 donne une indication de l' | ||
+ | </ | ||
+ | |||
+ | ==InnoDB== | ||
+ | |||
+ | Les paramètres les plus importants pour le moteur **InnoDB** sont résumés dans la table suivante : | ||
+ | |||
+ | ^ Paramètre ^ Valeur Suggérée ^ | ||
+ | | innodb_buffer_size | 80% de la mémoire physique de la machine | | ||
+ | | innodb_flush_at_trx_commit | 1 si la protection des données est primordiale, | ||
+ | |||
+ | |||
+ | ====Partitionnement==== | ||
+ | |||
+ | Le partitionnement est utilisé pour diviser les données d'une table en parties logiques selon une règle pré-établie : | ||
+ | |||
+ | * Par les données contenues dans la table. Dans ce cas on parle de partitionnement **horizontal**. Il existe 4 types possibles : | ||
+ | * **Par plages**, | ||
+ | * **Par listes**, | ||
+ | * **Par hachage**, | ||
+ | * **Par clef**, | ||
+ | * Par les colonnes de la table. | ||
+ | |||
+ | |||
+ | <WRAP center round important> | ||
+ | Il est possible de faire un partitionnement vertical et un partitionnement horizontal sur la même table. Il est aussi possible de faire des partitions de partitions. | ||
+ | </ | ||
+ | |||
+ | Le partitionnement apporte trois avantages : | ||
+ | |||
+ | * Créer des tables plus grandes que la taille autorisée par un système de fichiers. Il est aussi possible de stocker des partitions à des endroits différents, | ||
+ | |||
+ | * Supprimer très rapidement des données en détruisant la partition qui les contient. Ceci s' | ||
+ | |||
+ | * Optimiser certaines requêtes car les données étant organisées dans différentes partitions. Ceci s' | ||
+ | |||
+ | ===Partitionnement Horizontal=== | ||
+ | |||
+ | ===LAB #9 - Partitionnement par Plages=== | ||
+ | |||
+ | Créez une base de données **transactions** ainsi que la table **transac** : | ||
+ | |||
+ | < | ||
+ | CREATE DATABASE transactions; | ||
+ | |||
+ | USE transactions; | ||
+ | |||
+ | CREATE TABLE transac | ||
+ | ( | ||
+ | id INT UNSIGNED PRIMARY KEY, | ||
+ | montant INT UNSIGNED NOT NULL, | ||
+ | jour DATE NOT NULL, | ||
+ | codePays ENUM(' | ||
+ | ); | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> CREATE DATABASE transactions; | ||
+ | Query OK, 1 row affected (0.00 sec) | ||
+ | |||
+ | mysql> USE transactions; | ||
+ | Database changed | ||
+ | mysql> | ||
+ | |||
+ | mysql> CREATE TABLE transac | ||
+ | -> ( | ||
+ | -> id INT UNSIGNED PRIMARY KEY, | ||
+ | -> montant INT UNSIGNED NOT NULL, | ||
+ | -> jour DATE NOT NULL, | ||
+ | -> codePays ENUM(' | ||
+ | -> ); | ||
+ | Query OK, 0 rows affected (0.04 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Imaginons qu'en étudiant les requêtes des utilisateurs sur cette table sur une période probante, nous découvrons que la majorité utilise des plages de date. Dans ce cas il serait utile de partitionner la table par la valeur de la colonne **jour**. Créer donc la table partitionnée appelée **transac_part** : | ||
+ | |||
+ | < | ||
+ | CREATE TABLE transac_part | ||
+ | ( | ||
+ | id INT UNSIGNED NOT NULL, | ||
+ | montant INT UNSIGNED NOT NULL, | ||
+ | jour DATE NOT NULL, | ||
+ | codePays ENUM(' | ||
+ | ) PARTITION BY RANGE(YEAR(jour)) | ||
+ | ( | ||
+ | PARTITION p1 VALUES LESS THAN(1997), | ||
+ | PARTITION p2 VALUES LESS THAN(1998), | ||
+ | PARTITION p3 VALUES LESS THAN(1999), | ||
+ | PARTITION p4 VALUES LESS THAN(2000), | ||
+ | PARTITION p5 VALUES LESS THAN(2001), | ||
+ | PARTITION p6 VALUES LESS THAN(2002), | ||
+ | PARTITION p7 VALUES LESS THAN(2003), | ||
+ | PARTITION p8 VALUES LESS THAN(2004), | ||
+ | PARTITION p9 VALUES LESS THAN(2005), | ||
+ | PARTITION p10 VALUES LESS THAN(2006), | ||
+ | PARTITION p11 VALUES LESS THAN MAXVALUE | ||
+ | ); | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> CREATE TABLE transac_part | ||
+ | -> ( | ||
+ | -> id INT UNSIGNED NOT NULL, | ||
+ | -> montant INT UNSIGNED NOT NULL, | ||
+ | -> jour DATE NOT NULL, | ||
+ | -> codePays ENUM(' | ||
+ | -> ) PARTITION BY RANGE(YEAR(jour)) | ||
+ | -> ( | ||
+ | -> PARTITION p1 VALUES LESS THAN(1997), | ||
+ | -> PARTITION p2 VALUES LESS THAN(1998), | ||
+ | -> PARTITION p3 VALUES LESS THAN(1999), | ||
+ | -> PARTITION p4 VALUES LESS THAN(2000), | ||
+ | -> PARTITION p5 VALUES LESS THAN(2001), | ||
+ | -> PARTITION p6 VALUES LESS THAN(2002), | ||
+ | -> PARTITION p7 VALUES LESS THAN(2003), | ||
+ | -> PARTITION p8 VALUES LESS THAN(2004), | ||
+ | -> PARTITION p9 VALUES LESS THAN(2005), | ||
+ | -> PARTITION p10 VALUES LESS THAN(2006), | ||
+ | -> PARTITION p11 VALUES LESS THAN MAXVALUE | ||
+ | -> ); | ||
+ | Query OK, 0 rows affected (0.13 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round alert> | ||
+ | L' | ||
+ | </ | ||
+ | |||
+ | Créez ensuite une procédure pour injecter des données dans la table **transac** : | ||
+ | |||
+ | < | ||
+ | DELIMITER // | ||
+ | CREATE PROCEDURE remplir_transaction(nbTransacs INT) | ||
+ | BEGIN | ||
+ | DECLARE i INT DEFAULT 1; | ||
+ | DECLARE nbAlea DOUBLE; | ||
+ | DECLARE _jour DATE; | ||
+ | DECLARE _montant INT UNSIGNED; | ||
+ | DECLARE _codePays TINYINT UNSIGNED; | ||
+ | |||
+ | WHILE i <= nbTransacs DO | ||
+ | SET nbAlea = RAND(); | ||
+ | SET _jour = ADDDATE(' | ||
+ | SET _montant = FLOOR(1 + (nbAlea * 9999)); | ||
+ | SET nbAlea = RAND(); | ||
+ | SET _codePays = FLOOR(1 + (nbAlea * 6)); | ||
+ | INSERT INTO transac (id, montant, jour, codePays) VALUES (i, _montant, _jour, _codePays); | ||
+ | SET i = i + 1; | ||
+ | END WHILE; | ||
+ | END // | ||
+ | |||
+ | DELIMITER ; | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | mysql> DELIMITER // | ||
+ | mysql> CREATE PROCEDURE remplir_transaction(nbTransacs INT) | ||
+ | -> BEGIN | ||
+ | -> DECLARE i INT DEFAULT 1; | ||
+ | -> DECLARE nbAlea DOUBLE; | ||
+ | -> DECLARE _jour DATE; | ||
+ | -> DECLARE _montant INT UNSIGNED; | ||
+ | -> DECLARE _codePays TINYINT UNSIGNED; | ||
+ | -> | ||
+ | -> WHILE i <= nbTransacs DO | ||
+ | -> SET nbAlea = RAND(); | ||
+ | -> SET _jour = ADDDATE(' | ||
+ | -> SET _montant = FLOOR(1 + (nbAlea * 9999)); | ||
+ | -> SET nbAlea = RAND(); | ||
+ | -> SET _codePays = FLOOR(1 + (nbAlea * 6)); | ||
+ | -> | ||
+ | -> SET i = i + 1; | ||
+ | -> END WHILE; | ||
+ | -> END // | ||
+ | Query OK, 0 rows affected (0.05 sec) | ||
+ | |||
+ | mysql> DELIMITER ; | ||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Appelez ensuite la procédure et patientez 10 minutes. A l' | ||
+ | |||
+ | < | ||
+ | mysql> CALL remplir_transaction(200000); | ||
+ | ^CCtrl-C -- sending "KILL QUERY 2" to server ... | ||
+ | Ctrl-C -- query aborted. | ||
+ | mysql> SELECT COUNT(*) FROM transac; | ||
+ | +----------+ | ||
+ | | COUNT(*) | | ||
+ | +----------+ | ||
+ | | | ||
+ | +----------+ | ||
+ | 1 row in set (0.09 sec) | ||
+ | |||
+ | mysql> | ||
+ | |||
+ | Insérez maintenant les mêmes données dans la table **transac_part** : | ||
+ | |||
+ | < | ||
+ | mysql> INSERT INTO transac_part SELECT * FROM transac; | ||
+ | Query OK, 191939 rows affected (3.63 sec) | ||
+ | Records: 191939 | ||
+ | |||
+ | mysql> SELECT COUNT(*) FROM transac_part; | ||
+ | +----------+ | ||
+ | | COUNT(*) | | ||
+ | +----------+ | ||
+ | | | ||
+ | +----------+ | ||
+ | 1 row in set (0.14 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Pour voir l' | ||
+ | |||
+ | < | ||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.17 sec) | ||
+ | |||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.03 sec) | ||
+ | </ | ||
+ | |||
+ | Notez que la requête sur la table partitionnée retourne un résultat **5,67** fois plus vite que sur la table d' | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN PARTITIONS SELECT SUM(montant), | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: transac_part | ||
+ | | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 18035 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez que la valeur de la colonne **partitions** est **p3**. | ||
+ | </ | ||
+ | |||
+ | Evidemment, plus qu'il y a de partitions à consulter, moins important est le gains en performance : | ||
+ | |||
+ | < | ||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | 198031481 | 2268.9216 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.18 sec) | ||
+ | |||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | 198031481 | 2268.9216 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.16 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Le système de partitionnement peut aussi s' | ||
+ | |||
+ | < | ||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | 959746672 | 5000.2692 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.16 sec) | ||
+ | |||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | 959746672 | 5000.2692 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.20 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Dernièrement, | ||
+ | |||
+ | < | ||
+ | mysql> DELETE FROM transac_part WHERE jour BETWEEN ' | ||
+ | Query OK, 17680 rows affected (0.18 sec) | ||
+ | |||
+ | mysql> ALTER TABLE transac_part DROP PARTITION p1; | ||
+ | Query OK, 0 rows affected (0.10 sec) | ||
+ | Records: 0 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ==LAB #10 - Partitionnement par Listes== | ||
+ | |||
+ | Imaginons maintenant que nous avons découvert que les requêtes des utilisateurs portent souvent sur continent géographique. Dans ce cas, il serait utile de faire un partitionnement par liste. Le champs crée par l' | ||
+ | |||
+ | < | ||
+ | codePays ENUM(' | ||
+ | </ | ||
+ | |||
+ | associe une valeur entière à chaque valeur du champ de type ENUM. Nous allons utiliser ce fait pour créer la table partitionnée. | ||
+ | |||
+ | Commencez par nettoyer ce que vous avez déjà fait : | ||
+ | |||
+ | < | ||
+ | mysql> TRUNCATE TABLE transac; | ||
+ | Query OK, 0 rows affected (0.17 sec) | ||
+ | |||
+ | mysql> DROP TABLE transac_part; | ||
+ | Query OK, 0 rows affected (0.09 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Créez maintenant la table transac_part : | ||
+ | |||
+ | < | ||
+ | mysql> CREATE TABLE transac_part | ||
+ | -> ( | ||
+ | -> id INT UNSIGNED NOT NULL, | ||
+ | -> montant INT UNSIGNED NOT NULL, | ||
+ | -> jour DATE NOT NULL, | ||
+ | -> codePays TINYINT UNSIGNED NOT NULL | ||
+ | -> ) PARTITION BY LIST(codePays) | ||
+ | -> ( | ||
+ | -> PARTITION pEurope VALUES IN (1, 2, 3), | ||
+ | -> PARTITION pAmeriqueNord VALUES IN (4, 5), | ||
+ | -> PARTITION pAsie VALUES IN (6) | ||
+ | -> ); | ||
+ | Query OK, 0 rows affected (0.06 sec) | ||
+ | </ | ||
+ | |||
+ | Appelez la procédure remplir_transaction et copiez la valeurs dans transac_part : | ||
+ | |||
+ | < | ||
+ | mysql> CALL remplir_transaction(10000000); | ||
+ | ^CCtrl-C -- sending "KILL QUERY 2" to server ... | ||
+ | Ctrl-C -- query aborted. | ||
+ | mysql> INSERT INTO transac_part SELECT * FROM transac; | ||
+ | Query OK, 52193 rows affected (0.57 sec) | ||
+ | Records: 52193 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Comparez le gains de performance en utilisant la table partitionnée : | ||
+ | |||
+ | < | ||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | 130838834 | 5018.9433 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.07 sec) | ||
+ | |||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | 130838834 | 5018.9433 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.04 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Notez que la requête sur la table partitionnée retourne un résultat **1,75** fois plus vite que sur la table d' | ||
+ | |||
+ | Comparez le gains de performance en utilisant uniquement la partition numéro 6 : | ||
+ | |||
+ | < | ||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.05 sec) | ||
+ | |||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Notez que la requête sur la table partitionnée retourne un résultat **5** fois plus vite que sur la table d' | ||
+ | |||
+ | ==LAB #11 - Partitionnement par Hash== | ||
+ | |||
+ | Dans ce cas la partition à laquelle appartient un enregistrement est déterminée à partir de la valeur de retour d'une fonction définie par l' | ||
+ | |||
+ | Re-créez la table transac_part : | ||
+ | |||
+ | < | ||
+ | mysql> DROP TABLE transac_part; | ||
+ | Query OK, 0 rows affected (0.03 sec) | ||
+ | |||
+ | mysql> | ||
+ | mysql> CREATE TABLE transac_part | ||
+ | -> ( | ||
+ | -> id INT UNSIGNED NOT NULL, | ||
+ | -> montant INT UNSIGNED NOT NULL, | ||
+ | -> jour DATE NOT NULL, | ||
+ | -> codePays ENUM(' | ||
+ | -> ) PARTITION BY HASH(YEAR(jour)) PARTITIONS 11; | ||
+ | Query OK, 0 rows affected (0.07 sec) | ||
+ | |||
+ | mysql> | ||
+ | mysql> | ||
+ | mysql> INSERT INTO transac_part SELECT * FROM transac; | ||
+ | Query OK, 52193 rows affected (0.85 sec) | ||
+ | Records: 52193 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez qu'ici on indique le champs de référence **jour** et le nombre de partitions désirées. | ||
+ | </ | ||
+ | |||
+ | Testez maintenant le gains de performance en utilisant les partitions : | ||
+ | |||
+ | < | ||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.09 sec) | ||
+ | |||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.08 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Notez qu'ici le gains de performance est minime. | ||
+ | </ | ||
+ | |||
+ | Le gains de performance est minime parce que toutes les partitions ont été scannées : | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN PARTITIONS SELECT SUM(montant), | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: transac_part | ||
+ | | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 52982 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.00 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Le partitionnement par hachage n'est efficace que dans le cas ou le hash est généré à partir d'une colonne de type entier. | ||
+ | </ | ||
+ | |||
+ | Pour prouver ce point, recréez la table transac_part avec des partitions basées sur la colonne **codePays** : | ||
+ | |||
+ | < | ||
+ | mysql> DROP TABLE transac_part; | ||
+ | Query OK, 0 rows affected (0.22 sec) | ||
+ | |||
+ | mysql> | ||
+ | mysql> CREATE TABLE transac_part | ||
+ | -> ( | ||
+ | -> id INT UNSIGNED NOT NULL, | ||
+ | -> montant INT UNSIGNED NOT NULL, | ||
+ | -> jour DATE NOT NULL, | ||
+ | -> codePays TINYINT UNSIGNED NOT NULL | ||
+ | -> ) PARTITION BY HASH(codePays) PARTITIONS 6; | ||
+ | Query OK, 0 rows affected (0.23 sec) | ||
+ | |||
+ | mysql> | ||
+ | mysql> INSERT INTO transac_part SELECT * FROM transac; | ||
+ | Query OK, 52193 rows affected (0.65 sec) | ||
+ | Records: 52193 Duplicates: 0 Warnings: 0 | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Testez de nouveau le gain de performance en utilisant les partitions : | ||
+ | |||
+ | < | ||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.04 sec) | ||
+ | |||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.02 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Cette fois-ci le gain est plus important. | ||
+ | </ | ||
+ | |||
+ | ==Partitionnement par Key== | ||
+ | |||
+ | Dans ce cas la partition à laquelle appartient un enregistrement est déterminée à partir de la valeur de retour d'une fonction définie par le serveur MySQL. | ||
+ | |||
+ | Par exemple : | ||
+ | |||
+ | < | ||
+ | CREATE TABLE transac_part | ||
+ | ( | ||
+ | id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, | ||
+ | | ||
+ | jour DATE NOT NULL, | ||
+ | | ||
+ | ) PARTITION BY KEY() PARTITIONS 5; | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important> | ||
+ | Dans ce cas, la clef n'est pas spécifiée. Le hachage est généré à partir de tous les champs de la clef primaire. Dans notre cas c'est le champ **id**. Puisqu' | ||
+ | </ | ||
+ | |||
+ | ==LAB #12 - Sous-partitionnement== | ||
+ | |||
+ | Avec MySQL il est possible de créer des sous-partitions. Cependant il existe deux limitations : | ||
+ | |||
+ | * La partition de premier niveau doit être de type RANGE ou LIST, | ||
+ | * La partition de deuxième niveau doit être de type HASH ou KEY, | ||
+ | * Le nombre de partitions total ne peut pas dépasser **8192**. | ||
+ | |||
+ | Prenons le cas où les requêtes fréquentes portent sur les dates **et** sur la zone géographique. | ||
+ | |||
+ | Créez la table transac-part : | ||
+ | |||
+ | < | ||
+ | mysql> DROP TABLE transac_part; | ||
+ | Query OK, 0 rows affected (0.18 sec) | ||
+ | |||
+ | mysql> | ||
+ | mysql> CREATE TABLE transac_part | ||
+ | -> ( | ||
+ | -> id INT UNSIGNED NOT NULL, | ||
+ | -> montant INT UNSIGNED NOT NULL, | ||
+ | -> jour DATE NOT NULL, | ||
+ | -> codePays INT UNSIGNED NOT NULL | ||
+ | -> ) | ||
+ | -> PARTITION BY RANGE(YEAR(jour)) | ||
+ | -> SUBPARTITION BY HASH(codePays) SUBPARTITIONS 6 | ||
+ | -> ( | ||
+ | -> PARTITION p1 VALUES LESS THAN(1997), | ||
+ | -> PARTITION p2 VALUES LESS THAN(1998), | ||
+ | -> PARTITION p3 VALUES LESS THAN(1999), | ||
+ | -> PARTITION p4 VALUES LESS THAN(2000), | ||
+ | -> PARTITION p5 VALUES LESS THAN(2001), | ||
+ | -> PARTITION p6 VALUES LESS THAN(2002), | ||
+ | -> PARTITION p7 VALUES LESS THAN(2003), | ||
+ | -> PARTITION p8 VALUES LESS THAN(2004), | ||
+ | -> PARTITION p9 VALUES LESS THAN(2005), | ||
+ | -> PARTITION p10 VALUES LESS THAN(2006), | ||
+ | -> PARTITION p11 VALUES LESS THAN MAXVALUE | ||
+ | -> ); | ||
+ | Query OK, 0 rows affected (1.37 sec) | ||
+ | |||
+ | mysql> | ||
+ | mysql> INSERT INTO transac_part SELECT * FROM transac; | ||
+ | </ | ||
+ | |||
+ | Testez maintenant le gain de performance en utilisant les partitions : | ||
+ | |||
+ | < | ||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | 2928528 | 4073.0570 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.05 sec) | ||
+ | |||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | 2928528 | 4073.0570 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | 261035779 | 5001.3561 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.07 sec) | ||
+ | |||
+ | mysql> SELECT SUM(montant), | ||
+ | +--------------+--------------+ | ||
+ | | SUM(montant) | AVG(montant) | | ||
+ | +--------------+--------------+ | ||
+ | | 261035779 | 5001.3561 | | ||
+ | +--------------+--------------+ | ||
+ | 1 row in set (0.09 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Notez la dégradation des performance avec les partitions dans le cas d'une requête sans clause WHERE : | ||
+ | |||
+ | < | ||
+ | mysql> EXPLAIN PARTITIONS SELECT SUM(montant), | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: transac_part | ||
+ | | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 893 | ||
+ | Extra: Using where | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> EXPLAIN PARTITIONS SELECT SUM(montant), | ||
+ | *************************** 1. row *************************** | ||
+ | id: 1 | ||
+ | select_type: | ||
+ | table: transac_part | ||
+ | | ||
+ | type: ALL | ||
+ | possible_keys: | ||
+ | key: NULL | ||
+ | key_len: NULL | ||
+ | ref: NULL | ||
+ | rows: 54365 | ||
+ | Extra: | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | ===LAB #13 - Partitionnement Vertical=== | ||
+ | |||
+ | Dans ce cas les partitions sont des tables différentes. Prenons l' | ||
+ | |||
+ | < | ||
+ | mysql> CREATE TABLE produit | ||
+ | -> ( | ||
+ | -> id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, | ||
+ | -> libelle VARCHAR(50) NOT NULL, | ||
+ | -> prix DECIMAL(10, | ||
+ | -> photo BLOB NOT NULL | ||
+ | -> ); | ||
+ | Query OK, 0 rows affected (0.04 sec) | ||
+ | </ | ||
+ | |||
+ | Séparez maintenant les photos des autres données : | ||
+ | |||
+ | < | ||
+ | mysql> CREATE TABLE produit2 | ||
+ | -> ( | ||
+ | -> id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, | ||
+ | -> libelle VARCHAR(50) NOT NULL, | ||
+ | -> prix DECIMAL(10, | ||
+ | -> ); | ||
+ | Query OK, 0 rows affected (0.04 sec) | ||
+ | |||
+ | mysql> | ||
+ | mysql> CREATE TABLE photo_produit | ||
+ | -> ( | ||
+ | -> idProd INT UNIQUE NOT NULL, | ||
+ | -> photo BLOB NOT NULL | ||
+ | -> ); | ||
+ | Query OK, 0 rows affected (0.03 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | Utilisez la procédure suivante pour injecter les données : | ||
+ | |||
+ | < | ||
+ | mysql> DELIMITER // | ||
+ | mysql> | ||
+ | mysql> CREATE PROCEDURE remplir_produit(nbProds INT) | ||
+ | -> BEGIN | ||
+ | -> DECLARE i INT DEFAULT 1; | ||
+ | -> DECLARE _prix DECIMAL(10, | ||
+ | -> DECLARE _photo BLOB DEFAULT REPEAT(' | ||
+ | -> | ||
+ | -> WHILE i <= nbProds DO | ||
+ | -> SET _prix = CAST((RAND() * 1000) AS DECIMAL(10, | ||
+ | -> | ||
+ | -> | ||
+ | -> | ||
+ | -> SET i = i + 1; | ||
+ | -> END WHILE; | ||
+ | -> END // | ||
+ | Query OK, 0 rows affected (0.10 sec) | ||
+ | |||
+ | mysql> | ||
+ | mysql> DELIMITER ; | ||
+ | mysql> CALL remplir_produit(10000); | ||
+ | ^CCtrl-C -- sending "KILL QUERY 3" to server ... | ||
+ | Ctrl-C -- query aborted. | ||
+ | ERROR 1317 (70100): Query execution was interrupted | ||
+ | mysql> SELECT COUNT(*) FROM produit; | ||
+ | +----------+ | ||
+ | | COUNT(*) | | ||
+ | +----------+ | ||
+ | | 1664 | | ||
+ | +----------+ | ||
+ | 1 row in set (0.02 sec) | ||
+ | |||
+ | mysql> SELECT COUNT(*) FROM produit2; | ||
+ | +----------+ | ||
+ | | COUNT(*) | | ||
+ | +----------+ | ||
+ | | 1664 | | ||
+ | +----------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> SELECT COUNT(*) FROM photo_produit; | ||
+ | +----------+ | ||
+ | | COUNT(*) | | ||
+ | +----------+ | ||
+ | | 1663 | | ||
+ | +----------+ | ||
+ | 1 row in set (0.01 sec) | ||
+ | |||
+ | mysql> | ||
+ | </ | ||
+ | |||
+ | |||
+ | Testez maintenant le gain de performance en utilisant les partitions : | ||
+ | |||
+ | < | ||
+ | mysql> SELECT id, libelle, prix FROM produit; | ||
+ | mysql> SELECT id, libelle, prix FROM produit2; | ||
+ | </ | ||
+ | |||
+ | |||
+ | ----- | ||
+ | < | ||
+ | <div align=" | ||
+ | Copyright © 2020 Hugh Norris.< | ||
+ | </ | ||
+ | </ | ||
+ | ----- | ||