TP Administration de MYSQL



TP 1  Généralités

TP 2  Gestion locale en mode commande

Remarque : on pourrait avoir tout de suite recours à une interface WEB, par exemple Phpmyadmin pour dialoguer avec le serveur. Bien entendu le confort dans l'utilisation quotidienne est très appréciable par rapport à une gestion en ligne de commande, mais finalement toute interface PHP de ce genre (ou autre langage), finalement ne transmet que des commandes SQL au serveur.
  1. Connexion cliente
    La commande mysql exécute un utilitaire client, qui permet de dialoguer avec le serveur MYSQL
    Ce mode d'accès effectué en ligne de commande, est appelé le mode console.
    Lorsque l'on lance cette commande, aucun login, ni mot de passe n'est demandé. On peut ainsi se connecter en fait comme administrateur de mysql, et sans mot de passe !
    mysql
    Welcome to the MySQL monitor. Commands ends with ; or \g
    Your Mysql connection id is ...
    tape help; ou \h for help
    mysql>
    
    On peut aussi se connecter à distance à travers une session ssh
    Connectez-vous à un serveur voisin par connexion ssh, puis commande mysql

  2. Requêtes au serveur
    Le serveur Mysql ne comprend que le langage SQL. Il faut s'adresser à lui exclusivement par commandes SQL !
    Or justement, le client mysql est un interpréteur de commandes SQL !
    Remarque : par défaut la casse n'est pas prise en compte; et par convention il est d'usage courant d'écrire les mots-clés SQL en majuscules.
    Petit test (attention les ; de fin de commande sont obligatoires en syntaxe SQL)
    mysql
    mysql> SHOW databases;
    mysql> USE test;
    mysql> SHOW tables;
    mysql> USE mysql;
    mysql> SHOW tables;
    mysql> SHOW columns FROM user;
    mysql> SELECT  host, user, password FROM user;
    mysql>quit
    
  3. Stockage des tables
  4. Comparer les tables de la base mysql, avec les fichiers contenus dans le répertoire /var/lib/mysql/mysql.
    Conclusion : quels sont les fichiers nécessaires à la description de chaque table d'une base ?

  5. Sécuriser le compte administrateur

  6. Supprimer l'utilisateur anonyme
    Sur certains installations, un compte anonyme est créé. Il est vivement recommandé de le supprimer ... pas vraiment pour une question de sécurité car ses privilèges sont très limité, mais pour éviter des confusions liées à la procédure d'authentification. Pour le supprimer, root se connecte directement à la base mysql (le "mysql" à la fin de la commande, en fait effectue une commande USE mysql).
    Puis root passe une requete SQL de suppression
    mysql -u root -p mysql
    mysql> DELETE FROM user WHERE user='';
    mysql> DELETE FROM user WHERE password='';
    mysql> SELECT host, user, password FROM user;
    

TP 3  Accès distant

  1. Essai de connexion distante
  2. Le client mysql peut tenter une connexion distante, à partir d'une station voisine (on donne l'adresse IP du serveur ou un nom de machine résolvable)
    mysql -h ip -u root -p
    Password ..
    Refus !! lisez bien le motif du refus, il explique pourquoi ..
    
  3. Créer des comptes distants
    En fait un compte utilisateur est toujours attaché à une machine, à partir de laquelle la connexion est sollicitée.
    Et le compte root maintenant protégé par mot de passe, est un compte local attaché à l'hôte localhost.
    Il s'agit de créer un compte root accessible d'un serveur voisin dont vous connaissez l'ip (pour un serveur en production cela est très peu recommandé !). Pour cela relancer le client mysql localement (ou à travers une connexion ssh)
    mysql -u root -p
    Password ..
    mysql>GRANT all privileges ON *.* TO 'root'@'ip' IDENTIFIED BY 'fctice'
    
  4. Retester
  5. Sur la station voisine, redemander la connexion avec le nouveau compte root, et l'utiliser pour créer une nouvelle base, nommée essais, puis la supprimer (vous constatez qu'aucune confirmation n'est demandée !)
    mysql -h ip -u root  -p
    Password ..
    mysql>CREATE DATABASE essais ;
    
  6. Création d'un compte restreint accessible de partout
  7. En adaptant la commande grant précédente, il s'agit de créer un compte stage (mot de passe stage) accessible de n'importe où (y compris localement), mais limité à la commande SQL d'affichage select.
    mysql -u root -p
    Password ..
    mysql>GRANT all privileges ON *.* TO 'root'@'ip' IDENTIFIED BY 'fctice'
    
    Tester ensuite une connexion cliente quelconque. Est-ce possible ?
    Se connecter localement avec phpmyadmin, puis passer des commandes d'affichage, d'insertion et de suppression sur une table (par exemple db) de la base système mysql. Que vérifiez-vous ?

