đŹ MariaDB â Installation, SQL & Administration
Guide complet IDEOâLab pour maĂźtriser le SGBD relationnel, de l'installation Ă la rĂ©plication.
Vue d'ensemble
Qu'est-ce que MariaDB ? Fork de MySQL.
SGBDR MySQL Fork Open SourceArchitecture
Client/Serveur, Moteurs de stockage.
Client/Serveur InnoDB AriaInstallation Linux
Ubuntu/Debian (apt) & RHEL/CentOS (yum/dnf).
apt yum LinuxInstallation Windows
Standalone (MSI) ou WAMP/XAMPP.
Windows WAMP MSISécurisation (Importante)
Script mysql_secure_installation.
Connexion & Clients
Client CLI mysql, DBeaver, HeidiSQL.
Gestion des BDD (SQL)
CREATE DATABASE, USE, DROP.
Gestion des Utilisateurs
CREATE USER, GRANT, REVOKE.
DDL : CREATE TABLE
Anatomie d'une table, Clés Primaires.
CREATE TABLE PRIMARY KEYTypes de Données
INT, VARCHAR, TEXT, DATETIME, JSON.
INT VARCHAR DATETIMEDDL : ALTER TABLE
ADD, MODIFY, DROP COLUMN.
DML : INSERT
Ajouter des lignes dans une table.
INSERT INTO VALUESDML : SELECT & WHERE
Lire les données, filtrer les résultats.
SELECT WHERE LIKEDML : UPDATE & DELETE
Modifier et supprimer des lignes (avec WHERE !).
SQL : Jointures (JOIN)
INNER JOIN, LEFT JOIN.
SQL : Agrégats
GROUP BY, COUNT, SUM, AVG.
Index & Clés
Optimisation des SELECT, INDEX, EXPLAIN.
Backup (mysqldump)
Exporter des bases de données en SQL.
mysqldump backupRestauration & Config
Restaurer un dump, fichier my.cnf.
Réplication
Configuration Master/Slave (Primaire/Secondaire).
Replication Master/SlaveCheat-sheet SQL
Commandes SQL et CLI fréquentes.
cheat SQLQu'est-ce que MariaDB ?
MariaDB est un **SGBDR** (SystÚme de Gestion de Base de Données Relationnelle) open-source, créé par les fondateurs originaux de **MySQL**.
C'est un "fork" de MySQL, nĂ© en 2009 suite aux inquiĂ©tudes de la communautĂ© aprĂšs le rachat de MySQL par Oracle. MariaDB est conçu pour ĂȘtre un remplacement "drop-in" de MySQL, hautement compatible, mais avec plus de fonctionnalitĂ©s et un dĂ©veloppement communautaire.
Historique (Fork)
MySQL (Original, 1995)
â
ââ Rachat par Sun Microsystems (2008)
â
ââ Rachat de Sun par Oracle (2009)
â â
â âââș MySQL (DĂ©veloppement Oracle)
â â
â âââș MariaDB (Fork par le fondateur "Monty" Widenius)
â (GĂ©rĂ© par la MariaDB Foundation)MariaDB vs. MySQL (Post-Fork)
Bien qu'hautement compatibles, ils divergent :
| CritĂšre | MariaDB | MySQL (par Oracle) |
|---|---|---|
| Licence | GPLv2 (Toujours open) | GPLv2 / Commerciale |
| Moteurs | InnoDB (défaut), Aria, MyISAM... | InnoDB (défaut), MyISAM... |
| Fonctionnalités | Pool de threads, ColumnStore, JSON | Pool de threads (Enterprise), JSON |
| Développement | Communautaire et ouvert | "Corporate" et plus fermé |
En résumé : MariaDB est souvent vue comme l'alternative plus "pure", communautaire et riche en fonctionnalités à MySQL, tout en gardant une compatibilité quasi-totale.
Schéma Client/Serveur
MariaDB fonctionne sur un modĂšle client-serveur classique.
[Image d'une architecture SGBD]
+----------------------+ (Réseau TCP/IP ou Socket UNIX)
| Clients |
| (ex: DBeaver, Web App) |
| (ex: CLI `mysql`) |
+----------------------+
|
| RequĂȘte SQL (ex: SELECT * FROM users)
âŒ
+------------------------------------------------------+
| SERVEUR MariaDB (Processus `mysqld`) |
| |
| +------------------+ +-----------------------+ |
| | Analyseur SQL | --> | Optimiseur de RequĂȘte | |
| +------------------+ +-----------------------+ |
| (Cache) | |
| ⌠|
| +------------------------------------------------+ |
| | API Moteur de Stockage (Pluggable) | |
| +------------------------------------------------+ |
| | | | |
| ⌠⌠⌠|
| +----------+ +----------+ +----------+ |
| | InnoDB | | Aria | | MyISAM | |
| +----------+ +----------+ +----------+ |
| (ACID, Lignes) (Crash-safe) (Legacy, Table) |
| |
| +------------------------------------------------+ |
| | SystĂšme de Fichiers (/var/lib/mysql/...) | |
| +------------------------------------------------+ |
+------------------------------------------------------+
Les Moteurs de Stockage (Storage Engines)
La grande force de MariaDB/MySQL est son architecture "pluggable". Le moteur de stockage définit *comment* les données sont stockées, indexées et verrouillées.
Vous pouvez choisir le moteur par table.
| Moteur | Défaut | Transactions (ACID) | Verrouillage | Cas d'usage |
|---|---|---|---|---|
| InnoDB | Oui (Défaut) | Oui (ACID) | Ligne (Row-level) | 99% des cas. Sûr, rapide, gÚre les clés étrangÚres. Le standard absolu. |
| Aria | Non | Non | Table | Alternative "crash-safe" Ă MyISAM. Plus rapide pour les `SELECT` complexes. Bon pour les tables internes. |
| MyISAM | Non (Legacy) | Non | Table (rapide en lecture) | Legacy. TrÚs rapide pour les `SELECT` purs (data warehouse simple), mais non "crash-safe". à éviter. |
| ColumnStore | Non | Non | - | Stockage en colonnes. Pour l'analytique (Data Warehousing) massif. |
-- Choisir un moteur à la création CREATE TABLE ma_table ( id INT PRIMARY KEY ) ENGINE=InnoDB;
Processus et Fichiers Clés
- Processus : Le serveur MariaDB s'exécute en tant que daemon (service) unique appelé
mysqld. - Fichier de Configuration :
- Linux:
/etc/mysql/my.cnfou/etc/my.cnf.d/server.cnf - Windows:
C:\Program Files\MariaDB [Version]\data\my.ini
- Linux:
- Socket UNIX : (Linux) Pour les connexions locales rapides sans passer par TCP/IP.
/var/run/mysqld/mysqld.sock
- Répertoire de Données : (
datadir)- Linux:
/var/lib/mysql/ - Windows:
C:\Program Files\MariaDB [Version]\data\ - C'est lĂ que les BDD (dossiers) et les tables (fichiers
.ibd) sont stockés.
- Linux:
- Logs : (
/var/log/mysql/)error.log: Le plus important pour le debug (erreurs de dĂ©marrage, crashs).slow-query.log: (Optionnel) Logue les requĂȘtes lentes.binlog: (Optionnel) Log binaire pour la rĂ©plication.
Ubuntu 22.04+ / Debian 11+
Les dépÎts officiels de MariaDB sont recommandés pour avoir la version la plus récente (plutÎt que celle fournie par la distribution).
# 1. Mettre à jour et installer les prérequis
sudo apt update
sudo apt install -y curl gpg-agent
# 2. Ajouter la clé GPG de MariaDB
curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'
# 3. Ajouter le dépÎt (Ex: 10.11 pour Ubuntu 22.04)
# (Vérifiez sur mariadb.org/repositories/ pour votre version)
sudo sh -c "echo 'deb [signed-by=/etc/apt/keyrings/mariadb-keyring.pgp] https://dlm.mariadb.com/repo/mariadb-server/10.11/repo/ubuntu jammy main' \
> /etc/apt/sources.list.d/mariadb.list"
# 4. Installer MariaDB
sudo apt update
sudo apt install -y mariadb-server mariadb-clientRHEL / CentOS 8+ / Fedora
Utilisation du script de configuration de dépÎt.
# 1. Installer les prérequis sudo yum install -y curl # 2. Télécharger et exécuter le script de configuration curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash # 3. Installer MariaDB (dnf ou yum) sudo dnf install -y MariaDB-server MariaDB-client MariaDB-backup
Vérification et Post-Installation
Une fois installé, le service mysql (ou mariadb) devrait démarrer.
# Activer le service au démarrage
sudo systemctl enable --now mariadb
# Vérifier le statut
sudo systemctl status mariadb
â mariadb.service - MariaDB 10.11.x database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; ...)
Active: active (running) since Sat 2025-11-01 20:00:00 CET; 1h ago
...
# Vérifier la version
mysql --version
# mysql Ver 15.1 Distrib 10.11.6-MariaDB, for debian-linux-gnu (x86_64)Ătape suivante OBLIGATOIRE
L'installation par défaut n'est **PAS** sécurisée (l'utilisateur root n'a pas de mot de passe ou utilise l'auth unix_socket).
Lancez immédiatement le script de sécurisation (voir section 2.3) :
sudo mysql_secure_installation
Option 1 : Stack WAMP/XAMPP (Développement)
Pour le développement local (ex: PHP, WordPress), le plus simple est d'utiliser une stack "tout-en-un" :
- WAMP : (Windows, Apache, MySQL/MariaDB, PHP)
- XAMPP : (Cross-platform, Apache, MariaDB, PHP, Perl)
Avantages :
- Installation en un clic.
- Panneau de contrĂŽle graphique pour dĂ©marrer/arrĂȘter les services (Apache, MariaDB).
- Inclut PhpMyAdmin pour la gestion web.
- Non optimisé pour la production.
- Versions parfois en retard.
Option 2 : Installeur MSI (Production/Dédié)
Pour un vrai service de base de données (ex: accessible par d'autres machines), utilisez l'installeur officiel MSI.
- Allez sur mariadb.org/download/
- Téléchargez l'installeur MSI (stable).
- Exécutez l'installeur.
- Ătape clĂ© : DĂ©finissez un mot de passe pour l'utilisateur
root. - Ătape clĂ© : Cochez "Install as a service" (Installer en tant que service).
- Laissez le nom du service (ex:
MariaDB). - Activez "Use TCP/IP" (Port 3306).
Une fois installé, le service MariaDB tournera en arriÚre-plan.
Vérification
Ajoutez le dossier bin de MariaDB Ă votre PATH (ex: C:\Program Files\MariaDB 10.11\bin).
(Dans cmd ou PowerShell) mysql -u root -p Enter password: [votre-mot-de-passe] Welcome to the MariaDB monitor.
Le script indispensable
Cette commande (à lancer en sudo) est l'étape obligatoire aprÚs toute nouvelle installation Linux.
sudo mysql_secure_installation
Ce script interactif va vous poser plusieurs questions pour "durcir" votre installation.
Authentification unix_socket (Linux)
Par défaut, les nouvelles installations (Ubuntu/Debian) utilisent l'authentification unix_socket pour root.
Cela signifie que l'utilisateur root du systĂšme peut se connecter Ă MariaDB (en tant que root) sans mot de passe :
sudo mysql
Le script vous demandera si vous voulez changer cela pour un mot de passe classique. C'est recommandé si vous avez besoin d'un accÚs root depuis des applications externes (comme DBeaver).
Actions du script
| Question (simplifiée) | Action | Recommandation |
|---|---|---|
| Switch to unix_socket auth? | Change l'auth root. | Non (si vous préférez garder sudo mysql) ou Oui (si vous voulez un mot de passe). |
| Set root password? | Définit un mot de passe pour root (si unix_socket est désactivé). | Oui (Fort) |
| Remove anonymous users? | Supprime les utilisateurs "anonymes". | Oui |
| Disallow root login remotely? | EmpĂȘche root de se connecter depuis une autre machine. | Oui (Bonne pratique) |
| Remove test database? | Supprime la BDD "test". | Oui |
| Reload privilege tables? | Applique les changements. | Oui |
Client CLI (mysql)
L'outil de base pour interagir avec le serveur. (MĂȘme pour MariaDB, l'exĂ©cutable s'appelle mysql pour la compatibilitĂ©).
# Connexion locale (via socket unix) sudo mysql # ou (si auth par mot de passe) mysql -u root -p # Connexion à un serveur distant # -h (host), -u (user), -p (password), -P (Port) mysql -h 192.168.1.50 -u mon_user -p -P 3306 # Se connecter ET sélectionner une BDD mysql -u mon_user -p ma_base_de_donnees # Exécuter une commande rapide mysql -u root -p -e "SHOW DATABASES;"
Dans le client (MariaDB [(none)]>)
-- Voir les bases de données SHOW DATABASES; -- Changer de base USE ma_base_de_donnees; -- (Le prompt devient: MariaDB [ma_base_de_donnees]>) -- Voir les tables SHOW TABLES; -- Quitter EXIT; (ou \q)
Clients GUI (Graphiques)
Pour la gestion visuelle, l'Ă©criture de requĂȘtes complexes et l'exploration des donnĂ©es, un client GUI est indispensable.
DBeaver (Recommandé)
- Plateforme : Windows, macOS, Linux (Java).
- Coût : Gratuit (Community Edition).
- Points forts : Universel (supporte Postgres, SQLite, SQL Server...), autocomplétion puissante, gestion des schémas.
HeidiSQL
- Plateforme : Windows (trÚs léger).
- Coût : Gratuit.
- Points forts : ExtrĂȘmement rapide, simple, gestion des utilisateurs facile, export de donnĂ©es.
PhpMyAdmin
- Plateforme : Web (PHP).
- Coût : Gratuit.
- Points forts : Inclus dans WAMP/XAMPP, accessible de partout (navigateur), bon pour les tĂąches d'administration de base.
Créer une Base de Données
Une base de données (ou "schéma") est un conteneur logique pour vos tables.
-- Syntaxe
CREATE DATABASE [IF NOT EXISTS] nom_database
[CHARACTER SET utf8mb4]
[COLLATE utf8mb4_unicode_ci];
-- Exemple simple
CREATE DATABASE ideo_lab_prod;
-- Exemple complet (Recommandé pour UTF-8)
CREATE DATABASE ideo_lab_crm
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;utf8mb4 est essentiel pour supporter tous les caractĂšres, y compris les emojis đ.
Lister les BDD
SHOW DATABASES; +--------------------+ | Database | +--------------------+ | ideo_lab_crm | | ideo_lab_prod | | information_schema | | mysql | | performance_schema | +--------------------+
Les BDD information_schema, mysql, et performance_schema sont internes Ă MariaDB. Ne pas les modifier.
Sélectionner une BDD
Avant de créer ou d'interroger des tables, vous devez sélectionner votre BDD "contexte".
USE ideo_lab_crm; -- Réponse: Database changed
Supprimer une BDD
ATTENTION : Cette action est irréversible. Elle supprime la BDD et toutes les tables et données qu'elle contient.
DROP DATABASE [IF EXISTS] ideo_lab_prod;
Schéma de travail
1. CREATE DATABASE ideo_lab; (Fait une fois) 2. USE ideo_lab; (Fait Ă chaque session) 3. CREATE TABLE users ...; (Fait une fois) 4. SELECT * FROM users; (Fait tout le temps)
1. CREATE USER
La bonne pratique est de ne **jamais** utiliser root pour une application. Créez un utilisateur dédié pour chaque application.
Un utilisateur est défini par son nom ET son hÎte de connexion ('user'@'host').
'user'@'localhost': Ne peut se connecter que depuis la machine locale (via socket ou 127.0.0.1).'user'@'192.168.1.10': Ne peut se connecter que depuis l'IP 192.168.1.10.'user'@'%': Peut se connecter depuis n'importe quelle IP (Non recommandé si évitable).
-- Crée un utilisateur pour une app web locale
CREATE USER 'app_web'@'localhost'
IDENTIFIED BY 'un_mot_de_passe_tres_fort';
-- Crée un utilisateur pour un accÚs distant (ex: DBeaver)
CREATE USER 'dev_admin'@'%'
IDENTIFIED BY 'un_autre_pass_complique';2. GRANT (Accorder des privilĂšges)
Un utilisateur nouvellement créé n'a **aucun** droit (mĂȘme pas SELECT). Vous devez lui accorder des privilĂšges sur des BDD spĂ©cifiques.
-- Syntaxe GRANT [PRIVILĂGES] ON [BASE].[TABLE] TO [UTILISATEUR]; -- Exemple 1: Donner tous les droits Ă 'app_web' sur la BDD 'ideo_lab_crm' GRANT ALL PRIVILEGES ON ideo_lab_crm.* TO 'app_web'@'localhost'; -- Exemple 2: Donner des droits limitĂ©s (Lecture/Ăcriture) GRANT SELECT, INSERT, UPDATE, DELETE ON ideo_lab_prod.* TO 'app_prod'@'localhost'; -- Exemple 3: Donner un droit de lecture seule sur UNE seule table GRANT SELECT ON ideo_lab_prod.clients TO 'analyste'@'%'; -- Exemple 4: Donner des droits admin globaux (type 'root') GRANT ALL PRIVILEGES ON *.* TO 'dev_admin'@'%' WITH GRANT OPTION; -- (WITH GRANT OPTION lui permet de donner des droits Ă d'autres) -- Appliquer les changements (important sur les anciennes versions) FLUSH PRIVILEGES;
3. Gérer les droits existants
-- Voir les droits d'un utilisateur SHOW GRANTS FOR 'app_web'@'localhost'; +------------------------------------------------------------------+ | Grants for app_web@localhost | +------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'app_web'@'localhost' ... | | GRANT ALL PRIVILEGES ON `ideo_lab_crm`.* TO 'app_web'@'localhost' | +------------------------------------------------------------------+
REVOKE (Retirer des privilĂšges)
-- Retirer le droit de suppression REVOKE DELETE ON ideo_lab_prod.* FROM 'app_prod'@'localhost'; -- Retirer tous les droits REVOKE ALL PRIVILEGES ON ideo_lab_prod.* FROM 'app_prod'@'localhost';
DROP USER (Supprimer un utilisateur)
DROP USER 'app_web'@'localhost';
Anatomie d'une Table
La table est la structure centrale. Elle est définie par ses **colonnes** et leurs **types**.
CREATE TABLE [IF NOT EXISTS] nom_table (
colonne_1 TYPE_DONNEE [OPTIONS],
colonne_2 TYPE_DONNEE [OPTIONS],
...
[CONTRAINTES DE TABLE (ex: PRIMARY KEY)]
) ENGINE=InnoDB; -- (Toujours spécifier le moteur)Options de Colonne
NOT NULL: La colonne ne peut pas ĂȘtre vide (NULL).NULL: La colonne peut ĂȘtre vide (dĂ©faut).DEFAULT [valeur]: Valeur utilisĂ©e siINSERTn'en fournit pas.AUTO_INCREMENT: Pour les clĂ©s primaires. MariaDB gĂšre l'incrĂ©mentation (1, 2, 3...).UNIQUE: Garantit que chaque valeur dans cette colonne est unique.
Contraintes de Table
PRIMARY KEY (colonne): Définit l'identifiant unique de la ligne. C'est la contrainte la plus importante.FOREIGN KEY (col_locale) REFERENCES autre_table(col_externe): Garantit l'intégrité référentielle (Lien).
Exemple : Table "utilisateurs"
-- Assurez-vous d'avoir fait 'USE ideo_lab_crm;'
CREATE TABLE utilisateurs (
-- La Clé Primaire (ID)
id INT(11) NOT NULL AUTO_INCREMENT,
-- Colonnes de données
email VARCHAR(255) NOT NULL,
nom VARCHAR(100) NOT NULL,
prenom VARCHAR(100) NULL,
-- Valeur par défaut
actif BOOLEAN NOT NULL DEFAULT TRUE,
-- Timestamps (bonne pratique)
date_creation DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
-- Contraintes
PRIMARY KEY (id),
UNIQUE KEY (email) -- Garantit un email unique
) ENGINE=InnoDB CHARACTER SET=utf8mb4 COLLATE=utf8mb4_unicode_ci;Voir la structure d'une table
DESCRIBE utilisateurs;
Types Numériques
| Type | Description | Usage |
|---|---|---|
| INT | Entier standard (-2 milliards à +2 milliards). INT(11) ne limite *pas* la taille, c'est un hint d'affichage. | Clés primaires (ID), quantités. |
| BIGINT | Entier large (trĂšs gros chiffres). | ID sur des tables trĂšs volumineuses. |
| SMALLINT | Entier court (-32k Ă +32k). | Petits nombres (ex: statut, Ăąge). |
| TINYINT | Entier trÚs court (-128 à 127). | Booléen (TINYINT(1)) ou flags. |
| DECIMAL(P, S) | Nombre à virgule fixe (précision exacte). Ex: DECIMAL(10, 2) = 10 chiffres au total, 2 aprÚs la virgule. | Monétaire (prix, finance). Ne *jamais* utiliser FLOAT pour de l'argent. |
| FLOAT / DOUBLE | Nombre à virgule flottante (approximatif). | Calculs scientifiques, coordonnées GPS. |
| BOOLEAN | Alias pour TINYINT(1). Stocke 0 (false) ou 1 (true). | Flags (ex: `actif`). |
Types Texte (String)
| Type | Description | Usage |
|---|---|---|
| VARCHAR(N) | Chaßne de longueur variable (max N caractÚres). Ex: VARCHAR(255). | Le plus courant. Noms, emails, titres. Utilise juste l'espace nécessaire. |
| CHAR(N) | Chaßne de longueur fixe (N caractÚres). Si vous stockez "abc" dans un CHAR(10), il stocke "abc " (7 espaces). | Codes (ex: code pays 'FR'), MD5. Rarement utilisé. |
| TEXT | Texte long (max 65k caractĂšres). | Descriptions, commentaires, articles de blog. |
| MEDIUMTEXT | Texte trĂšs long (max 16Mo). | Logs, contenu de corps d'email. |
| LONGTEXT | Texte massif (max 4Go). | Documents volumineux. |
VARCHAR vs TEXT : VARCHAR est stocké "in-line" (plus rapide) si la taille est raisonnable. TEXT est stocké "off-page". Préférez VARCHAR si vous connaissez la limite (ex: < 5000 chars).
Types Date & Heure
| Type | Format Stocké | Usage |
|---|---|---|
| DATETIME | 'YYYY-MM-DD HH:MM:SS' | Date et heure d'un événement (ex: date_creation). |
| TIMESTAMP | 'YYYY-MM-DD HH:MM:SS' (UTC) | Similaire, mais gĂšre les fuseaux horaires (convertit en UTC au stockage). Bon pour date_modification (ON UPDATE CURRENT_TIMESTAMP). |
| DATE | 'YYYY-MM-DD' | Date seule (ex: date de naissance). |
| TIME | 'HH:MM:SS' | Heure seule (ex: heure d'ouverture). |
| YEAR | 'YYYY' | Année seule. |
-- Utiliser les fonctions natives
INSERT INTO commandes (date_commande) VALUES (NOW());
-- (NOW() insĂšre un DATETIME)
-- Utiliser CURRENT_TIMESTAMP par défaut
CREATE TABLE posts (
id INT PRIMARY KEY AUTO_INCREMENT,
contenu TEXT,
cree_le DATETIME DEFAULT CURRENT_TIMESTAMP,
modifie_le TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);Autres Types
| Type | Description | Usage |
|---|---|---|
| JSON | Stocke un document JSON. MariaDB a des fonctions pour interroger ce JSON (JSON_EXTRACT). | Données non structurées, métadonnées, settings. |
| ENUM(...) | Liste de valeurs prédéfinies. Ex: ENUM('bas', 'moyen', 'haut'). | Statuts fixes. Force la validation des données. |
| SET(...) | Similaire Ă ENUM, mais permet de choisir 0, 1 ou plusieurs valeurs. | Options, tags (ex: SET('email', 'sms', 'push')). |
| BLOB | Données binaires (Binary Large Object). | Stocker des images, PDF (Généralement une mauvaise idée, préférez stocker le *chemin* du fichier). |
Permet de modifier la structure d'une table existante. Attention : Sur des tables volumineuses (millions de lignes), un ALTER peut verrouiller la table et prendre des heures.
Ajouter une colonne
ALTER TABLE utilisateurs
ADD COLUMN telephone VARCHAR(20) NULL
AFTER prenom;Supprimer une colonne
ALTER TABLE utilisateurs
DROP COLUMN telephone;Renommer une table
ALTER TABLE utilisateurs
RENAME TO clients;Modifier une colonne (Type, Options)
-- Changer le type (ex: de INT Ă BIGINT)
ALTER TABLE utilisateurs
MODIFY COLUMN id BIGINT NOT NULL AUTO_INCREMENT;
-- Changer le nom ET le type
ALTER TABLE utilisateurs
CHANGE COLUMN nom nom_complet VARCHAR(200) NOT NULL;Ajouter/Supprimer un Index
-- Ajouter un index pour accélérer les recherches sur 'nom'
ALTER TABLE utilisateurs
ADD INDEX idx_nom (nom);
-- Supprimer un index
ALTER TABLE utilisateurs
DROP INDEX idx_nom;Syntaxe ComplĂšte
L'ordre des colonnes doit correspondre Ă l'ordre des valeurs.
-- (Table 'utilisateurs' de l'exemple 4.1)
INSERT INTO utilisateurs (id, email, nom, prenom, actif, date_creation)
VALUES (
NULL, -- Pour l'AUTO_INCREMENT
'jean.dupont@mail.com',
'Dupont',
'Jean',
TRUE,
NOW()
);Syntaxe Courte (Colonnes implicites)
Si vous ne spécifiez pas les colonnes, vous DEVEZ fournir une valeur pour CHAQUE colonne, dans l'ordre de la table. Risqué.
INSERT INTO utilisateurs
VALUES (
NULL, 'marie.martin@mail.com', 'Martin', 'Marie',
TRUE, NOW()
);Syntaxe Recommandée (Colonnes spécifiées)
Permet d'omettre des colonnes (si elles sont NULL ou ont une valeur DEFAULT). L'ordre n'a pas d'importance.
-- On omet 'id' (géré par AUTO_INCREMENT)
-- On omet 'actif' (géré par DEFAULT TRUE)
-- On omet 'date_creation' (géré par DEFAULT NOW())
INSERT INTO utilisateurs (email, nom, prenom)
VALUES (
'luc.durand@mail.com',
'Durand',
'Luc'
);Insertion Multiple
INSERT INTO utilisateurs (email, nom)
VALUES
('alice@mail.com', 'Alice'),
('bob@mail.com', 'Bob'),
('charlie@mail.com', 'Charlie');SELECT (Quelles colonnes ?)
-- Sélectionner TOUTES les colonnes (à éviter en prod)
SELECT * FROM utilisateurs;
-- Sélectionner des colonnes spécifiques
SELECT email, nom, date_creation FROM utilisateurs;
-- Utiliser un alias (AS)
SELECT
id,
email,
CONCAT(prenom, ' ', nom) AS nom_complet
FROM utilisateurs;DISTINCT (Valeurs uniques)
-- Obtenir la liste des noms uniques SELECT DISTINCT nom FROM utilisateurs;
WHERE (Quelles lignes ?)
Le filtre WHERE est la partie la plus importante pour optimiser une requĂȘte.
-- ĂgalitĂ© (utilise un index si 'id' est ClĂ© Primaire) SELECT * FROM utilisateurs WHERE id = 5; -- Texte (sensible Ă la casse par dĂ©faut selon le Collate) SELECT * FROM utilisateurs WHERE nom = 'Dupont'; -- OpĂ©rateurs SELECT * FROM utilisateurs WHERE actif = TRUE; SELECT * FROM commandes WHERE montant > 100; SELECT * FROM commandes WHERE statut != 'livre'; -- AND / OR (Utiliser des parenthĂšses) SELECT * FROM utilisateurs WHERE (nom = 'Dupont' AND actif = TRUE) OR email = 'admin@mail.com'; -- LIKE (Recherche partielle) -- % = N'importe quel caractĂšre (0 ou plus) SELECT * FROM utilisateurs WHERE email LIKE '%@mail.com'; -- Finit par SELECT * FROM utilisateurs WHERE email LIKE 'jean%'; -- Commence par SELECT * FROM utilisateurs WHERE email LIKE '%dupont%'; -- Contient -- IN (Liste de valeurs) SELECT * FROM utilisateurs WHERE id IN (1, 5, 10); -- BETWEEN (Plage) SELECT * FROM commandes WHERE date_creation BETWEEN '2025-01-01' AND '2025-01-31'; -- IS NULL (VĂ©rifier si c'est vide) SELECT * FROM utilisateurs WHERE prenom IS NULL;
ORDER BY (Trier les résultats)
Trie le rĂ©sultat final. Peut ĂȘtre lent sur de grands datasets sans index.
-- Trier par date (plus récent d'abord) SELECT * FROM utilisateurs ORDER BY date_creation DESC; -- Trier par nom (alphabétique) SELECT * FROM utilisateurs ORDER BY nom ASC; -- ASC est le défaut -- Tri multiple SELECT * FROM utilisateurs ORDER BY nom ASC, prenom ASC;
LIMIT & OFFSET (Pagination)
Essentiel pour la pagination (ex: afficher 20 résultats par page).
-- Obtenir les 10 utilisateurs les plus récents SELECT * FROM utilisateurs ORDER BY date_creation DESC LIMIT 10; -- Obtenir la "Page 3" (20 résultats par page) -- (Page 1: LIMIT 20 OFFSET 0) -- (Page 2: LIMIT 20 OFFSET 20) SELECT * FROM utilisateurs ORDER BY id LIMIT 20 OFFSET 40; -- (20 * (Page 3 - 1))
UPDATE (Modifier des lignes)
â ïž ATTENTION : Toujours, toujours, TOUJOURS utiliser une clause WHERE avec UPDATE.
Sans WHERE, la commande mettra Ă jour **TOUTES** les lignes de la table.
-- Syntaxe
UPDATE nom_table
SET colonne_1 = nouvelle_valeur,
colonne_2 = autre_valeur
WHERE condition;
-- Exemple : Mettre Ă jour un utilisateur
UPDATE utilisateurs
SET
email = 'jean.dupont.new@mail.com',
actif = FALSE
WHERE id = 1;
-- Exemple : Augmenter tous les prix de 10%
UPDATE produits
SET prix = prix * 1.10
WHERE categorie = 'electronique';DELETE (Supprimer des lignes)
â ïž DANGER EXTRĂME : Sans WHERE, DELETE supprime **TOUT** le contenu de la table (lentement).
-- Syntaxe DELETE FROM nom_table WHERE condition; -- Exemple : Supprimer un utilisateur DELETE FROM utilisateurs WHERE id = 5; -- Exemple : Nettoyer les logs de plus d'un an DELETE FROM logs WHERE date_log < '2024-01-01';
TRUNCATE (Vider une table)
Si votre but est de vider *entiĂšrement* une table (ex: logs, imports temporaires), n'utilisez pas DELETE. Utilisez TRUNCATE.
TRUNCATE TABLE logs;
TRUNCATE est beaucoup plus rapide (il recrée la table vide) et réinitialise l'AUTO_INCREMENT.
Les jointures permettent de combiner les lignes de deux (ou plus) tables basĂ©es sur une condition (gĂ©nĂ©ralement la liaison ClĂ© Primaire / ClĂ© ĂtrangĂšre).
Table 1 : utilisateurs
id | nom ---|---------- 1 | Alice 2 | Bob 3 | Charlie
Table 2 : commandes
id_cmd | utilisateur_id | montant -------|----------------|--------- 101 | 2 | 50.00 102 | 1 | 75.00 103 | 2 | 25.00 104 | 4 | 100.00 (Utilisateur 4 n'existe pas)
1. INNER JOIN (Intersection)
Ne retourne que les lignes qui ont une correspondance dans les **deux** tables.
[utilisateurs] [commandes]
(1) Alice ------+---- (102) 75.00
(2) Bob ------+---- (101) 50.00
`---- (103) 25.00
(3) Charlie --- (Aucune commande)
(Utilisateur 4 n'existe pas) --- (104) 100.00
SELECT
u.nom,
c.id_cmd,
c.montant
FROM utilisateurs AS u
INNER JOIN commandes AS c ON u.id = c.utilisateur_id;Résultat :
nom | id_cmd | montant ------|--------|--------- Bob | 101 | 50.00 Alice | 102 | 75.00 Bob | 103 | 25.00
Charlie (3) n'apparaĂźt pas (pas de commande). La commande 104 n'apparaĂźt pas (pas d'utilisateur).
2. LEFT JOIN (Garde toute la table de gauche)
Retourne **toutes** les lignes de la table de gauche (utilisateurs), et les correspondances de la table de droite (commandes). S'il n'y a pas de correspondance, les colonnes de droite sont NULL.
SELECT
u.nom,
c.id_cmd,
c.montant
FROM utilisateurs AS u
LEFT JOIN commandes AS c ON u.id = c.utilisateur_id;Résultat :
nom | id_cmd | montant --------|--------|--------- Alice | 102 | 75.00 Bob | 101 | 50.00 Bob | 103 | 25.00 Charlie | NULL | NULL
Charlie (3) apparaßt, avec NULL pour ses commandes. C'est parfait pour trouver "les utilisateurs n'ayant jamais commandé" (WHERE c.id_cmd IS NULL).
Fonctions d'Agrégat
Ces fonctions "résument" plusieurs lignes en une seule valeur.
COUNT(col): Compte le nombre de lignes (non-null).SUM(col): Additionne les valeurs d'une colonne.AVG(col): Calcule la moyenne.MAX(col): Trouve la valeur maximale.MIN(col): Trouve la valeur minimale.
-- Compter le nombre total d'utilisateurs SELECT COUNT(id) FROM utilisateurs; -- Compter le nombre d'utilisateurs actifs SELECT COUNT(id) FROM utilisateurs WHERE actif = TRUE; -- Obtenir le montant total de toutes les commandes SELECT SUM(montant) FROM commandes;
GROUP BY (Regrouper)
GROUP BY combine les agrégats avec des catégories.
-- (Table 'commandes' de l'exemple 6.1)
-- Compter le nombre de commandes PAR utilisateur
SELECT
utilisateur_id,
COUNT(id_cmd) AS nb_commandes
FROM commandes
GROUP BY utilisateur_id;
-- Résultat:
-- utilisateur_id | nb_commandes
-- ----------------|--------------
-- 1 (Alice) | 1
-- 2 (Bob) | 2
-- 4 (Inconnu) | 1
-- Calculer le CA total PAR utilisateur
SELECT
utilisateur_id,
SUM(montant) AS ca_total,
AVG(montant) AS panier_moyen
FROM commandes
GROUP BY utilisateur_id;HAVING (Filtrer *aprĂšs* le GROUP BY)
WHERE filtre les lignes *avant* l'agrégat. HAVING filtre les groupes *aprÚs* l'agrégat.
-- Afficher les utilisateurs ayant dépensé plus de 60
SELECT
utilisateur_id,
SUM(montant) AS ca_total
FROM commandes
GROUP BY utilisateur_id
HAVING ca_total > 60; -- (ou SUM(montant) > 60)
-- Résultat:
-- utilisateur_id | ca_total
-- ----------------|----------
-- 1 (Alice) | 75.00
-- 4 (Inconnu) | 100.00Ă quoi sert un Index ?
Un index est une structure de donnĂ©es (gĂ©nĂ©ralement un Arbre B+) qui permet de trouver des lignes **extrĂȘmement rapidement**, sans avoir Ă scanner toute la table.
Analogie : Un index de base de données est l'index à la fin d'un livre.
Sans index, pour trouver le mot "MariaDB" dans un livre de 500 pages, vous devez lire les 500 pages (Full Table Scan).
Avec un index, vous allez Ă la lettre 'M', trouvez "MariaDB: p. 5, p. 45, p. 210" et sautez directement aux bonnes pages (Index Seek).
Quand indexer ?
- Sur les Clés Primaires (automatiquement indexées).
- Sur les ClĂ©s ĂtrangĂšres (
FOREIGN KEY) (essentiel pour lesJOIN). - Sur les colonnes utilisées dans les
WHERE(ex: `WHERE email = ...`). - Sur les colonnes utilisées dans les
ORDER BY.
InconvĂ©nient : Les index prennent de la place disque et ralentissent les INSERT et UPDATE (car l'index doit aussi ĂȘtre mis Ă jour). N'indexez pas tout !
Types d'Index (Contraintes)
| Type | Description | SQL |
|---|---|---|
| PRIMARY KEY | L'identifiant unique de la ligne. Ne peut pas ĂȘtre NULL. Une seule par table. Toujours indexĂ©. | PRIMARY KEY (id) |
| UNIQUE | Garantit que toutes les valeurs sont uniques (mais peut accepter *plusieurs* NULL). | UNIQUE KEY (email) |
| INDEX | Un index "normal", pour accélérer les recherches. Les doublons sont autorisés. | INDEX idx_nom (nom) |
| Composite | Un index sur plusieurs colonnes (ex: pour WHERE nom='A' AND prenom='B'). | INDEX idx_nom_prenom (nom, prenom) |
Vérifier si un Index est utilisé (EXPLAIN)
EXPLAIN est l'outil le plus important pour l'optimisation. Il vous montre le "plan d'exĂ©cution" (comment MariaDB va exĂ©cuter votre requĂȘte).
EXPLAIN SELECT * FROM utilisateurs WHERE email = 'jean.dupont@mail.com';
Résultat (Bon) :
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra ---|-------------|--------------|------|---------------|-------|---------|-------|------|------- 1 | SIMPLE | utilisateurs | ref | email | email | 258 | const | 1 | Using index
type: ref et rows: 1. MariaDB a utilisé l'index "email" et a trouvé 1 ligne. TrÚs rapide.
EXPLAIN SELECT * FROM utilisateurs WHERE nom = 'Durand'; -- (En supposant qu'il n'y a PAS d'index sur 'nom')
Résultat (Mauvais) :
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra ---|-------------|--------------|-------|---------------|------|---------|-------|--------|---------------- 1 | SIMPLE | utilisateurs | ALL | NULL | NULL | NULL | NULL | 150000 | Using where
type: ALL (Full Table Scan) et rows: 150000. MariaDB a dĂ» lire toute la table. TrĂšs lent.
Solution : CREATE INDEX idx_nom ON utilisateurs (nom);
mysqldump
mysqldump est l'outil CLI standard pour créer un "dump" (export) logique de votre BDD. Il génÚre un gros fichier .sql contenant les CREATE TABLE et INSERT nécessaires pour recréer la base.
Sauvegarder UNE base de données
mysqldump -u [USER] -p [NOM_DB] > backup_db.sql # Exemple mysqldump -u root -p ideo_lab_crm > crm_backup_20251101.sql
Sauvegarder TOUTES les bases
mysqldump -u root -p --all-databases > all_dbs_backup.sql
Sauvegarder (compressé)
(Linux) Il est fortement recommandé de compresser le dump à la volée.
mysqldump -u root -p ideo_lab_crm | gzip > crm_backup.sql.gz
Options importantes
# Dump pour InnoDB avec transactions (recommandé) mysqldump -u root -p \ --single-transaction \ --routines \ --triggers \ ideo_lab_crm > crm_backup.sql
--single-transaction: (Pour InnoDB) Prend un "snapshot" transactionnel de la BDD. Permet de faire le backup sans verrouiller les tables (backup "à chaud").--routines: Inclut les procédures stockées et fonctions.--triggers: Inclut les triggers.
Sauvegarder juste la structure (sans données)
mysqldump -u root -p --no-data ideo_lab_crm > structure_seule.sql
Restauration depuis mysqldump
La restauration se fait via le client mysql standard, en utilisant une redirection d'entrée.
# 1. Créez une BDD vide (si elle n'existe pas) mysql -u root -p -e "CREATE DATABASE ideo_lab_crm;" # 2. Importez le dump mysql -u root -p ideo_lab_crm < crm_backup_20251101.sql
Restauration (compressée)
(Linux) gunzip < crm_backup.sql.gz | mysql -u root -p ideo_lab_crm
Configuration (my.cnf / my.ini)
Le comportement du serveur mysqld est contrÎlé par ce fichier. (Linux: /etc/mysql/my.cnf ou /etc/my.cnf.d/server.cnf).
Toute modification nécessite un redémarrage du service (sudo systemctl restart mariadb).
[mysqld] # Le 'datadir' (oĂč sont les donnĂ©es) datadir=/var/lib/mysql # Networking bind-address = 127.0.0.1 # (Mettre '0.0.0.0' pour Ă©couter sur toutes les interfaces) port = 3306 max_connections = 151 # (Augmenter si besoin) # InnoDB (Le plus important) # La RAM allouĂ©e au cache InnoDB (cache des donnĂ©es et index) # Mettre 50-70% de la RAM totale du serveur innodb_buffer_pool_size = 4G # Logs log_error = /var/log/mysql/error.log # (DĂ©commenter pour le debug de performance) # slow_query_log_file = /var/log/mysql/slow.log # slow_query_log = 1 # long_query_time = 2 # (Pour la rĂ©plication) # server-id = 1 # log-bin = /var/log/mysql/mariadb-bin
Schéma Primaire/Secondaire (Master/Slave)
La réplication asynchrone permet de copier (presque) en temps réel les données d'un serveur "Primaire" (Master) vers un ou plusieurs serveurs "Secondaires" (Slaves).
[Applications (Ăcriture)]
|
| INSERT, UPDATE, DELETE
âŒ
+-----------------------+
| MASTER (Primaire) |
| (Serveur A) |
| |
| 1. Ăcrit dans son |
| "Binary Log" |
| (binlog) |
+-----------------------+
|
| 2. Le Slave demande les nouveaux
| événements du binlog
âŒ
+-----------------------+
| SLAVE (Secondaire) |
| (Serveur B) |
| |
| 3. Ăcrit dans son |
| "Relay Log" |
| |
| 4. "Rejoue" le SQL |
| sur ses données |
+-----------------------+
|
| 5. Lecture seule (Reporting, Backup)
âŒ
[Applications (Lecture)]
[Outils de BI]
[Backups]
Cas d'usage de la réplication
- Scalabilité en lecture (Read Scaling) : L'application écrit sur le Master, mais lit depuis 3 Slaves (répartit la charge de
SELECT). - Analyse / BI (Reporting) : Les requĂȘtes analytiques lourdes (
GROUP BY,JOINcomplexes) sont exécutées sur un Slave dédié, sans impacter la production (le Master). - Sauvegarde (Backup) : On peut faire le
mysqldumpsur le Slave, sans verrouiller ni stresser le Master. - Haute Disponibilité (Failover) : Si le Master tombe, on peut "promouvoir" manuellement (ou via un outil) le Slave pour qu'il devienne le nouveau Master. (Note: la réplication standard est *asynchrone*, une perte de données de quelques secondes est possible).
Ătapes de configuration (RĂ©sumĂ©)
1. Sur le MASTER (Serveur A)
# a. Modifier my.cnf [mysqld] server-id = 1 log-bin = /var/log/mysql/mariadb-bin binlog_format = ROW # b. Redémarrer MariaDB sudo systemctl restart mariadb # c. Créer un utilisateur pour la réplication CREATE USER 'repl_user'@'[IP_DU_SLAVE]' IDENTIFIED BY 'pass_repl'; GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'[IP_DU_SLAVE]'; FLUSH PRIVILEGES; # d. Noter la position du log SHOW MASTER STATUS; -- (Notez le 'File' et 'Position')
2. Sur le SLAVE (Serveur B)
# a. Modifier my.cnf [mysqld] server-id = 2 # (DOIT ĂȘtre diffĂ©rent du Master) relay-log = /var/log/mysql/relay-bin read_only = 1 # (Bonne pratique) # b. RedĂ©marrer MariaDB # c. Configurer le Slave CHANGE MASTER TO MASTER_HOST='[IP_DU_MASTER]', MASTER_USER='repl_user', MASTER_PASSWORD='pass_repl', MASTER_LOG_FILE='[File de SHOW MASTER STATUS]', MASTER_LOG_POS=[Position de SHOW MASTER STATUS]; # d. DĂ©marrer la rĂ©plication START SLAVE; # e. VĂ©rifier SHOW SLAVE STATUS\G
Cherchez Slave_IO_Running: Yes et Slave_SQL_Running: Yes.
CLI (Ligne de commande)
# Connexion mysql -u [user] -p mysql -u [user] -p -h [host] [database] # Sécurisation sudo mysql_secure_installation # Backup mysqldump -u [user] -p [database] > backup.sql mysqldump -u [user] -p --all-databases > all.sql # Restore mysql -u [user] -p [database] < backup.sql
Gestion BDD (dans le client mysql)
SHOW DATABASES; CREATE DATABASE nom_db; DROP DATABASE nom_db; USE nom_db; SHOW TABLES; DESCRIBE nom_table; -- (ou DESC nom_table) SHOW CREATE TABLE nom_table; EXIT; (\q)
DDL (Data Definition Language) - Structure
-- Créer une table
CREATE TABLE nom_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
age INT DEFAULT 18,
categorie_id INT,
FOREIGN KEY (categorie_id) REFERENCES categories(id)
) ENGINE=InnoDB;
-- Modifier une table
ALTER TABLE nom_table
ADD COLUMN date_ajout DATETIME,
MODIFY COLUMN nom VARCHAR(150),
DROP COLUMN age;
-- Ajouter un index
CREATE INDEX idx_nom ON nom_table (nom);
-- Vider une table (rapide)
TRUNCATE TABLE nom_table;
-- Supprimer une table
DROP TABLE nom_table;DML (Data Manipulation Language) - Données
-- Insérer
INSERT INTO nom_table (col1, col2) VALUES ('val1', 'val2');
INSERT INTO nom_table (col1, col2) VALUES ('a', 1), ('b', 2);
-- Lire
SELECT * FROM nom_table;
SELECT col1, col2 FROM nom_table;
SELECT * FROM nom_table WHERE col1 = 'val1';
SELECT * FROM nom_table WHERE col2 > 10 AND col1 LIKE 'A%';
SELECT * FROM nom_table WHERE col3 IN ('A', 'B', 'C');
SELECT * FROM nom_table WHERE col4 IS NOT NULL;
SELECT * FROM nom_table ORDER BY col1 DESC LIMIT 10 OFFSET 20;
-- Mettre Ă jour (TOUJOURS avec WHERE)
UPDATE nom_table SET col1 = 'new_val' WHERE id = 5;
-- Supprimer (TOUJOURS avec WHERE)
DELETE FROM nom_table WHERE id = 5;
-- Jointures
SELECT *
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.t1_id;
SELECT *
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.t1_id
WHERE t2.t1_id IS NULL; -- (Lignes de t1 sans t2)
-- Agrégats
SELECT col1, COUNT(id), SUM(montant)
FROM nom_table
WHERE col2 = 'val'
GROUP BY col1
HAVING COUNT(id) > 2;DCL (Data Control Language) - Utilisateurs
-- Créer un utilisateur CREATE USER 'user'@'host' IDENTIFIED BY 'password'; -- Donner des droits GRANT ALL PRIVILEGES ON db_name.* TO 'user'@'host'; GRANT SELECT, INSERT ON db_name.table_name TO 'user'@'host'; GRANT USAGE ON *.* TO 'user'@'host'; -- (Droit de connexion seul) -- Appliquer les droits FLUSH PRIVILEGES; -- Voir les droits SHOW GRANTS FOR 'user'@'host'; -- Retirer des droits REVOKE DELETE ON db_name.* FROM 'user'@'host'; -- Supprimer un utilisateur DROP USER 'user'@'host';
