Un inspecteur prudent des tables de base de données WordPress qui refuse de deviner.
Inspectez les tables personnalisées d’un site WordPress, distinguez les propriétaires encore installés de ceux qui sont absents, examinez les schémas inconnus et supprimez les tables sélectionnées au moyen d’un processus verrouillé par défaut, avec revalidation côté serveur et journal d’audit local.
Caution
La suppression d’une table de base de données est irréversible sans sauvegarde testée et restaurable. CleanMySQL ajoute des protections autour de DROP TABLE, mais ne peut pas rendre sûre une suppression qui n’a pas été vérifiée.
Un site WordPress ancien ou très actif conserve souvent des tables créées par des extensions ou des thèmes qui ne sont plus présents. La difficulté n’est pas de dresser la liste de ces tables. Elle consiste à déterminer si une table est réellement orpheline sans confondre une extension désactivée, un composant partagé, un importateur ou une simple référence trouvée dans le code avec une preuve suffisante pour autoriser sa suppression.
CleanMySQL aborde ce problème avec prudence. Il inventorie les extensions encore présentes sur le disque, analyse localement les fichiers sources admissibles, observe les requêtes qui modifient la structure de la base de données dans des contextes WordPress contrôlés, applique des signatures de propriété documentées et examine les métadonnées SQL. Lorsque les preuves disponibles sont incomplètes ou contradictoires, la table reste verrouillée.
Le plugin est volontairement plus spécialisé qu’un outil général d’optimisation de base de données. Il ne supprime ni révisions, ni transients, ni options, ni commentaires, ni médias, ni lignes arbitraires. Sa responsabilité se limite à l’identification et à la suppression contrôlée de tables de base de données.
| Domaine | Ce que fournit CleanMySQL |
|---|---|
| Propriété | États actif, inactif, absent, partagé, cœur de WordPress et inconnu |
| Détection | Analyse du code installé, attribution à l’exécution, signatures documentées et indices issus du schéma |
| Sécurité | Capacités WordPress, nonces, confirmations saisies, identifiants stricts et nouvelle classification côté serveur |
| Tables inconnues | Inspection du schéma en lecture seule, étiquettes privées et suppression individuelle renforcée |
| Traçabilité | Journal local limité, statistiques cumulées, colonnes triables et export CSV |
| Confidentialité | Aucune télémétrie, publicité, recherche distante de propriétaire ou transmission de schéma |
| Multisite | Administration réseau uniquement et état du plugin enregistré au niveau du réseau |
CleanMySQL distingue les preuves de propriété de l’autorisation de supprimer. Reconnaître un préfixe familier peut aider, mais ne suffit pas à lui seul.
| Classification | Signification | Action par défaut |
|---|---|---|
| Cœur de WordPress | L’objet appartient à WordPress | Toujours verrouillé |
| Extension active | Le propriétaire est installé et actif | Conserver |
| Extension inactive | Le propriétaire est installé mais désactivé | Conserver |
| Composant partagé | Plusieurs produits peuvent légitimement utiliser cette famille de tables | Verrouiller |
| Propriétaire absent avec preuve fiable | Le propriétaire n’est plus installé et l’attribution est solide | Suppression groupée possible après vérification |
| Inconnu | Aucun propriétaire fiable ne peut être établi | Exclu de la suppression groupée, à examiner individuellement |
| Vue SQL | L’objet est une vue et non une table physique | Toujours verrouillé |
Une extension inactive n’est pas considérée comme supprimée. Ses fichiers sont toujours présents, elle peut être réactivée et ses tables restent donc protégées.
L’analyse est entièrement locale. CleanMySQL n’envoie aucun nom de fichier, nom de table, schéma SQL ou renseignement d’utilisation vers un service externe.
flowchart LR
A[Extensions, mu-plugins, drop-ins et thèmes installés] --> B[Inventaire des propriétaires]
B --> C[Scanner de code reprenable]
C --> D[Preuves issues du code source]
E[Signatures documentées de tables] --> F[Classificateur prudent]
G[Attribution observée à l’exécution] --> F
H[Métadonnées SQL et indices du schéma] --> F
D --> F
F --> I{Décision}
I -->|Installé, partagé ou cœur| J[Verrouillé]
I -->|Propriétaire absent avec preuve fiable| K[Candidate à la suppression]
I -->|Inconnu| L[Inspection ou confirmation individuelle]
K --> M[Nouvelle validation côté serveur]
L --> M
M --> N[DROP TABLE une table à la fois]
N --> O[Journal d’audit et statistiques]
Le scanner examine les fichiers PHP admissibles ainsi que les fichiers SQL de schéma ou de migration fournis avec les extensions, les mu-plugins, les drop-ins et les thèmes. Il recherche les déclarations de tables et les usages SQL opérationnels, notamment les formes courantes fondées sur $wpdb, dbDelta(), CREATE TABLE, ALTER TABLE et RENAME TABLE.
L’analyse s’exécute par petits lots AJAX reprenables plutôt que dans une requête PHP unique et prolongée. Les sites comprenant beaucoup de fichiers peuvent ainsi terminer l’analyse sans maintenir une seule requête ouverte pendant tout le parcours. Une analyse terminée reste valide après la suppression d’une table lorsque le code installé n’a pas changé et que les tables restantes appartiennent à l’ensemble déjà examiné.
Les emplacements générés ou susceptibles de produire de faux positifs sont exclus : écrans de recommandation, promotions, montées en gamme, importateurs, sauvegardes, caches, journaux, téléversements, archives et répertoires de stockage. Un adaptateur de migration ou une copie de dump SQL ne peut ainsi pas être pris à tort pour une preuve de propriété.
Dans les contextes d’administration, WP-Cron et WP-CLI, CleanMySQL observe uniquement les instructions qui modifient la structure SQL. Lorsqu’une extension crée, modifie ou renomme une table, son identité peut être enregistrée localement comme preuve directe. Les requêtes ordinaires de lecture et d’écriture sont ignorées immédiatement afin de ne pas ajouter de surcharge au site public.
Les tables inconnues peuvent être examinées sans lire le contenu de leurs lignes. CleanMySQL peut présenter les colonnes, les types de données, les index, les commentaires SQL, les clés étrangères, la collation, les options WordPress possédant un préfixe proche et une empreinte SHA-256 stable du schéma.
Ces indices aident l’administrateur à comprendre l’origine probable d’une table, mais ne la transforment jamais silencieusement en candidate à une suppression groupée.
| Composant | Minimum |
|---|---|
| WordPress | 6.5 |
| PHP | 7.4 |
| Autorisations | Administrateur sur un site simple, administrateur réseau sur Multisite |
| Base de données | Base compatible MySQL configurée pour WordPress |
CleanMySQL ne dépend ni de Composer, ni de Node.js, ni d’un service distant pendant son fonctionnement.
- Ouvrez Extensions → Ajouter une extension → Téléverser une extension dans WordPress.
- Sélectionnez l’archive ZIP de CleanMySQL et lancez l’installation.
- Activez le plugin. Sur Multisite, activez-le pour le réseau.
- Ouvrez CleanMySQL dans le menu d’administration.
- Laissez la page ouverte jusqu’à la fin de la première analyse du code installé.
unzip cleanmysql.zip
cp -R cleanmysql /chemin/vers/wordpress/wp-content/plugins/Activez ensuite le plugin depuis WordPress. Ne renommez ni le domaine de traduction ni le fichier principal du plugin dans le paquet.
- Créez une sauvegarde restaurable. Une sauvegarde n’est utile que lorsque sa procédure de restauration a été testée.
- Laissez l’analyse du code se terminer. Aucune opération destructive n’est disponible tant que la couverture du code reste incomplète.
- Examinez l’état du propriétaire et les preuves. Les propriétaires installés mais inactifs restent volontairement protégés.
- Inspectez les tables volumineuses ou inhabituelles. Les nombres de lignes InnoDB sont des estimations et les indices du schéma restent informatifs.
- Sélectionnez uniquement les tables que vous comprenez. La suppression groupée est réservée aux propriétaires absents dont toutes les tables sont attribuées de manière cohérente.
- Confirmez l’opération. CleanMySQL demande des validations explicites et une confirmation saisie au clavier.
- Consultez le journal. Il enregistre le résultat, l’identifiant de l’utilisateur, le propriétaire, les lignes estimées et la taille estimée.
Important
CleanMySQL reconstruit la table ou le groupe demandé directement sur le serveur juste avant la suppression. Les étiquettes de propriétaire ou états d’éligibilité envoyés par le navigateur ne sont jamais considérés comme une source de vérité.
Une table inconnue n’est jamais incluse dans une suppression groupée. L’écran d’inspection présente des indices dérivés du schéma et permet à l’administrateur d’enregistrer une étiquette de propriétaire privée pour faciliter ses recherches ultérieures.
Lorsqu’une table reste inconnue, CleanMySQL propose une procédure distincte limitée à cette seule table. Elle exige une analyse complète du code, une table physique portant le préfixe WordPress attendu, l’absence de preuve liée au cœur ou à un composant partagé, la confirmation d’une sauvegarde, une validation explicite du risque, la saisie exacte du nom de la table et une phrase de confirmation supplémentaire. La table est de nouveau classifiée côté serveur immédiatement avant l’exécution de DROP TABLE.
Les étiquettes manuelles améliorent l’organisation, mais ne contournent jamais le modèle de sécurité.
Les opérations destructives sont contraintes à plusieurs niveaux. CleanMySQL ne se contente pas de désactiver un bouton dans l’interface.
- Les écrans et actions d’administration nécessitent la capacité WordPress appropriée.
- Chaque requête qui modifie un état utilise un nonce WordPress.
- Les identifiants de tables sont validés selon les règles MySQL et la limite de 64 octets.
- Les groupes et tables demandés sont reconstruits depuis l’inventaire actuel de la base de données.
- Les extensions installées et les métadonnées des fichiers sources sont vérifiées de nouveau avant la suppression.
- Les vues SQL ne sont jamais transmises à la routine de suppression.
- Les tables sont supprimées une par une afin d’enregistrer séparément chaque résultat.
- Les cellules exportées en CSV sont protégées contre l’exécution de formules dans un tableur.
La capacité par défaut peut être modifiée avec le filtre cleanmysql_capability. L’accorder à un rôle moins privilégié lui donne toutefois accès à des opérations destructives sur la base de données et doit être considéré comme une décision de sécurité.
CleanMySQL conserve jusqu’à 500 entrées détaillées et enregistre séparément les statistiques cumulées de suppression. Une entrée peut comprendre l’horodatage UTC, l’identifiant utilisateur, le nom de la table, le propriétaire détecté, son état, la source de la détection, le moteur de stockage, les lignes estimées, la taille estimée des données et index, le résultat et le message d’erreur.
Le tableau d’administration peut être trié par date, table, résultat, lignes, taille, propriétaire ou utilisateur. L’export CSV utilise l’UTF-8 et neutralise les valeurs que les tableurs pourraient interpréter comme des formules.
La suppression du journal détaillé ne réinitialise pas silencieusement les compteurs cumulés. Ces statistiques disposent de leur propre action de remise à zéro.
CleanMySQL ne contient ni analyse d’audience, ni publicité, ni télémétrie, ni recherche distante de propriétaire. Les noms de bases, noms de tables, schémas, noms de fichiers et informations d’utilisation ne sont transmis ni à l’auteur du plugin ni à un autre service.
Le journal local et les attributions manuelles peuvent contenir l’identifiant WordPress d’un administrateur. CleanMySQL s’intègre aux outils WordPress d’export et d’effacement des données personnelles, anonymise les références lorsqu’un utilisateur est supprimé et fournit un texte suggéré pour le guide de politique de confidentialité de WordPress.
Sur WordPress Multisite, CleanMySQL fonctionne uniquement au niveau du réseau. Sa page est disponible dans l’administration réseau, sa capacité par défaut est manage_network_options et son état est stocké dans les options réseau.
Les tables préfixées par site sont normalisées pour la classification sans réduire la protection des tables du cœur. La désinstallation supprime uniquement les options appartenant à CleanMySQL sur le réseau. Elle ne supprime aucune table de site, d’extension, de thème ou de WordPress.
cleanmysql/
├── cleanmysql.php Amorçage principal du plugin
├── includes/
│ ├── class-cleanmysql-admin.php Interface d’administration et actions
│ ├── class-cleanmysql-attribution-registry.php
│ ├── class-cleanmysql-deletion-log.php
│ ├── class-cleanmysql-extension-inventory.php
│ ├── class-cleanmysql-option-store.php
│ ├── class-cleanmysql-schema-inspector.php
│ ├── class-cleanmysql-source-scanner.php
│ ├── class-cleanmysql-table-classifier.php
│ └── class-cleanmysql-table-repository.php
├── assets/ CSS et JavaScript d’administration
├── languages/ Fichier POT et traduction française fournie
├── readme.txt Métadonnées du répertoire WordPress.org
├── uninstall.php Nettoyage limité aux données de CleanMySQL
└── LICENSE Texte de la licence GPL-2.0-or-later
Le code utilise directement les API WordPress et ne nécessite aucun paquet compilé pour fonctionner.
Les développeurs peuvent adapter certaines parties du modèle prudent sans modifier directement les fichiers du plugin.
| Filtre | Utilité |
|---|---|
cleanmysql_capability |
Modifie la capacité nécessaire pour accéder à CleanMySQL et exécuter ses actions |
cleanmysql_table_signatures |
Ajoute ou ajuste les signatures documentées de familles de tables |
cleanmysql_source_scan_ignored_path_fragments |
Étend la liste des chemins exclus de l’analyse du code |
Une signature personnalisée doit être précise et appuyée par des preuves. Une correspondance trop large sur un préfixe peut attribuer des tables sans rapport au mauvais propriétaire et ne doit pas être utilisée uniquement pour rendre davantage de groupes supprimables.
Exemple : ajouter la signature d’une extension privée
add_filter(
'cleanmysql_table_signatures',
static function ( array $signatures ): array {
$signatures[] = array(
'pattern' => '/^acme_reports_(?:jobs|results)$/i',
'label' => 'Acme Reports',
'plugin_tokens' => array( 'acme-reports' ),
'theme_tokens' => array(),
'shared' => false,
);
return $signatures;
}
);Placez les signatures privées dans un mu-plugin ou une intégration maintenue séparément afin qu’elles restent disponibles après les mises à jour de CleanMySQL.
Le plugin distribué ne nécessite aucune étape de compilation. Les commandes suivantes couvrent les vérifications syntaxiques de base utilisées pendant le développement :
find . -name '*.php' -print0 | xargs -0 -n1 php -l
node --check assets/cleanmysql-admin-240.jsAvant de publier une version, testez également le plugin dans une installation WordPress jetable, exécutez l’extension officielle Plugin Check, vérifiez l’administration sur un site simple et sur Multisite, puis réalisez les essais de suppression uniquement sur des bases de données sans valeur de production.
Les traductions utilisent le domaine cleanmysql. La langue source du code est l’anglais, le modèle de traduction se trouve dans languages/cleanmysql.pot et le paquet distribué comprend un catalogue français.
TABLE_ROWS et SHOW TABLE STATUS peuvent renvoyer des estimations du nombre de lignes pour InnoDB. CleanMySQL évite d’exécuter un COUNT(*) sur chaque table volumineuse, car un décompte exact peut imposer une charge inutile à un site en production.
Une analyse du code peut prouver qu’un code installé référence une table. L’absence de référence ne démontre cependant pas qu’aucun script externe, processus de déploiement personnalisé ou ancien code supprimé n’en dépend encore. Une sauvegarde et une vérification par l’administrateur restent donc obligatoires.
CleanMySQL ne répare pas les tables corrompues, n’optimise pas les moteurs de stockage, ne réécrit pas les données sérialisées, ne nettoie pas les lignes à l’intérieur des tables conservées et ne remplace pas un outil complet d’administration de base de données.
Un rapport utile précise la version de CleanMySQL, la version de WordPress, la version de PHP, le mode site simple ou Multisite, l’état du scanner, la classification exacte affichée pour la table et le message d’erreur complet.
Ne publiez jamais dans une issue publique un dump de base de données de production, des identifiants, un schéma privé ou des données personnelles. Une reproduction minimale sur une installation WordPress jetable est préférable.
Un signalement lié à la sécurité ne doit pas exposer publiquement les détails d’exploitation avant que le mainteneur ait pu examiner le problème et publier une correction.
Les contributions doivent préserver le modèle de verrouillage par défaut. Une modification qui identifie davantage de tables n’est utile que si ses preuves sont suffisamment précises pour éviter d’attribuer au mauvais propriétaire un importateur, un module de recommandation, une copie de schéma ou un adaptateur de compatibilité appartenant à un autre produit.
Conservez le code source et les commentaires en anglais. Les chaînes visibles doivent rester traduisibles avec le domaine littéral cleanmysql. Les pull requests doivent expliquer les preuves de propriété utilisées pour toute nouvelle signature et fournir un cas de test reproductible lorsqu’elles modifient le classificateur ou le scanner.
Le fichier readme.txt, au format WordPress.org, contient le journal des modifications maintenu et les métadonnées de la version stable. La version 2.4.1 conserve une analyse du code terminée après une suppression réussie lorsque le code installé et l’ensemble de tables précédemment analysé restent compatibles.
CleanMySQL est un logiciel libre distribué sous la licence publique générale GNU version 2.0 ou ultérieure. Vous pouvez l’utiliser, l’étudier, le modifier et le redistribuer selon les conditions de cette licence.
CleanMySQL est un projet indépendant qui n’est ni affilié ni approuvé par Oracle Corporation ou la WordPress Foundation. MySQL est une marque d’Oracle Corporation et/ou de ses filiales. WordPress est une marque déposée de la WordPress Foundation.
Maintenu par Adrien Piron · Conçu pour les administrateurs qui préfèrent une table verrouillée à une supposition non vérifiée.