phpMyAdmin est pratique, mais au-delà d'un dump de quelques dizaines de mégaoctets, il atteint ses limites (timeouts PHP, upload_max_filesize, etc.). La ligne de commande est plus rapide, plus fiable et permet d'automatiser. Sur nos hébergements Plesk, l'accès SSH est disponible — les clients mysql et mysqldump sont préinstallés.
Récupérer ses identifiants
Dans Plesk : Bases de données > choisir la base > User Settings. Vous obtenez :
- Nom de la base (ex :
monclient_prod) - Utilisateur (ex :
monclient_user) - Mot de passe
- Hôte — en général
localhostsi vous êtes sur le même serveur que la base.
Se connecter
# Connexion interactive (mot de passe demandé)
mysql -u monclient_user -p monclient_prod
# En précisant l'hôte si la base est distante
mysql -h bdd.exemple.fr -u monclient_user -p monclient_prod
Une fois connecté, le prompt change : MariaDB [monclient_prod]>. Les commandes se terminent par ;. Tapez exit ou Ctrl+D pour quitter.
-p seul demande le mot de passe interactivement. -pMOTDEPASSE (collé, sans espace) fonctionne mais fait apparaître le mot de passe dans l'historique shell et dans ps. À proscrire.
Utiliser un fichier d'options (plus sûr)
Créez ~/.my.cnf dans votre home SSH :
[client]
user=monclient_user
password=votre_mot_de_passe
host=localhost
Puis protégez-le : chmod 600 ~/.my.cnf. Les commandes mysql et mysqldump liront automatiquement ce fichier — plus besoin de taper les identifiants.
Commandes essentielles
Explorer la structure
-- Lister les bases accessibles
SHOW DATABASES;
-- Choisir une base
USE monclient_prod;
-- Lister les tables
SHOW TABLES;
-- Voir la structure d'une table
DESCRIBE wp_options;
-- ou plus complet :
SHOW CREATE TABLE wp_options;
-- Voir les index
SHOW INDEX FROM wp_posts;
Requêtes de base
-- Lire
SELECT id, option_name, option_value
FROM wp_options
WHERE option_name LIKE 'siteurl';
-- Compter
SELECT COUNT(*) FROM wp_posts WHERE post_status = 'publish';
-- Modifier (toujours tester avec un SELECT d'abord !)
UPDATE wp_options
SET option_value = 'https://monsite.fr'
WHERE option_name = 'siteurl';
-- Supprimer
DELETE FROM wp_commentmeta WHERE meta_key = 'akismet_result';
-- Insérer
INSERT INTO wp_options (option_name, option_value, autoload)
VALUES ('ma_cle', 'ma_valeur', 'no');
START TRANSACTION; avant la requête, puis SELECT de contrôle, puis COMMIT; (ou ROLLBACK; si ça ne va pas). Fonctionne sur toutes les tables InnoDB.
Dump (sauvegarde) avec mysqldump
La commande à retenir :
mysqldump -u monclient_user -p \
--single-transaction \
--default-character-set=utf8mb4 \
monclient_prod > backup.sql
Options utiles
| Option | Rôle |
|---|---|
--single-transaction | Dump cohérent sur InnoDB sans verrouiller les tables (aucun impact sur la prod). |
--default-character-set=utf8mb4 | Évite les problèmes d'encodage (émojis, accents) sur WordPress moderne. |
--no-tablespaces | Indispensable sur MySQL 8 en hébergement mutualisé — PROCESS n'est pas accordé aux utilisateurs, le dump échoue sans cette option. |
--routines --events --triggers | Inclut les procédures stockées, événements et triggers. |
--skip-lock-tables | Pour MyISAM quand on ne peut pas verrouiller (rare sur un hébergement moderne). |
--compact | Dump plus léger, sans les commentaires. |
Compresser à la volée
mysqldump --single-transaction monclient_prod | gzip > backup.sql.gz
# Variante zstd, plus rapide et meilleure compression
mysqldump --single-transaction monclient_prod | zstd -o backup.sql.zst
Un dump WordPress typique est divisé par ~5 après gzip.
Dump d'une seule table
mysqldump --single-transaction monclient_prod wp_posts > wp_posts.sql
# Uniquement la structure (sans données)
mysqldump --no-data monclient_prod > schema.sql
# Uniquement les données (sans structure)
mysqldump --no-create-info monclient_prod > data.sql
Restaurer un dump
# Fichier SQL brut
mysql -u monclient_user -p monclient_prod < backup.sql
# Dump compressé gzip
gunzip < backup.sql.gz | mysql -u monclient_user -p monclient_prod
# Dump zstd
zstd -dc backup.sql.zst | mysql -u monclient_user -p monclient_prod
.sql peut contenir des DROP TABLEmysqldump écrit des DROP TABLE IF EXISTS avant chaque CREATE TABLE. Restaurer un dump écrase donc les tables existantes. Toujours dumper la base actuelle avant d'en restaurer une autre par-dessus.
Trouver les plus grosses tables
Utile pour identifier une table de logs qui a gonflé, des wp_options pollués par des transients, etc.
SELECT
table_name AS 'Table',
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Taille (Mo)',
table_rows AS 'Lignes'
FROM information_schema.TABLES
WHERE table_schema = 'monclient_prod'
ORDER BY (data_length + index_length) DESC
LIMIT 20;
Taille totale d'une base
SELECT
table_schema AS 'Base',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Taille (Mo)'
FROM information_schema.TABLES
WHERE table_schema = 'monclient_prod'
GROUP BY table_schema;
Exécuter une requête en une ligne
Pratique dans un script ou un cron :
mysql -u monclient_user -p monclient_prod -e "SELECT COUNT(*) FROM wp_posts;"
# Export d'une requête en CSV (séparateur tabulation)
mysql -u monclient_user -p monclient_prod \
-e "SELECT id, post_title FROM wp_posts WHERE post_status='publish';" \
> posts.tsv
Cas fréquent : migrer une base entre deux serveurs
Sur l'ancien hébergement :
mysqldump --single-transaction --default-character-set=utf8mb4 \
ancienne_base | gzip > dump.sql.gz
Transfert :
scp dump.sql.gz user@nouveau-serveur:/home/user/
Sur le nouveau serveur :
gunzip < dump.sql.gz | mysql -u nouveau_user -p nouvelle_base
Pour WordPress, pensez à adapter siteurl et home après restauration, et à remplacer les URLs sérialisées avec WP-CLI : wp search-replace 'https://ancien.fr' 'https://nouveau.fr' --all-tables.