TP 4  Installation, sauvegarde et restauration d'une base

Bien sûr tout pourrait être géré en mode console, même à distance avec une session ssh
Mais phpmyadmin écrit pour nous toutes ces lignes de commandes SQL !

  1. Créer une base
  2. Se connecter comme root et créer une nouvelle base cdi
    - create database cdi, directement dans la fenêtre SQL de phpmyadmin
    - ou dans le formulaire de la page d'accueil "Créer une base de données"
    Constater qu'un nouveau sous-rép. cdi vide a été créé dans /var/www/mysql.

  3. Importation de la structure et des données
  4. La structure de la base cdi ainsi que la totalité de ses enregistrements ont été préalablement sauvegardés sous forme de fichier cdi.sql. Au préalable, lire et comprendre le contenu du fichier cdi.sql
    En mode console
    mysql -u root -p cdi < /chemin/cdi.sql
    
    Sous Phpmyadmin
    sélectionner la base cdi
    "Emplacement du fichier texte"
    chercher le fichier cdi.sql sur le système de fichier local
    Exécuter
    Bien comparer ce fichier à la structure et aux contenus des tables.
    

  5. Sauvegarde d'une base au format SQL
  6. Le mode console est indispensable pour programmer une sauvegarde automatique avec crontab
    En mode console
    mysqldump - u root -p cdi > /chemin/cdi1.sql
    --> donner le mot de passe
    
    Sous Phpmyadmin
    Comme root, sélectionner la base cdi
    "Afficher le schéma de la base de données"
    Structure et données
    Transmettre
    Exécuter
    choix du répertoire, nom du fichier : cdi1.sql
    Comparer avec le fichier d'origine cdi.sql
    

  7. Création d'une table à partir d'une exportation d'une table msaccess ou msexcel
    1. Créer la table glossaire dans la base test
      Avec Phpmyadmin, sélectionner la base test
      "Créer une nouvelle table sur la base test" :
      Nom : glossaire Champs : 3
      Exécuter
      
      A l'aide du formulaire proposé, définir sa structure
            Champ         Type          Null       primaire
          ----------   -------------   ------      --------
           sigle         varchar(12)    not null      x
           descriptif    varchar(50)    not null
           type          char(1)        not null
      
      Sauvegarder -->  La nouvelle table glossaire est alors créée dans la base test ( ou dans votre base webmestre)
      
    2. Remarquer que la requête SQL envoyée par phpmyadmin pour créer la table est :
       CREATE TABLE glossaire (
        sigle VARCHAR(12) NOT NULL,
        descriptif VARCHAR(50) default NOT NULL,
        type VARCHAR(1) default NOT NULL,
        PRIMARY KEY (sigle)
        );
      
    3. Gestion de la table
      Phpmyadmin permet maintenant de gérer la table
      Observer les rubriques : Supprimer (la table), Insérer (des enregistrements) et la possibilité de modifier ou suppression de champs
    4. Examiner le fichier fourni glossaire.txt
      Il a été obtenu en exportant une table access au format délimité, avec le séparateur ; sans délimitateur de texte.
    5. Dans Phpmyadmin, cliquer sur insérer des données provenant d'un fichier de texte dans la table. Renseigner le formulaire:
      Emplacement du fichier texte : glossaire.txt
      Champs terminée par ;
      Supprimer les autres choix
      Exécuter
      
      Observer les 283 enregistrements importés et supprimer le premier.

TP 5 Créer de comptes, accorder des "privilèges"

  1. Création des comptes d'accès
  2. Il s'agit de créer 2 comptes pour la base cdi, à l'aide de phpmyadmin :
    public (sans mot de passe) et admin/admin
    Ces utilisateurs ne doivent posséder aucun droit d'administration globaux sur le serveur lui-même, mais uniquement des droits d'accès grand public (public) et d'administration (admin) sur la base cdi

  3. Création des comptes d'accès à cdi
  4. Dans la base Mysql, table user, lien insérer un nouvel enregistrement
    Base mysql; table user; action "insérer"
     - host  localhost     localhost
     - user  public        admin
     - mdp    .....        admin  -- avec fonction=PASSWORD
    Laisser tous les droits (globaux) à No
    Ne pas oublir de relancer le serveur
    
    Se connecter sous le compte admin/admin en mode console ou avec phpmyadmin; admin peut-il alors accéder à la gestion des utilisateurs ? Conclusion.

  5. Commandes SQL
  6. Ce sont les commandes SQL grant et revoke qui permettent d'attribuer et de retirer des droits. Exemple :
    Accorder à admin le privilège d'être gestionnaire de la base cdi, avec droit d'accès à distance (@% = de partout), avec certains privilèves (ALL PRIVILEGES pour les attribuer tous) sur toutes (*) les tables de cdi
    mysql> GRANT select,insert,update,delete
    ON  cdi.*
    TO 'admin'@'%'
    IDENTIFIED BY "admin";
    

  7. Attribution des privilèges pour la base cdi
  8. Conformément aux informations suivantes, à l'aide de phpmyadmin (ou si on a le courage avec grant !)
       Comptes      |              droits à attribuer
    ----------------|-------------------------------------------------------------------
     admin/admin    | - droits select,insert,update,delete, au niveau de la base CDI
    ----------------|-------------------------------------------------------------------
     public/...     | - accès à la base cdi, sans aucun privilège global
                    | - droit SELECT  (exclusivement) sur les tables inscrits, documents
                    | - droit INSERT  sur la table demande
    ----------------|-------------------------------------------------------------------
    
    Relancer le serveur et bien vérifier l'application de ces droits, comme admin et comme public.
    Remarque : il est aussi facile d'utiliser la commande grant (si on la maitrise). Ecrire les commandes grant pour créer le compte pub/pub, avec les memes droits que public.

TP 6  Rapide introduction au langage SQL

On peut consulter ce TP introduction à SQL


ANNEXES

Accès sécurisé à Mysql par phpmyadmin

phpMyAdmin est un ensemble de scripts PHP permettant de gérer complètement ses bases de données par le truchement d'une interface WEB distante. Sauvegarder, relancer le navigateur, s'authentifier comme root/fctice, prendre en main cet utilitaire. En particulier, parcourir la base système mysql

Organisation d'une base

Gestion des utilisateurs et système de droits

Jusqu'ici on ne s'est intéressé qu'à root l'administrateur du serveur.
Et on a vu que les utilisateurs sont gérés par l'intermédiaire de leur inscription dans la base de données système mysql

Droits d'accès des utilisateurs aux bases

Le systèmes de droits (ici appelés privilèges) sont inclus dans les 5 tables de la base de données mysql. Sa gestion doit demeurer le privilège exclusif de root. Il doit donc être le seul : Mais il est tout-à-fait recommandé de déléguer des tâches d'administration d'une base particulière à des gestionnaires (uniquement alors des privilèges de création et de mises à jour des tables : ajout, suppression, modification).

Description des droits

Utilitaires d'administration

Comment connaitre l'état du serveur ? utilitaire mysqladmin

Comment sauvegarder les bases ? utilitaire mysqldump

Comment vérifier et réparer les bases ? utilitaire myisamchk

Perte du mot de passe mysql

Voici une méthode pour récupérer (ou plutôt re-créer) le mot de passe de l'utilisateur root de Mysql .. en cas de perte ..
  1. arrêter le Serveur Mysql
  2. /etc/init.d/mysql stop
  3. On relance en inhibant de l'authentification
  4. /usr/sbin/mysqld --skip-grant-tables &
  5. Mettre le mot de passe en rentrant comme root dans phpmyadmin
  6. ou en ligne de commande
  7. mysql
    mysql> use mysql
    mysql> update user set password=PASSWORD("nouveau_mot_de_passe") where user='root';
    mysql> quit
    
  8. Relancer mysql
  9. /etc/init.d/mysql restart
    si problème, lancer d'abord killall mysqld