Aller au contenu
medium

Prise en main du client mysql : administrer MySQL en ligne de commande

29 min de lecture

Vous avez installé MySQL, le service tourne, systemctl status mysql affiche active (running). Maintenant, il faut entrer dedans. Comment lister les bases existantes ? Voir la structure d’une table ? Exécuter une requête, exporter un résultat en CSV, ou lancer un script SQL automatisé ?

mysql est le client en ligne de commande officiel de MySQL. C’est l’outil quotidien de l’administrateur : exploration des bases et des tables, exécution de requêtes, import/export de données, et scripting en mode batch. Contrairement à psql (PostgreSQL), les commandes d’exploration passent par des instructions SHOW et des vues INFORMATION_SCHEMA plutôt que par des méta-commandes.

  • Se connecter à MySQL en local (socket Unix) et en réseau (TCP/IP, login-path)
  • Explorer la structure d’une instance avec SHOW, DESCRIBE et INFORMATION_SCHEMA
  • Formater la sortie : mode vertical (\G), pager, export vers fichier avec tee
  • Importer et exporter des données avec LOAD DATA, SELECT INTO OUTFILE et mysqlimport
  • Scripter des tâches d’administration avec le mode batch (-e, redirection, source)

Le client mysql est l’outil que vous utiliserez dans toutes ces situations :

  • Vous venez d’installer MySQL et voulez vérifier ce qui existe sur l’instance
  • Vous devez créer une base et des tables pour une nouvelle application
  • Vous administrez un serveur et avez besoin de connaître la taille des bases, les connexions actives ou les variables critiques
  • Vous devez importer un fichier CSV ou exporter des résultats pour un collègue
  • Vous automatisez des tâches d’administration dans un script shell (migration, rapport, nettoyage)
  • Vous devez diagnostiquer un problème de performance ou de connexion en production
  • MySQL installé et le service actif (voir le guide Installation)
  • Un compte avec les droits suffisants (root ou un compte d’administration créé lors de l’installation)

Vérification rapide :

Fenêtre de terminal
mysql --version
mysql Ver 8.4.5 for Linux on x86_64 (MySQL Community Server - GPL)

La méthode la plus courante sur le serveur lui-même. La connexion passe par un socket Unix — pas de réseau, pas de chiffrement nécessaire :

Fenêtre de terminal
mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.4.5 MySQL Community Server - GPL
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

Le prompt mysql> indique que vous êtes connecté. Contrairement à PostgreSQL, MySQL n’a pas de prompt différent pour les superusers.

Pour se connecter directement à une base spécifique :

Fenêtre de terminal
mysql -u root -p labdb

Pour une connexion depuis un autre serveur ou en forçant TCP (utile quand le socket n’est pas accessible) :

Fenêtre de terminal
mysql -h 192.168.122.70 -P 3306 -u labadmin -p labdb
OptionDescription
-hAdresse du serveur (hostname ou IP)
-PPort (3306 par défaut)
-uNom d’utilisateur
-pDemander le mot de passe (sans espace après -p)
labdbBase de données à sélectionner au démarrage

Plutôt que de taper les options de connexion à chaque fois, créez un fichier ~/.my.cnf :

[client]
user=labadmin
password=MotDePasseFort!2026
host=127.0.0.1
port=3306

Protégez immédiatement les permissions :

Fenêtre de terminal
chmod 600 ~/.my.cnf

Sur Unix, MySQL ignore les fichiers de configuration world-writable — le chmod 600 est donc indispensable, pas optionnel.

Ensuite, une simple commande suffit :

Fenêtre de terminal
mysql labdb

mysql_config_editor : identifiants chiffrés (login-path)

Section intitulée « mysql_config_editor : identifiants chiffrés (login-path) »

MySQL fournit un outil dédié pour stocker les identifiants de manière sécurisée :

Fenêtre de terminal
mysql_config_editor set --login-path=lab --host=127.0.0.1 --user=labadmin --password

L’outil demande le mot de passe et le stocke chiffré dans ~/.mylogin.cnf. Pour l’utiliser :

Fenêtre de terminal
mysql --login-path=lab labdb

Pour lister les profils enregistrés :

Fenêtre de terminal
mysql_config_editor print --all
[lab]
user = labadmin
password = *****
host = 127.0.0.1

Le mot de passe est masqué — il n’est jamais affiché en clair.

