Historique
MySQL a été créé par la société suédoise MySQL AB (co-fondée par David Axmark, Allan Larsson et Michael Widenius). C’est ce dernier qui nommera l’application du prénom de sa première fille (My) et de l’accronyme SQL. La première version de MySQL date de 1995. La société fut rachetée par Sun Microsystems en 2008 puis par Oracle en 2009.
Oracle assurant ainsi le contrôle total des deux serveurs de bases de données les plus utilisés au monde, MySQL et Oracle Database.
Depuis 2012, Michael Widenius développe une version libre de MySQL appelée MariaDB, du prénom de
sa deuxième fille.
MySQL est encore distribuée aujourd’hui sous deux licences, l’une libre MySQL Community Server et
l’autre commerciale MySQL Standard ou Entreprise.
Un serveur de base de données structuré
Mysql, comme de nombreux autres serveurs du même type, structure ses données, en tables, puis en colonnes. Les lignes de ces tables étant les enregistrements inscrits dans la base de données.
Les tables contiennent généralement des index permettant au moteur de rechercher rapidement des données. Par exemple : Une table des utilisateurs avec les colonnes nom, prénom et email. L’index pouvant, éventuellement, être créé sur la colonne email.
MySQL est également un système de bases de données dit « relationnel » car nous allons pouvoir établir des relations entre différentes tables. Par exemple, lier la table des utilisateurs à celles des achats réalisés dans le cadre d’une application de commerce électronique.
SQL, un langage (quasi) universel
Pour réaliser des requêtes auprès d’un serveur MySQL (ou MariaDB) nous utilisons le langage SQL (Structured Query Language). Il existe de nombreuses versions de SQL en fonction des serveurs.
Cependant, un socle commun existe et permet aux développeurs de communiquer aisément avec les différents serveurs de bases de données SQL.
Quelques requêtes de base
Se connecter à un server local
mysql -u root -p // pour l'utilisateur root
Lister les bases de données présentes
mysql> show databases;
Se connecter à une base de données en particulier
mysql> use nomdelatable;
Créer la table "node"
CREATE TABLE `node` ( `nid` int(10) unsigned NOT NULL AUTO_INCREMENT, `type` varchar(32) CHARACTER SET ascii NOT NULL COMMENT 'The type of the node.', `title` varchar(255) NOT NULL, `body` longtext, `path` varchar(255) DEFAULT NULL, UNIQUE (path), PRIMARY KEY (`nid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='The base table for node.';
Ajouter un champ à une table
ALTER TABLE node ADD COLUMN seo_title VARCHAR(255) AFTER title;
Utiliser une base de données
mysql> use nomdelabd;
Lister les tables
mysql> show tables;
Voir la structure d’une table
DESCRIBE nomdelatable;
Rechercher un enregistrement
SELECT nom, prénom, email FROM utilisateurs WHERE email=‘yvan@coopernet.fr'
Ajouter un enregistrement
INSERT INTO utilisateurs SET nom=‘nison’, prenom=‘laurent’, email=‘laurent@neore.com'
Modifier un enregistrement
UPDATE utilisateurs SET email=‘laurent@neore.fr’ WHERE email=‘laurent@neore.com'
Supprimer un enregistrement
DELETE FROM utilisateurs WHERE email=‘sundar-pichai@google.com’
Exporter (dump) et importer une base de données
L'export comprend à la fois la structure de votre base de données mais également les données dans un fichier ".sql" que vous pouvez ensuite importer.
Exemple d'export :
mysqldump -u username -p database_name > 2021-03-03.sql
Exemple d'import :
mysql -u username -p database_name < 2021-03-03.sql
Installation de MySQL sous Ubuntu
L’installation de MySQL sous Ubuntu peut se faire en téléchargement les fichiers binaires directement sur le site de MySQL. Cependant, nous préférerons utiliser « apt » pour installer et maintenir MySQL à jour. MySQL n’utilise pas les serveurs de dépôts génériques, nous allons donc devoir adapter un peu notre installation.Voici les commandes à réaliser :
Mise à jour de la base de données des paquets
sudo apt update
Télécharger le paquet de configuration de apt
sudo wget https://repo.mysql.com/mysql-apt-config_0.8.12-1_all.deb
Installation du paquet
sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb
Nouvelle mise à jour des paquets qui intégrera les serveurs de dépôt de MySQL
sudo apt update
On lance l’installation
sudo apt install mysql-server
Une fois l’installation réalisée, nous pouvons configurer le compte root de MySQL grâce à l’utilitaire suivant :
sudo mysql_secure_installation
On vérifie que tout fonctionne
sudo service mysql status
Démarrer et Arrêter MySQL
MySQL est installé avec toutes les options de gestion des services sous Ubuntu. Il est ainsi très facile de démarrer et d’arrêter le serveur MySQL
Démarrer MySQL
sudo service mysql start
Arrêter MySQL
sudo service mysql stop
Connaître le statut actuel de MySQL
sudo service mysql status
Travaux pratiques pour utiliser le client mysql
Un client mysql est également installé lors de l’installation de la version serveur. Nous pouvons donc l’utiliser pour réaliser quelques exercices simples :
Commençons par nous connecter sur notre serveur avec le compte root
mysql -u root -p
Créons une nouvelle base de données : test
CREATE DATABASE test;
Créons un utilisateur local : machin
CREATE USER machin@localhost IDENTIFIED BY ‘motdepasse’;
Donnons tous les droits à machin sur la base de données test
GRANT ALL PRIVILEGES ON test.* TO machin@localhost;
On quitte le client mysql
quit;
Nous pouvons donc maintenant utiliser l’utilisateur machin pour faire tout ce qu’on veut, mais
uniquement dans la base de données test.
innoDB ou MyISAM
Pour savoir quel moteur de stockage est utilisé par votre table :
SELECT ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='node' AND TABLE_SCHEMA='mycms';
Un moteur de stockage est constitué d’algorithmes qui seront utilisés par le Système de Gestion de Base de Données Relationnelles pour enregistrer les données et les récupérer au moyen de requêtes SQL.
En résumé, il faut favoriser innoDB car :
- Il gère les transactions (instructions sql BEGIN, COMMIT, ROLLBACK…)
- il permet de s'assurer que que chaque enregistrement sera complètement réussi, ou complètement échoué,
- Il supporte les clés étrangères et les intégrités référentielles
- Il possède un système de récupération automatique en cas de crash
Transactions
Les transactions permettent de sécuriser vos développements qui utilisent une base de données. Sans elles, on risquerait de se retrouver avec des opérations qu'à moitié accomplies. Avec elles, on peut regrouper les requêtes sous forme de "blocs" pour s'assurer que :
- soit l'ensemble des requêtes du bloc est entièrement exécuté
- soit aucune des requêtes n'est exécuté
On dit que cela permet de préserver l'intégrité des données de la base.
Exemple de cas d'utilisation
Imaginons que vous vous appêtiez à supprimer une page de votre site web. Pour que votre site web reste intègre, il serait bien que tous les liens provenant des autres pages de votre site vers cette page soient supprimés. Il ne faut pas que le bloc de requêtes que cela consitute s'arrête au milieu, sinon, vous aurez des liens pointant vers une page qui n'existe plus...
Exemple de code
try { $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->beginTransaction(); $dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')"); $dbh->exec("insert into salarychange (id, amount, changedate) values (23, 50000, NOW())"); $dbh->commit(); } catch (Exception $e) { $dbh->rollBack(); echo "Failed: " . $e->getMessage(); }