Une fois connecté, vérifiez toujours où vous êtes :

\s
--------------
mysql Ver 8.4.5 for Linux on x86_64 (MySQL Community Server - GPL)
Connection id: 12
Current database: labdb
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 8.4.5 MySQL Community Server - GPL
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
UNIX socket: /var/run/mysqld/mysqld.sock
Binary data as: Hexadecimal
Uptime: 2 hours 15 min 32 sec

Connection: Localhost via UNIX socket confirme la connexion locale. Current database: labdb montre la base active.

Contrairement à PostgreSQL qui utilise des méta-commandes (\l, \dt, \d), MySQL s’appuie sur des instructions SHOW et des vues dans INFORMATION_SCHEMA.

Lister toutes les bases de données de l’instance :

SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| labdb |
| mysql |
| performance_schema |
| sys |
+--------------------+
BaseRôle
information_schemaCatalogue virtuel — métadonnées sur toutes les tables, colonnes, index
mysqlTables système : comptes, privilèges, data dictionary
performance_schemaInstrumentation interne : requêtes, verrous, I/O, threads
sysVues simplifiées au-dessus de performance_schema (lisibles par un humain)
labdbVotre base de données applicative
USE labdb;
Database changed

Toutes les requêtes suivantes s’exécutent dans le contexte de labdb — pas besoin de préfixer les noms de tables.

Lister les tables de la base active :

SHOW TABLES;
+-----------------+
| Tables_in_labdb |
+-----------------+
| clients |
| commandes |
| deploiements |
| environnements |
| services |
+-----------------+

Voir les colonnes d’une table :

SHOW COLUMNS FROM clients;
+-------------+--------------+------+-----+-----------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+-----------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| nom | varchar(100) | NO | | NULL | |
| email | varchar(200) | NO | UNI | NULL | |
| equipe | varchar(50) | YES | | NULL | |
| inscription | date | YES | | curdate() | |
+-------------+--------------+------+-----+-----------+----------------+

L’alias DESCRIBE (ou DESC) produit le même résultat :

DESC clients;

Pour voir la requête CREATE TABLE exacte, y compris le moteur de stockage, le charset et les contraintes :

SHOW CREATE TABLE clients\G
*************************** 1. row ***************************
Table: clients
Create Table: CREATE TABLE `clients` (
`id` int NOT NULL AUTO_INCREMENT,
`nom` varchar(100) NOT NULL,
`email` varchar(200) NOT NULL,
`equipe` varchar(50) DEFAULT NULL,
`inscription` date DEFAULT (curdate()),
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

C’est la commande la plus utile pour reproduire une table sur un autre serveur ou comprendre sa configuration exacte (moteur InnoDB, charset utf8mb4, collation).

SHOW INDEX FROM clients\G
*************************** 1. row ***************************
Table: clients
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 10
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
Visible: YES
Expression: NULL
*************************** 2. row ***************************
Table: clients
Non_unique: 0
Key_name: email
Seq_in_index: 1
Column_name: email
Collation: A
Cardinality: 10
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
Visible: YES
Expression: NULL

INFORMATION_SCHEMA est un standard SQL implémenté par MySQL. Il expose les métadonnées sous forme de tables virtuelles interrogeables avec du SQL classique :

Taille des bases :

SELECT table_schema AS base,
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS taille_mb
FROM information_schema.TABLES
GROUP BY table_schema
ORDER BY taille_mb DESC;
+--------------------+-----------+
| base | taille_mb |
+--------------------+-----------+
| mysql | 2.67 |
| labdb | 0.22 |
| sys | 0.02 |
| information_schema | 0.00 |
| performance_schema | 0.00 |
+--------------------+-----------+

Taille détaillée par table :

SELECT table_name,
ROUND((data_length + index_length) / 1024, 2) AS taille_ko,
table_rows AS lignes_estimees
FROM information_schema.TABLES
WHERE table_schema = 'labdb'
ORDER BY (data_length + index_length) DESC;
+----------------+-----------+-----------------+
| table_name | taille_ko | lignes_estimees |
+----------------+-----------+-----------------+
| deploiements | 48.00 | 20 |
| commandes | 48.00 | 15 |
| services | 32.00 | 8 |
| clients | 32.00 | 10 |
| environnements | 32.00 | 4 |
+----------------+-----------+-----------------+

Lister les colonnes d’une table :

SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.COLUMNS
WHERE table_schema = 'labdb' AND table_name = 'clients'
ORDER BY ordinal_position;
+-------------+-----------+-------------+----------------+
| column_name | data_type | is_nullable | column_default |
+-------------+-----------+-------------+----------------+
| id | int | NO | NULL |
| nom | varchar | NO | NULL |
| email | varchar | NO | NULL |
| equipe | varchar | YES | NULL |
| inscription | date | YES | curdate() |
+-------------+-----------+-------------+----------------+

Performance Schema instrumente le serveur en temps réel. La base sys offre des vues simplifiées par-dessus :

Connexions actives :

SELECT * FROM sys.session\G

Requêtes les plus lentes (top 10) :

SELECT query, exec_count, avg_latency, rows_examined_avg
FROM sys.statements_with_runtimes_in_95th_percentile
LIMIT 10;

Tables les plus accédées :

SELECT table_schema, table_name, rows_fetched, rows_inserted, rows_updated, rows_deleted
FROM sys.schema_table_statistics
WHERE table_schema = 'labdb'
ORDER BY rows_fetched DESC;

Tableau récapitulatif des commandes d’exploration

Section intitulée « Tableau récapitulatif des commandes d’exploration »
CommandeDescription
SHOW DATABASES;Lister les bases de données
USE <base>;Changer de base active
SHOW TABLES;Lister les tables de la base active
SHOW COLUMNS FROM <table>;Colonnes, types, clés, défauts
DESC <table>;Alias de SHOW COLUMNS
SHOW CREATE TABLE <table>\GDDL complet (moteur, charset, contraintes)
SHOW INDEX FROM <table>\GIndex, cardinalité, type
SHOW TABLE STATUS\GTaille, moteur, lignes estimées
SHOW VARIABLES LIKE 'pattern';Variables de configuration serveur
SHOW GLOBAL STATUS LIKE 'pattern';Compteurs de statut serveur
SHOW PROCESSLIST;Connexions actives et requêtes en cours

Le mode par défaut affiche les résultats en tableau horizontal. Pour les résultats larges (beaucoup de colonnes), le mode vertical avec \G est beaucoup plus lisible :

-- Mode tableau (défaut)
SELECT * FROM clients WHERE id = 1;
+----+---------+-------------------+--------+-------------+
| id | nom | email | equipe | inscription |
+----+---------+-------------------+--------+-------------+
| 1 | Alice | alice@devops.lab | SRE | 2026-01-15 |
+----+---------+-------------------+--------+-------------+
-- Mode vertical
SELECT * FROM clients WHERE id = 1\G
*************************** 1. row ***************************
id: 1
nom: Alice
email: alice@devops.lab
equipe: SRE
inscription: 2026-01-15

Le \G remplace le ; en fin de requête — ne mettez pas les deux.

Pour paginer les résultats longs (comme less en shell) :

pager less -S;
SHOW GLOBAL STATUS;
nopager;

Pour capturer toute la session dans un fichier (requêtes + résultats) :

tee /tmp/session-mysql.log
-- vos requêtes ici...
notee

Le fichier /tmp/session-mysql.log contiendra l’intégralité de vos commandes et leurs résultats — utile pour documenter une session de diagnostic.

OptionEffet
-t ou --tableForce le mode tableau (défaut en interactif)
-E ou --verticalForce le mode vertical pour toutes les requêtes
-N ou --skip-column-namesSupprime les en-têtes de colonnes
-B ou --batchMode batch (pas de tableau, valeurs séparées par tabulation)
--xmlSortie en XML
--htmlSortie en HTML

Tapez votre SQL suivi de ; ou \G :

SELECT nom, equipe, inscription FROM clients ORDER BY inscription;
+---------+----------+-------------+
| nom | equipe | inscription |
+---------+----------+-------------+
| Alice | SRE | 2026-01-15 |
| Bob | Backend | 2026-02-20 |
| Claire | Frontend | 2026-03-10 |
| David | SRE | 2026-03-28 |
| Eva | DevOps | 2026-04-01 |
+---------+----------+-------------+

Les requêtes multi-lignes sont supportées — MySQL attend le ; final :

SELECT c.nom, COUNT(d.id) AS nb_deploy
FROM clients c
JOIN deploiements d ON d.responsable = c.nom
GROUP BY c.nom
ORDER BY nb_deploy DESC;

Pour exécuter une requête depuis le shell (scripts, cron, CI/CD) :

Fenêtre de terminal
mysql -u root -p labdb -e "SELECT nom, equipe FROM clients;"
+---------+----------+
| nom | equipe |
+---------+----------+
| Alice | SRE |
| Bob | Backend |
| Claire | Frontend |
| David | SRE |
| Eva | DevOps |
+---------+----------+

Pour un résultat sans tableau (exploitable par un script) :

Fenêtre de terminal
mysql -u root -p labdb -BNe "SELECT COUNT(*) FROM clients;"
5
OptionEffet
-BMode batch (séparateur tabulation, pas de bordures)
-NPas d’en-têtes de colonnes
-e "..."Exécuter la requête et quitter

Pour rediriger un fichier SQL complet :

Fenêtre de terminal
mysql -u root -p labdb < /tmp/rapport.sql

source : exécuter un fichier SQL depuis le client

Section intitulée « source : exécuter un fichier SQL depuis le client »

Depuis le prompt mysql> :

source /tmp/01-sample-data.sql

Ou avec le raccourci :

\. /tmp/01-sample-data.sql

C’est l’équivalent MySQL de \i dans psql. Le fichier est lu et exécuté ligne par ligne.

CREATE DATABASE mon_projet CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE mon_projet;
CREATE TABLE utilisateurs (
id INT AUTO_INCREMENT PRIMARY KEY,
login VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(200) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

MySQL avec InnoDB supporte les transactions ACID :

BEGIN;
INSERT INTO clients (nom, email, equipe) VALUES ('Test Rollback', 'test@lab.dev', 'QA');
SELECT COUNT(*) AS total FROM clients;
+-------+
| total |
+-------+
| 11 |
+-------+

L’insertion est visible dans la transaction. Annulons :

ROLLBACK;
SELECT COUNT(*) AS total FROM clients;
+-------+
| total |
+-------+
| 10 |
+-------+

autocommit : comprendre le comportement par défaut

Section intitulée « autocommit : comprendre le comportement par défaut »

Par défaut, MySQL exécute chaque requête dans sa propre transaction — c’est le mode autocommit :

SELECT @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+

Chaque INSERT, UPDATE ou DELETE est immédiatement commité. Pour grouper des opérations dans une transaction, utilisez BEGIN / START TRANSACTION :

START TRANSACTION;
-- vos modifications ici...
COMMIT; -- ou ROLLBACK;

DROP supprime un objet :

DROP TABLE IF EXISTS utilisateurs;
DROP DATABASE IF EXISTS mon_projet;

IF EXISTS évite une erreur si l’objet n’existe pas — recommandé dans les scripts.

LOAD DATA INFILE : import depuis un fichier sur le serveur

Section intitulée « LOAD DATA INFILE : import depuis un fichier sur le serveur »

LOAD DATA INFILE est la méthode la plus rapide pour charger des données massives. Le fichier doit être sur le serveur :

LOAD DATA INFILE '/tmp/clients.csv'
INTO TABLE clients
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(nom, email, equipe);

SELECT INTO OUTFILE : export vers un fichier sur le serveur

Section intitulée « SELECT INTO OUTFILE : export vers un fichier sur le serveur »
SELECT nom, email, equipe
INTO OUTFILE '/tmp/export_clients.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM clients;

Le fichier est créé sur le serveur avec les permissions de l’utilisateur MySQL (mysql). Pour ajouter un en-tête CSV, combinez avec UNION :

SELECT 'nom', 'email', 'equipe'
UNION ALL
SELECT nom, email, equipe
INTO OUTFILE '/tmp/export_clients_header.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM clients;

mysqlimport est un wrapper shell autour de LOAD DATA INFILE. Le nom du fichier doit correspondre au nom de la table :

Fenêtre de terminal
mysqlimport -u root -p --local --fields-terminated-by=',' \
--lines-terminated-by='\n' --ignore-lines=1 \
labdb /tmp/clients.csv

mysqlimport retire l’extension du fichier et utilise le nom restant comme nom de table. Ici, /tmp/clients.csv → table clients de la base labdb.

Pour exporter une base entière (structure + données) en SQL :

Fenêtre de terminal
mysqldump -u root -p labdb > /tmp/labdb_backup.sql

Pour n’exporter que la structure (sans les données) :

Fenêtre de terminal
mysqldump -u root -p --no-data labdb > /tmp/labdb_schema.sql

Pour exporter une seule table :

Fenêtre de terminal
mysqldump -u root -p labdb clients > /tmp/clients_backup.sql

Le guide Sauvegarde et restauration explore en détail toutes les options de mysqldump.

MySQL Shell est le client nouvelle génération fourni par Oracle. Il apporte des fonctionnalités absentes du client mysql classique :

Fonctionnalitémysql (classique)mysqlsh
Mode SQLOuiOui
Mode JavaScriptNonOui
Mode PythonNonOui
Complétion avancéeBasiqueOui (tables, colonnes, fonctions)
Export parallèleNonutil.dumpInstance() multi-thread
Import parallèleNonutil.loadDump() multi-thread
AdminAPI (InnoDB Cluster)NonOui
X ProtocolNonOui (port 33060)

Pour l’installer :

Fenêtre de terminal
sudo apt install mysql-shell # Debian/Ubuntu
sudo dnf install mysql-shell # RHEL/Rocky

Connexion en mode SQL :

Fenêtre de terminal
mysqlsh --sql -u root -p -h localhost
-- Voir une variable de configuration
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
-- Voir un compteur de statut
SHOW GLOBAL STATUS LIKE 'Threads_connected';
-- Plusieurs variables à la fois
SHOW VARIABLES WHERE Variable_name IN ('max_connections', 'wait_timeout', 'interactive_timeout');
SHOW PROCESSLIST;
+----+---------+-----------+-------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+---------+-----------+-------+---------+------+----------+------------------+
| 12 | root | localhost | labdb | Query | 0 | starting | SHOW PROCESSLIST |
+----+---------+-----------+-------+---------+------+----------+------------------+

Pour une vue plus complète (requêtes longues, verrous) :

SHOW FULL PROCESSLIST\G
SELECT table_schema AS 'Base',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Taille (Mo)',
COUNT(*) AS 'Tables'
FROM information_schema.TABLES
GROUP BY table_schema
ORDER BY SUM(data_length + index_length) DESC;
SymptômeCause probableSolution
ERROR 1045 (28000): Access denied for user 'root'@'localhost'Mot de passe incorrectVérifier le mot de passe ou réinitialiser (voir guide Installation)
ERROR 2002 (HY000): Can't connect to local MySQL server through socketService MySQL non démarré ou socket absentsudo systemctl start mysql
ERROR 2003 (HY000): Can't connect to MySQL server on 'host'Connexion réseau refuséeVérifier bind_address et le pare-feu
ERROR 1049 (42000): Unknown database 'xxx'La base n’existe pasSHOW DATABASES; pour lister les bases disponibles
ERROR 3948 (42000): Loading local data is disabledlocal_infile désactivéSET GLOBAL local_infile = ON; + reconnecter avec --local-infile=1
Le prompt affiche -> au lieu de mysql>Requête non terminée (manque ;)Tapez ; pour terminer ou \c pour annuler
  • Le client mysql est l’outil d’administration quotidien — les commandes SHOW et INFORMATION_SCHEMA remplacent les méta-commandes de psql.
  • La connexion locale passe par un socket Unix — pas besoin de réseau ni de mot de passe sur certaines configurations.
  • mysql_config_editor stocke les identifiants chiffrés dans ~/.mylogin.cnf — préférez-le au mot de passe en clair dans ~/.my.cnf.
  • Le mode vertical \G remplace le ; et rend les résultats larges lisibles.
  • Le mode batch (-BNe) produit une sortie exploitable par les scripts shell — indispensable pour l’automatisation.
  • Le DDL MySQL provoque un COMMIT implicite — pas de ROLLBACK possible après un CREATE TABLE ou un DROP TABLE. MySQL 8.4 supporte l’atomic DDL (un DDL échoué est entièrement annulé), mais ce n’est pas du DDL transactionnel à la PostgreSQL.
  • LOAD DATA INFILE est la méthode la plus rapide pour les imports massifs. mysql_config_editor sécurise les identifiants pour les scripts automatisés.
  • La base sys offre des vues simplifiées au-dessus de performance_schema — utilisez-la en premier pour le diagnostic.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn